这是代码...
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。
这是该map
方法的测试:
#!/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";
这是该foreach
方法的测试:
#!/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, $startTime), '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 机器上的性能比率map
比foreach
. 在 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, version 12, 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
当然 map 或 loops 可以做到这一点,但语法像上面一样干净得多。
还有(列表)运算符(列表)
如果 2 的长度相同,也很有意义。
惊讶的拉里不允许这些,只是说..我想在这种情况下有(n-1)种方法可以做到这一点。
像
我的 @a = 'n' 。(1..5); 我的@a = 2 * (1..5);
甚至我的@a = 2 * @b;