Я пытаюсь хранить свои журнальные сообщения в хэш в зависимости от типа сообщения, как показано ниже:Perl Global символ требует явного имени пакета
#!/usr/bin/perl
use strict;
use warnings;
my %log;
opendir (DIR, '.') or die $!;
while (my $file = readdir(DIR)) {
# some code to select TAR filename in $1
if (-e $1.'.tar') {
push(@{$log->{$1}}, $file); /* line 12 */
}
else {
$log{$1} = [];
push(@{$log->{$1}}, $file); /* line 16 */
}
Теперь этот код дает ошибку компиляции, говоря:
Global symbol "$log" requires explicit package name at at lines 12 & 16
, где я на самом деле пытаюсь использовать хэш «% log». Каким может быть возможный способ избавиться от этой ошибки? Почему именно это происходит?
Я видел некоторые объяснения в контексте, где люди ответили, что переменные были созданы в одном контексте и передавались в другом, но я чувствую, что эта переменная должна быть доступна внутри цикла while в этом фрагменте кода. Это происходит только тогда, когда я «использую строгую» и в противном случае отлично работает.
Я начал с Perl, поэтому я не полностью понял основы! Пожалуйста, помогите мне понять, почему эта переменная недоступна.
Спасибо за такой подробный ответ. Я знал об этой концепции скалярных и нескалярных переменных в декларации. Я благодарю вас за это! – i01000001
Затем для полноты: 'my% log;' объявляет хэш, 'my @log;' объявляет массив и 'my $ log'; объявляет скаляр. Это три несвязанные переменные, которые могут безопасно сосуществовать (вопросы читаемости в стороне). – ikegami
это одно отзывчивое сообщество .. никогда не видел этого нигде .. или, может быть, я искал неправильные места .. в любом случае я взял второй вариант, который вы предложили .. и принял к сведению скаляры и нескаляры! еще раз спасибо. – i01000001