Perl Hash Slice, Replication x Operator и подпараметры - PullRequest
2 голосов
/ 04 июня 2010

Хорошо, я понимаю срезы хэша Perl и оператор "x" в Perl, но кто-то может объяснить следующий пример кода из здесь (слегка упрощенно)?

sub test{
    my %hash;
    @hash{@_} = (undef) x @_;
}

Пример вызова к югу:

test('one', 'two', 'three');

Эта строка меня бросает:

@hash{@_} = (undef) x @_;

Он создает хеш, в котором ключами являются параметры для подпрограммы, и инициализируется значением undef, поэтому:

% Хэш:

'one' => undef, 'two' => undef, 'three' => undef

Значение оператора x должно быть числом; как получается, что @_ интерпретируется как длина массива параметров сабвуфера? Я ожидаю, что вы по крайней мере должны сделать это:

@hash{@_} = (undef) x scalar @_;

Ответы [ 2 ]

10 голосов
/ 04 июня 2010

Чтобы понять этот код, вам нужно понять три вещи:

Оператор повторения. Оператор x является оператором повторения . В контексте списка, если левый аргумент оператора заключен в скобки, он будет повторять элементы в списке:

my @x = ('foo') x 3;  # ('foo', 'foo', 'foo')

Массивы в скалярном контексте. Когда массив используется в скалярном контексте, он возвращает свой размер. Оператор x налагает скалярный контекст на свой правый аргумент.

my @y = (7,8,9);
my $n = 10 * @y; # $n is 30

Хеш-фрагменты. Синтаксис хеш-фрагмента обеспечивает способ одновременного доступа к нескольким хеш-элементам. Срез хеша может извлекать значения хеша или может быть назначен. В данном случае мы присваиваем срез хеша.

# Right side creates a list of repeated undef values -- the size of @_.
# We assign that list to a set of hash keys -- also provided by @_.
@hash{@_} = (undef) x @_;

Менее неясные способы сделать то же самое:

@hash{@_} = ();
$hash{$_} = undef for @_;
0 голосов
/ 04 июня 2010

В скалярном контексте массив оценивается по длине. От perldoc perldata:

Если вы оцениваете массив в скалярном контексте, он возвращает длину массива. (Обратите внимание, что это не относится к спискам, которые возвращают последнее значение, такое как оператор запятой C, или к встроенным функциям, которые возвращают все, что они хотят вернуть.)

Хотя я не могу найти больше информации об этом в настоящее время, похоже, что оператор репликации оценивает свой второй аргумент в скалярном контексте, заставляя массив вычислять его длину.

...