在Perl中多次执行语句的简便方法

时间:2011-03-24 22:50:38

标签: arrays perl push elements

有没有一种简便方法可以将n个相同的元素推送到数组?

我可以只用一行吗?

push(@mode_z00,"lib_drx");
push(@mode_z00,"lib_drx");
push(@mode_z00,"lib_drx");
push(@mode_z00,"lib_drx");
push(@mode_z00,"lib_drx");
等等     推(@ mode_z00,5, “lib_drx”);

4 个答案:

答案 0 :(得分:10)

使用x运算符制作值的多个副本。

push(@array, ('foo') x 5);

答案 1 :(得分:1)

请不要这样做:

map( $list[$_] = "lib_drx", (0..4) );

那些在void上下文中使用map调用。

答案 2 :(得分:1)

push(@mode_z00,'lib_drx') for 1..5;

答案 3 :(得分:-2)

我将发布一种不同的方法,使用索引更加灵活(例如,您可以使用此方法填充特定索引范围的列表):

#!/usr/bin/perl                                                                                                                                            

use strict;
use warnings;
use Data::Dumper;

my @list;
map($list[$_] = "lib_drx", (0..4));
print Dumper \@list;

运行时:

$ ./mapTest.pl
$VAR1 = [
          'lib_drx',
          'lib_drx',
          'lib_drx',
          'lib_drx',
          'lib_drx'
        ];

对于非常大的人群,使用push()似乎更快,但map()允许您指定任意的开始和停止索引:

#!/usr/bin/perl                                                                                                                                            

use strict;
use warnings;
use Benchmark;

my $startTime = new Benchmark();

my $startIndex = 0;
my $stopIndex = (1000000 - 1);
my @list;
map($list[$_] = "lib_drx", ($startIndex..$stopIndex));

my $stopTime = new Benchmark();

print STDOUT "runtime: ".timestr(timediff($stopTime, $startTime), 'all')." sec\n";

对于一百万次添加,这是map()方法的运行时:

runtime:  1 wallclock secs ( 0.36 usr  0.10 sys +  0.00 cusr  0.00 csys =  0.46 CPU) sec

对于push()方法:

#!/usr/bin/perl                                                                                                                                            

use strict;
use warnings;
use Benchmark;

my $startTime = new Benchmark();

my $count = 1000000;
my @list;
push(@list, ('lib_drx') x $count);

my $stopTime = new Benchmark();

print STDOUT "runtime: ".timestr(timediff($stopTime, $startTime), 'all')." sec\n";

push()的运行时间略小于map()运行时的一半:

runtime:  1 wallclock secs ( 0.18 usr  0.07 sys +  0.00 cusr  0.00 csys =  0.25 CPU) sec