Perl, проходящий через хеш, выдает странное значение - PullRequest
3 голосов
/ 12 декабря 2010

Я использую Perl для разбора вывода из objdump.У меня есть следующий код:

#!/usr/bin/perl

%count = {};

while (<>) {
 if (/^\s+[[:xdigit:]]+:\s+[[:xdigit:]]+\s+([a-z]+).+$/) {
  ++$count{"$1"};
 }
}

while (($key, $val) = each %count) {
 print "$key $val\n";
}

В полученном выводе большинство частей в порядке, как это:

strhib 2
strcc 167
stmlsda 4
swivc 21
ldmlsia 4

Но есть одна странная строка:

HASH(0x8ae2158) 

Что здесь происходит?Я ожидаю, что $1 будет строкой, а ++$count{"$1"} должно быть прекрасно.

Спасибо.

Итак, правильный код должен быть:

#!/usr/bin/perl

use strict;

my %count;

while (<>) {
 if (/^\s+[[:xdigit:]]+:\s+[[:xdigit:]]+\s+([a-z]+).+$/) {
  ++$count{"$1"};
 }
}

while (my ($key, $val) = each %count) {
 print "$key $val\n";
}

1 Ответ

8 голосов
/ 12 декабря 2010

Если бы у вас было use warnings;, вы бы увидели: «Ссылка найдена там, где ожидается список четных размеров».Вместо

%count = {};

вы должны были сказать

my %count;

То, что вы написали, было эквивалентно следующему:

%count = ({} => undef);

То есть вы инициализировали свой хэшпустой хэш-ключ в качестве ключа без ассоциированного значения.Хэш-ссылка преобразуется в «HASH (0x8ae2158)» (число может измениться).Чтобы очистить хеш, вы используете паренс (), а не фигурные скобки {}.Скобки создают ссылку на хеш.

Даже такие короткие программы, как эта, должны начинаться с:

use strict;
use warnings;

Ваши ошибки будут вашими собственными.: -)

Прагма предупреждений предпочтительнее, чем переключатель -w, поскольку он действует лексически.См. Что не так с -w и $^W в perllexwarn .

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