Ответ 2
Это потому, что use Module LIST;
эквивалентно BEGIN { require Module; Module->import( LIST ); }
(см. perldoc -f use)
В частности, require Module;
может быть реализован со следующим битом кода (из perldoc -f требуется):
sub require {
my ($filename) = @_;
if (exists $INC{$filename}) {
return 1 if $INC{$filename};
die "Compilation failed in require";
}
my ($realfilename,$result);
ITER: {
foreach $prefix (@INC) {
$realfilename = "$prefix/$filename";
if (-f $realfilename) {
$INC{$filename} = $realfilename;
$result = do $realfilename; ## HERE
last ITER;
}
}
die "Can't find $filename in \@INC";
}
if ([email protected]) {
$INC{$filename} = undef;
die [email protected];
} elsif (!$result) { ## AND HERE
delete $INC{$filename};
die "$filename did not return true value";
} else {
return $result;
}
}
Смотрите, что do $realfilename
? Посмотрите perldoc -f do, и вы увидите, что это эквивалент, в значительной степени, eval system("cat $realfilename")
, что в основном означает slurp the file in и eval it.
Глядя на perldoc -f eval, получается:" В обеих формах возвращаемое значение - это значение последнего оцениваемого выражения внутри мини-программы. То есть последний оператор в файле.
Стоит отметить, что если последний "оператор" является объявлением подпрограммы, это не является истинным значением:
$ perl -le'$r = eval "sub a {1}"; print $r ? "true" : "false"'
false
В то время как 1;
после этого:
$ perl -le'$r = eval "sub a {1} 1"; print $r ? "true" : "false"'
true
Глядя снова на sub require
выше, и, зная, что делают require
и do
, $result
, возвращаемый do $realfilename
, действительно является последним оператором eval
ed из файла, который действительно является последним в файле.
Если такой последний оператор не является истинным значением, выделяется ## AND HERE
elsif()
I, а require
будет умирать, поскольку модуль не вернет истинное значение.
use Module
также будет умирать, поскольку он выполняет require
за кулисами.
Короче говоря, не имеет значения, к чему вы заканчиваете файл, если это значение, которое понимается как true
perl. Образцы на дикой природе (CPAN) включают 1;
, хотя некоторые из этих дней скорее заканчивают свои файлы в 1
(без пропущенной точки с запятой), а другие просто странно используют такие вещи, как '0 but true';
или 'supercalifragilisticexpiralidous';
, все из которых разобраны как "истинные" значения Perl.
Надеюсь, что это выше вашего удовлетворения;)
Счастливый взлом!