如何在perl中将数组的每个成员乘以标量?

问题描述

| 这是代码...
use strict;
use warnings;

my @array= (1,2,3,4,5);
my $scalar= 5;

@array= $scalar*@array;

print @array;
需要一些可以用很少的代码执行类似功能的东西。谢谢!     

解决方法

使用foreach。
foreach my $x (@array) { $x = $x * $scalar; }
    ,您可以尝试以下方法:
@array = map { $_ * $scalar } @array;
或更简单地说:
map { $_ *= $scalar } @array;
    ,这个怎么样:
foreach(@array)
{ $_ *= $scalar }
如您所见,您可以遍历数组就地对其进行修改。     ,我不知道您的需求范围。如果您正在执行数字数据操作,则Perl数据语言(PDL)会获取数字数据数组,从中创建一个“ piddle”对象,并将数学运算重载为对其向量进行“矢量化”。这是进行数值处理的非常有效的系统。无论如何,这是一个示例:
#!/usr/bin/perl

use strict;
use warnings;

use PDL;

my $pdl_array = pdl([1,1,2,3,5,8]);
print 2*$pdl_array;

__END__
gives:
[2 2 4 6 10 16]
    ,此评论适用于SoloBold。 这是对“ 6”方法的检验:
#!/usr/bin/perl                                                                                                                                                                                                          

use strict;
use warnings;
use Benchmark;

my @array = ();
push(@array,(1) x 1000000);
my $scalar = 5;

my $startTime = new Benchmark();

@array = map { $_ * $scalar } @array;

my $stopTime = new Benchmark();

print STDOUT \"runtime: \".timestr(timediff($stopTime,$startTime),\'all\').\" sec\\n\";
这是对“ 8”法的检验:
#!/usr/bin/perl                                                                                                                                                                                                          

use strict;
use warnings;
use Benchmark;

my @array = ();
push(@array,(1) x 1000000);
my $scalar = 5;

my $startTime = new Benchmark();

foreach my $x (@array) { $x = $x * $scalar; }

my $stopTime = new Benchmark();

print STDOUT \"runtime: \".timestr(timediff($stopTime,\'all\').\" sec\\n\";
这是我正在运行的系统:
bash-3.2$ perl --version
This is perl,v5.8.8 built for darwin-2level
...
bash-3.2$ uname -a
Darwin Sounder.local 10.7.0 Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386 i386
以下是一项测试的结果:
bash-3.2$ ./test.map.pl
runtime:  4 wallclock secs ( 0.41 usr  0.70 sys +  0.00 cusr  0.00 csys =  1.11 CPU) sec
bash-3.2$ ./test.foreach.pl
runtime:  0 wallclock secs ( 0.13 usr  0.00 sys +  0.00 cusr  0.00 csys =  0.13 CPU) sec
这些时间可以在同一台计算机上重现,并且在双核Linux机器上的结果可以重复:
[areynolds@fiddlehead ~]$ perl --version
This is perl,v5.8.8 built for x86_64-linux-thread-multi
...
[areynolds@fiddlehead ~]$ uname -a
Linux fiddlehead.example.com 2.6.18-194.17.1.el5 #1 SMP Mon Sep 20 07:12:06 EDT 2010 x86_64 GNU/Linux
[areynolds@fiddlehead ~]$ ./test.map.pl
runtime:  0 wallclock secs ( 0.28 usr  0.05 sys +  0.00 cusr  0.00 csys =  0.33 CPU) sec
[areynolds@fiddlehead ~]$ ./test.foreach.pl
runtime:  0 wallclock secs ( 0.09 usr  0.00 sys +  0.00 cusr  0.00 csys =  0.09 CPU) sec
在OS X上,ѭ6for与ѭ8slow的性能比要慢8.53倍。在Linux机器上,相同速度要慢3.67倍。 我的Linux机器是双核的,并且内核比单核OS X笔记本电脑快一些。 编辑 我在OS X机器上将Perl从v5.8.8更新到v5.12.3,并获得了相当大的速度提升,但是
map
的表现仍然不如
foreach
sounder:~ alexreynolds$ perl --version
This is perl 5,version 12,subversion 3 (v5.12.3) built for darwin-multi-2level
...
sounder:~ alexreynolds$ ./test.map.pl
runtime:  0 wallclock secs ( 0.45 usr  0.08 sys +  0.00 cusr  0.00 csys =  0.53 CPU) sec
sounder:~ alexreynolds$ ./test.foreach.pl
runtime:  1 wallclock secs ( 0.18 usr  0.00 sys +  0.00 cusr  0.00 csys =  0.18 CPU) sec
从原来的8.53倍恶化到2.94倍。相当可观的改进。 将Perl安装升级到v5.12.2时,Linux机器的性能稍差一些:
[areynolds@basquiat bin]$ perl --version    
This is perl 5,subversion 2 (v5.12.2) built for x86_64-linux-thread-multi
...
[areynolds@basquiat bin]$ /home/areynolds/test.map.pl
runtime:  1 wallclock secs ( 0.29 usr  0.07 sys +  0.00 cusr  0.00 csys =  0.36 CPU) sec
[areynolds@basquiat bin]$ /home/areynolds/test.foreach.pl
runtime:  0 wallclock secs ( 0.08 usr  0.00 sys +  0.00 cusr  0.00 csys =  0.08 CPU) sec
从原来的3.67倍恶化为4.5倍-不太好!升级可能并不总要付出代价,只是为了升级。     ,对我来说不幸的是,拉里不允许
$scalar *operator* (list) 
要么
(list) *operator* $scalar
当然可以使用map或loops来做到这一点,但是语法比上面更简洁。 也
 (list) *operator* (list) 
如果2的长度相等,也是有意义的。 奇怪的是,拉里(Larry)不允许这样做,只是说..我想在这种情况下,有(n-1)种方法可以做到。 喜欢
my @a = \'n\' . (1..5);
my @a = 2 * (1..5);
甚至
my @a = 2 * @b;