Легкий способ выполнения заявления много раз в Perl

55
6

Есть ли сокращенный способ, с помощью которого я могу вывести 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" );

спросил(а) 2011-03-25T01:50:00+03:00 8 лет, 8 месяцев назад
4
Решение
103

Используйте оператор x для создания нескольких копий значения.

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

ответил(а) 2011-03-25T01:51:00+03:00 8 лет, 8 месяцев назад
Еще 3 ответа
43

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

ответил(а) 2011-03-25T06:03:00+03:00 8 лет, 8 месяцев назад
44

Пожалуйста, не делайте этого:


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

который вызвал использование карты в контексте void.

ответил(а) 2011-03-25T03:46:00+03:00 8 лет, 8 месяцев назад
-4

Я собираюсь опубликовать другой подход, который будет более гибким с индексированием (вы можете использовать это, чтобы заполнить список с определенным диапазоном индексов, например):


#!/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

ответил(а) 2011-03-25T03:04:00+03:00 8 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема