2014-01-11 3 views
0
my %order; 
while (my $rec = $data->fetchrow_hashref) { 
    push @{ $result{ $rec->{"ID"} } }, $rec->{"item"}; 
    push @order, $rec->{ID}; 
} 

я получаю глобальный символ «@order» требует явного имени пакета в строке push @order, $rec->{ID};переменные «требует явного пакета» вопрос имени

+0

На этот вопрос можно ответить, выполнив поиск. Например: http://stackoverflow.com/q/3141412/725418 – TLP

ответ

5

Сигареты Perl идентифицируют разные типы данных. И два идентичных идентификатора - это разные переменные целиком, если они имеют разные сигилы.

my $var; # This is a scalar. 
my @var; # This is an array. 
my %var; # This is a hash. 

Каждый из этих трех - это совершенно разные переменные.

Сообщение об ошибке, которое вы получаете, связано с тем, что в строке один из кода, который вы отправили, вы объявляете хеш с именем %order, а на четвертой строке кода, который вы отправили, вы нажимаете на массив с именем @order. Этот массив никогда не был объявлен. Без явного объявления, указывающего обратное, Perl будет принимать первый раз, когда видит переменную, которая предназначена для глобального пакета. И поскольку вы используете strict 'vars' или strict (где vars неявно), Perl не позволяет автоматически создавать глобальный пакет или любой другой тип переменных без предварительного объявления его, если вы полностью не квалифицируете его имя.

Такое поведение объясняется в perldoc strict, где говорится:

Это приводит к ошибке времени компиляции, если доступ к переменной, которая была ни явно не объявлен (с использованием любого из моего, нашего, государства, или используйте vars ) и не имеют полной квалификации.

Поскольку четкое намерение в своем коде, чтобы push значений в массив, вполне вероятно, что самое простое исправление изменить первую строку из my %order; в my @order;, так что вы объявить массив, а не хэш ,

Непонятно, не видя больше кода, чтобы знать, что делать с линией, в которой вы нажимаете на массив по ссылке. Предположительно, вы уже знаете, что часть кода правильная.

+2

$ calar, @rray,% ash – toolic

3

Вы объявляете хэш%order, но попробуйте использовать массив@order ,

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