Поведение my
документировано в perlsub
- это сводится к этому - perl
знает $string
находится в области видимости - потому что my
говорит это так.
МОЯ оператор объявляет перечисленные переменные, которые будут лексический ограничен блоком ограждающего, условная (если/если/ELSIF/другое), петли (для/Еогеаспа /, а/до/продолжить), подпрограмма, Eval, или do/require/use'd.
Это означает, что он «находится в области видимости» от точки, в которой он «виден» до закрывающей скобки текущего «блока». (Или в вашем примере - конец кода)
Однако - в вашем примере my
также присваивает значение.
Этот процесс определения области видимости происходит во время компиляции - где perl проверяет, где это действительно для использования $string
или нет. (Спасибо strict
). Однако - он не может знать, что такое значение, потому что это может измениться во время выполнения кода. (И нетривиальна для анализа)
Так что, если вы это сделаете, это может быть немного понятнее, что происходит:
#!/usr/bin/env perl
use strict;
use warnings;
my $string; #undefined
func();
$string = 'string';
func();
sub func {
print $string, "\n";
}
$string
находится в области видимости, в обоих случаях - потому что my
произошло во время компиляции - перед вызовом подпрограммы - но оно не имеет значения, установленного за пределами значения по умолчанию undef
перед первым вызовом.
Примечание это контрастирует с:
#!/usr/bin/env perl
use strict;
use warnings;
sub func {
print $string, "\n";
}
my $string; #undefined
func();
$string = 'string';
func();
Какие ошибки, потому что, когда к югу объявляется, $string
не в области.
* Always * 'use strict; использовать предупреждения; '! – Biffen
О, я на самом деле имею эти прагмы в своем тестовом файле. Я отредактирую его. Спасибо. – darkgrin