9

これがコードです...

use strict;
use warnings;

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

@array= $scalar*@array;

print @array;

少しのコードで同様の機能を実行できるものが必要です。ありがとう!

4

6 に答える 6

10

foreachを使用します。

foreach my $x (@array) { $x = $x * $scalar; }
于 2011-04-15T00:13:34.067 に答える
9

これを試すことができます:

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

またはもっと簡単に:

map { $_ *= $scalar } @array;
于 2011-04-15T00:15:21.087 に答える
7

これはどう:

foreach(@array)
{ $_ *= $scalar }

ご覧のとおり、配列をトラバースするときにその場で配列を変更できます。

于 2011-04-15T00:14:08.060 に答える
5

あなたのニーズの範囲がわかりません。数値データ操作を行う場合、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]
于 2011-04-16T04:14:36.090 に答える
4

このコメントは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

mapOS 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 倍の悪化となり、あまり良くありません! アップグレードするのに必ずしもお金がかかるとは限りません。

于 2011-04-15T05:18:16.320 に答える