2017-02-10 6 views
0

Попытка понять пакеты, local, my и ссылки в perl. Рассмотрим следующий сценарий ...Что такое perl, эквивалентный переменной размера файла C, и как использовать его в суб?

package z; 
$x = 5; 

sub q() { return $z::x }; 

printf "q() .. %d\n", q(); 

my $xr = \$x; 

my $x = 7; 

printf "xr .. %d\n",$$xr; 

$$xr = 9; 

printf "x .. %d\n", $x; 

$$xr = 11; 

printf "q() .. %d\n", q(); 

Я ожидаю, что каждый из призываний q(), чтобы вернуть номер, но я не уверен, что они должны вернуться. Вместо этого я получаю следующий выход ...

q() .. 0 
Argument "" isn't numeric in printf at src/demo/multi_my.pl line 8. 
xr .. 5 
x .. 7 
q() .. 0 
Argument "" isn't numeric in printf at src/demo/multi_my.pl line 22. 
+3

'q()' это еще один способ записи '' ''. Используйте другое имя. – ikegami

+3

И не используйте [prototypes] (http://perldoc.perl.org/perlsub.html#Prototypes), если вы не знаете, для чего они нужны, и у них есть веские основания для их использования. 'sub foo() {}' должно быть 'sub foo {}'. – ThisSuitIsBlackNot

+2

Вы должны добавить 'use strict' и' использовать предупреждения 'all'' в верхней части своей программы, чтобы получить реалистичное представление о поведении Perl, поскольку вы будете добавлять их в каждую другую написанную вами программу. – Borodin

ответ

4

q() еще один способ написания ''. Вот почему q() возвращает пустую строку. Используйте другое имя для своего юнита.


my объявляет лексический контекстные переменный. Они обычно создаются завитушками, но файл также является лексической областью. Поэтому, если вам нужна переменная, привязанная к файлу, используйте my $x; за пределами любых завитушек.


Первый $x вам доступ глобально в области видимости; это видно как $z::x на протяжении всей программы.