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

neb*_*lus 9 arrays perl scalar

这是代码......

use strict;
use warnings;

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

@array= $scalar*@array;

print @array;
Run Code Online (Sandbox Code Playgroud)

需要能够用很少的代码执行类似功能的东西.谢谢!

RC.*_*RC. 10

使用foreach.

foreach my $x (@array) { $x = $x * $scalar; }
Run Code Online (Sandbox Code Playgroud)


Ted*_*opp 9

你可以试试这个:

@array = map { $_ * $scalar } @array;
Run Code Online (Sandbox Code Playgroud)

或更简单地说:

map { $_ *= $scalar } @array;
Run Code Online (Sandbox Code Playgroud)

  • 您不应该在地图块中修改$ _ (3认同)

jwd*_*jwd 7

这个怎么样:

foreach(@array)
{ $_ *= $scalar }
Run Code Online (Sandbox Code Playgroud)

如您所见,您可以在遍历时就地修改数组.

  • 如果你要依赖隐含的$ _,你可以为@array做$ _*= $ scalar (5认同)

Ale*_*lds 5

此评论适用于 SoloBold。

\n\n

下面是对该方法的测试map

\n\n
#!/usr/bin/perl                                                                                                                                                                                                          \n\nuse strict;\nuse warnings;\nuse Benchmark;\n\nmy @array = ();\npush(@array, (1) x 1000000);\nmy $scalar = 5;\n\nmy $startTime = new Benchmark();\n\n@array = map { $_ * $scalar } @array;\n\nmy $stopTime = new Benchmark();\n\nprint STDOUT "runtime: ".timestr(timediff($stopTime, $startTime), \'all\')." sec\\n";\n
Run Code Online (Sandbox Code Playgroud)\n\n

下面是对该方法的测试foreach

\n\n
#!/usr/bin/perl                                                                                                                                                                                                          \n\nuse strict;\nuse warnings;\nuse Benchmark;\n\nmy @array = ();\npush(@array, (1) x 1000000);\nmy $scalar = 5;\n\nmy $startTime = new Benchmark();\n\nforeach my $x (@array) { $x = $x * $scalar; }\n\nmy $stopTime = new Benchmark();\n\nprint STDOUT "runtime: ".timestr(timediff($stopTime, $startTime), \'all\')." sec\\n";\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我正在运行的系统:

\n\n
bash-3.2$ perl --version\nThis is perl, v5.8.8 built for darwin-2level\n...\nbash-3.2$ uname -a\nDarwin 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

以下是一项测试的结果:

\n\n
bash-3.2$ ./test.map.pl\nruntime:  4 wallclock secs ( 0.41 usr  0.70 sys +  0.00 cusr  0.00 csys =  1.11 CPU) sec\nbash-3.2$ ./test.foreach.pl\nruntime:  0 wallclock secs ( 0.13 usr  0.00 sys +  0.00 cusr  0.00 csys =  0.13 CPU) sec\n
Run Code Online (Sandbox Code Playgroud)\n\n

这些时间在同一台机器上相当可重复,并且结果在双核 Linux 机器上也有一定的可重复性:

\n\n
[areynolds@fiddlehead ~]$ perl --version\nThis is perl, v5.8.8 built for x86_64-linux-thread-multi\n...\n[areynolds@fiddlehead ~]$ uname -a\nLinux fiddlehead.example.com 2.6.18-194.17.1.el5 #1 SMP Mon Sep 20 07:12:06 EDT 2010 x86_64 GNU/Linux\n[areynolds@fiddlehead ~]$ ./test.map.pl\nruntime:  0 wallclock secs ( 0.28 usr  0.05 sys +  0.00 cusr  0.00 csys =  0.33 CPU) sec\n[areynolds@fiddlehead ~]$ ./test.foreach.pl\nruntime:  0 wallclock secs ( 0.09 usr  0.00 sys +  0.00 cusr  0.00 csys =  0.09 CPU) sec\n
Run Code Online (Sandbox Code Playgroud)\n\n

OS X 机器上的性能比比 慢 8.53mapforeach。在 Linux 机器上,速度慢 3.67 倍。

\n\n

我的 Linux 机器是双核的,其内核比我的单核 OS X 笔记本电脑稍快。

\n\n

编辑

\n\n

我在我的 OS X 机器上将 Perl 从 v5.8.8 更新到 v5.12.3,并获得了相当大的速度提升,但map性能仍然比foreach

\n\n
sounder:~ alexreynolds$ perl --version\nThis is perl 5, version 12, subversion 3 (v5.12.3) built for darwin-multi-2level\n...\nsounder:~ alexreynolds$ ./test.map.pl\nruntime:  0 wallclock secs ( 0.45 usr  0.08 sys +  0.00 cusr  0.00 csys =  0.53 CPU) sec\nsounder:~ alexreynolds$ ./test.foreach.pl\nruntime:  1 wallclock secs ( 0.18 usr  0.00 sys +  0.00 cusr  0.00 csys =  0.18 CPU) sec\n
Run Code Online (Sandbox Code Playgroud)\n\n

这从 8.53 倍变差到 2.94 倍。相当实质性的改进。

\n\n

将 Perl 安装升级到 v5.12.2 后,Linux 机器的性能稍差

\n\n
[areynolds@basquiat bin]$ perl --version    \nThis is perl 5, version 12, subversion 2 (v5.12.2) built for x86_64-linux-thread-multi\n...\n[areynolds@basquiat bin]$ /home/areynolds/test.map.pl\nruntime:  1 wallclock secs ( 0.29 usr  0.07 sys +  0.00 cusr  0.00 csys =  0.36 CPU) sec\n[areynolds@basquiat bin]$ /home/areynolds/test.foreach.pl\nruntime:  0 wallclock secs ( 0.08 usr  0.00 sys +  0.00 cusr  0.00 csys =  0.08 CPU) sec\n
Run Code Online (Sandbox Code Playgroud)\n\n

这从 3.67 倍差到 4.5 倍差 \xe2\x80\x94 不太好!只是为了升级而升级可能并不总是值得的。

\n


Joe*_*ger 5

我不知道你需要的范围.IFF你正在进行数值数据处理,Perl数据语言(PDL)采用数值数据数组,从中创建一个"小提琴"对象,并重载数学运算以"向量化"它们的操作.这是一个非常有效的数字处理系统.无论如何这里是一个例子:

#!/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]
Run Code Online (Sandbox Code Playgroud)