簡體   English   中英

如何將數組的每個成員乘以 perl 中的標量?

[英]How do I multiply each member of array by a scalar in 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。

這是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 box 上的性能比對於mapforeach慢 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 倍。 相當可觀的改進。

在Linux系統中,其Perl安裝升級到v5.12.2略差進行:

[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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM