2011-12-21 3 views
1

Что должен сделать следующий код Perl?

$logline{$cod}{s1} = scalar keys %{$valid{$cod}}; 

"valid" следует рассматривать как hashref, а $ cod следует рассматривать как ключ. Это правильно?

Что означает «s1» в левой руке, ключ снова?

+3

по пути, то 'scalar' совершенно излишним , Выражение уже находится в скалярном контексте. – ikegami

+0

Пожалуйста, прочитайте [perldoc perldata] (http://perldoc.perl.org/perldata.html) и [perldoc perlref] (http://perldoc.perl.org/perlref.html), и все будет намного яснее. – Ether

ответ

2

RHS

Получить значение %valid проиндексированы $cod.

$valid{$cod} 

Рассматривайте это значение, как если бы оно было hashref.

%{$valid{$cod}} 

Получить список ключей этого hashref.

keys %{$valid{$cod}} 

Узнайте, сколько ключей находится в этом списке.

scalar keys %{$valid{$cod}} 

(Это не так, как на самом деле работает, а keys вызывается в скалярном контексте возвращает число, представляющее количество элементов, он вернулся бы, если бы был в контексте списка.)


LHS

Хеш %logline индексируется $cod.

$logline{$cod} 

Что само по себе является hashref, который индексируется s1.

$logline{$cod}{s1} 

Принесите все это вместе

Значение первого сегмента сохраняется в положении, указанном втором

$logline{$cod}{s1} = scalar keys %{$valid{$cod}}; 
+0

@ikegami Я не мог придумать способ поставить его, не написав его иначе, чем оригинал. Или писать то, что было трудно писать, не говоря уже о том, чтобы читать. Возможно, я должен просто разбить его больше, даже если его придется писать по-другому. –

+0

Можете ли вы использовать 'scalar' в списке? В perldoc говорится, что при использовании в списке в скобках он возвращает только последний элемент. На массиве, да, но не в списке. – TLP

+0

Я указывал, какие «ключи» полезны в контексте списка, а также в скалярном контексте. –

2

Сохраняет количество элементов в hashref, на которое ссылается $ valid {$ cod} в LHS.

"valid" should be treated as a hashref, 

Нет, «действительно» есть имя% действительного хэша и $ действительным {} обращается к одному из значений в хэш.

$ cod - это хэш-ключ в обоих местах. «s1» также является хэш-ключом.

+0

Так что $ logline {$ cod} снова hashref, а s1 - ключ для этого хэша второго уровня? Правильно ли я понимаю? – user1109094

+0

@ user1109094 Правильно –

+0

@ user1109094, 's1' - это годовое слово, которое создает строку' s1', и да, оно используется как ключ для хэша, на который ссылается '$ logline {$ cod}'. – ikegami

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