Разъяснение по хешу ++ - PullRequest
4 голосов
/ 27 июня 2011

Я читаю "Perl Best Practices" Дамиана Конвея и обнаружил следующий фрагмент кода:

$have_reconsidered{lc($name)}++;

Я пытаюсь выяснить, что здесь происходит с помощью хэша. Я знаю, что ++ увеличивается на единицу в числовом контексте, но что это делает с хешем?

Из документации perlop :

undef всегда считается числовым, и, в частности, изменяется на 0 перед увеличением (так что постинкремент значения undef будет верните 0, а не undef). оператор автоматического декремента не волшебно.

Таким образом, в приведенном выше примере значение для ключа lc($name) инициализируется равным 0, а затем увеличивается до 1 на ++?

В общем, где я могу узнать больше о поведении ++, += и т. Д ...?

Ответы [ 3 ]

4 голосов
/ 27 июня 2011

%have_reconsidered ваш хэш. $name это строка. lc($name) возвращает строчную строку. $hash{$key} вернет скалярное значение из хеша %hash, хранящегося с ключом $key. так:

// get scalar value from hash at key lc($name) and post-increment it
$have_reconsidered(lc($name)}++;

Итак, все, что вы делаете, это увеличиваете значение в хэше по заданному индексу (а именно lc($name))

контрольный пример:

#!/bin/env perl
my %hash = ( 'a' => '2' );
my $name = 'A';
print $hash{lc($name)}++; // prints 2 (incremented after statement)
print $hash{lc($name)};   // prints 3
print ++$hash{lc($name)}; // prints 4 (incremented before statement)
2 голосов
/ 27 июня 2011

Значения хеша являются скалярами, поэтому $have_reconsidered{lc($name)}++; увеличивает скаляр $have_reconsidered{lc($name)}. Если этот скаляр ранее не был определен или не существовал, ++ установит для него значение 1.

Целью этого кода, вероятно, является удаление дубликатов.

>perl -E"++$seen{$_} for qw( a a a b c a d ); say keys %seen;"
cabd

Я предпочитаю похожий, но другой подход, потому что он сохраняет порядок.

>perl -E"say grep !$seen{$_}++, qw( a a a b c a d );"
abcd
0 голосов
/ 27 июня 2011

$ have_reconsidered {lc ($ name)} - это значение хеша% have_reconsidered, который принадлежит ключу lc ($ name). Это значение может определенно быть числовым, но даже если оно является строкой, оно все равно может быть автоматически увеличено (см. http://perldoc.perl.org/perlop.html#Auto-increment-and-Auto-decrement).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...