Это потому, что use Module LIST;
эквивалентно BEGIN { require Module; Module->import( LIST ); }
(см. Использование perldoc -f )
В частности, require Module;
может быть реализовано с помощью следующего бита кода (из *)1008 * 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 ($@) {
$INC{$filename} = undef;
die $@;
} 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")
, что, в основном, означает «вырвать» файл и проверить его.
Lookingпри 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
return действительно является последним оператором eval
ed из файла, который действительно является последним оператором в файле.
Если такой последний оператор не является истинным значением, ## AND HERE
elsif()
, который я выделилбудет вызван, и require
умрет, так как модуль не возвращает истинное значение.use Module
также умрет, так как он делает require
за кулисами.
Короче говоря, не имеет значения, чем вы заканчиваете файл, если это понимаемое значениекак существо true
от perl.Примеры в дикой природе (CPAN) включают 1;
, хотя в наши дни некоторые файлы заканчиваются на 1
(без пропуска точки с запятой), а другие просто странно используют такие вещи, как '0 but true';
или 'supercalifragilisticexpiralidous';
, все из которых анализируютсякак «истинные» значения Perl.
Надеюсь, что вышесказанное к вашему удовлетворению;)
Счастливого взлома!