2013-12-22 2 views
2

Каждый простой код Perl, но я его не понимаю.Perl print% hash - нужна помощь, чтобы понять это

Здесь мы идем

#!/usr/bin/env perl 
use warnings; 
use strict; 
my %hash; 
$hash{"key"} = "value"; 
$hash{"key2"} = "value2"; 
$hash{"key3"} = "value3"; 
print %hash."\n"; 

И результат 3/8, удалите один Кеп => пару значений, результат 2/8

Если я удалил ."\n" то результат, как ожидается, key3value3key2value2keyvalue1

Нет причина для этого, заметила это случайно, просто попытайтесь понять, что происходит.

+3

В случае, если вы уже не знаете, данные: : Дампер полезен, когда вам нужно сбрасывать структуры данных, т. Е. Использовать Data: Dumper; print Dumper \% hash; '. – Chris

+1

Хотелось бы, чтобы я мог поддержать комментарии. Дампер, фт. – chooban

ответ

7

Когда вы добавляете «\ n» к хешу, вы вынуждаете хэш интерполировать в скалярном контексте, что заставляет его распечатывать текущую емкость и размер. Когда вы удаляете его, хэш интерполируется в контексте списка, и он выводит свои текущие пары ключ/значение.

+1

, что было быстро и спасибо. –

+4

Обратите внимание, что это не «\ n» в частности; он дает хэш в качестве операнда оператора '.', который дает ему скалярный контекст. – ysth

+0

Как указывал ysth, это конкатенация, которая вызывает проблему (спасибо, что указали это). Вероятно, лучше предоставить несколько аргументов функции печати в качестве противопоставления одной конкатенированной строке, то есть «print% hash», «\ n»; », которая приведет к ожидаемому результату. – Chris

3

В то время как Марк полностью охватывает то, что здесь происходит, вы можете получить ожидаемый результат, не заставляя хеш в скалярном контексте использовать «say% hash;» в версиях perl от 5 октября или около того.

Вам нужно use feature 'say'; так же, как вы бы use warnings; (или работать под PERL -E, который включается на несколько «новых» функций)

Смежные вопросы