2015-03-18 3 views
0

Я не уверен, что ниже делает именно на:Perl скалярная и JSON

скалярной% {$} единиц

в ниже:

if (defined($units) && scalar %{ $units}) { 

Скрипт запускает большую часть записей, но появляется, когда он доходит до конца, и возникает эта ошибка.

hash- или ссылку на массив ожидаемой (не простой скаляр, используйте allow_nonref для позволяют это) в /usr/share/perl5/JSON.pm линии 154.

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

скалярной% {$} единиц

Чтобы правильно диагностировать происходящее на данном этапе.

Казалось бы, это массив хэшей, и мы проверяем, есть ли у него что-нибудь в нем?

Комментарий выше этой линии говорит:

# We only want to move on if there were units for this timeframe 
+1

Эта строка будет лучше написана как 'if ('HASH' eq ref $ units && scalar keys% $ units) {...', потому что кажется, что нужно проверить, что '$ units' содержит hashref, и что хэш, к которому он относится, содержит элементы. – DavidO

+0

@DavidO: Я не вижу причин предполагать, что код пытается проверить, что он содержит hashref; смотрит на меня так же, как предполагает, что это hashref (и OP не указывает на то, что там будет ошибка, которая произошла бы, если бы это было плохое предположение) – ysth

+0

Вот почему вы всегда должны «использовать strict;». Если '$ units' не является хеш-ссылкой, вы получите ошибку компиляции, например' Can not use string ("foo") как HASH ref, в то время как «строгие refs» используются в строке prog.pl 10. «со строгими включен. – ThisSuitIsBlackNot

ответ

2

Код проверки, чтобы увидеть, если $ единиц определяется, и если он есть, если предположить, что это hashref и тестирование, чтобы увидеть, если хэш не- пустой.

scalar здесь не имеет никакого эффекта, так как, если контекст дает скаляр & & операции и & & передает этот контекст на левый операнд, поэтому %{$units} будет иметь скалярный контекст в любом случае. Хэш в скалярном контексте создает ложное значение, если хэш пуст и истинное значение (строка, описывающая использование ковша, но обычно не имеет значения, что это такое, за исключением того, что она истинна), если она не пуста.

+0

Это действительно то, что я искал и понимал, но я не мог найти причину для скаляра.Есть ли вероятность, что этот тест, чтобы увидеть, является ли он пустым, пропустит какое-то условие, так как по ошибке возникнет ошибка, когда ref пуст и подействует, что вызывает проблему с json-кодировкой, которая позже вызывается в блоке. –

+0

Обычно вы можете использовать нечто вроде 'scalar @ array', чтобы получить количество элементов массива. Я подозреваю, что это происходит по тому же (но неправильному) мыслительному процессу. – Sobrique

+0

@ Kirs Kringle, Многие люди любят использовать «скаляр», где он не нужен. Даже когда они знают, что это не нужно. У них, вероятно, есть проблемы с пониманием того факта, что массив или хэш могут оценивать скаляр. – ikegami

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