有没有一种简便方法可以将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”);
答案 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