これがコードです...
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 ) は数値データの配列を受け取り、そこから「ピドル」オブジェクトを作成し、数学演算をオーバーロードして演算を「ベクトル化」します。これは、数値処理を行うための非常に効率的なシステムです。とにかくここに例があります:
#!/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
map
OS X ボックスでのパフォーマンスの比率は、に対して8.53x 遅いです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 倍の悪化となり、あまり良くありません! アップグレードするのに必ずしもお金がかかるとは限りません。