Perl-хеш-ключ печатается только тогда, когда сразу следует новая строка - PullRequest
1 голос
/ 17 февраля 2012

Может быть, я идиот, но это не имеет смысла для меня ... У меня есть хэш, созданный из чтения уникальных кодов и кодов ошибок из многочисленных файлов.Когда я пытаюсь распечатать пары ключ = значение, ключи не появляются, если сразу за ними не следует новая строка.

Вот код:

foreach my $key (keys %codehash){
    print "Key: $key\tValue: $codehash{$key}\n";
    print "Key: $key\n";
    print "Value: $codehash{$key}\n";
    print "\n\n";
}

Вот вывод:

         Value: NoParamSpecified
    Key: 016C
    Value: NoParamSpecified


        Value: billingAddress.firstName.lengthLong
    Key: 003M
    Value: billingAddress.firstName.lengthLong


         Value: billingAddress.address1.lengthLong
    Key: 0041
    Value: billingAddress.address1.lengthLong

Обратите внимание, что он даже не печатает простой текст "Key:" из первого оператора, только вкладку и не только.Я никогда не сталкивался с этим раньше.

Ответы [ 3 ]

7 голосов
/ 17 февраля 2012

Поведение соответствует всем ключам, содержащим "\r" в конце.Шестнадцатеричный дамп подтвердит это.

Еще один способ подтвердить это - выполнить подходящую подстановку регулярных выражений для ключей перед распечаткой:

$key =~ s/\s+$//;
3 голосов
/ 17 февраля 2012

Держу пари, что, поскольку вы читаете в данных, что где-то данные содержат символы форматирования, и вы включаете их в ключевые данные (что плохо, если символы форматирования делают что-то типа начало строки "и т. д.).

Чтобы обойти это, попробуйте напечатать ключ в base64 или hex, и я уверен, что вы увидите, что это намного более длинная строка, чем вы думали.

use MIME::Base64;
# ...
print "Key: " . encode_base64($key) . "\tValue: $codehash{$key}\n";
0 голосов
/ 17 февраля 2012

Это часть терминального ввода / вывода.Он печатает только в конце строки.Установите выходной автозапуск, чтобы он печатался после каждого оператора печати:

foreach my $key (keys %codehash){
    local $| = 1;
    print "Key: $key\tValue: $codehash{$key}\n";
    print "Key: $key\n";
    print "Value: $codehash{$key}\n";
    print "\n\n";
}

См. perldoc perlvar и найдите /OUTPUT_AUTOFLUSH/.

.
...