Подтвердить что ты не робот

Почему вы должны поставить 1; в конце модуля Perl 5?

Почему все модули Perl 5 должны заканчиваться на 1;?

4b9b3361

Ответ 1

Модуль Perl должен заканчиваться истинным значением, иначе он считается не  загружены. По соглашению это значение обычно равно 1, хотя это может быть  любое истинное значение. Модуль может заканчиваться ложным, указывая на сбой, но  это редко используется, и вместо этого он умирает() (выходите с ошибкой).

источник: wiki

Ответ 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.

Надеюсь, что это выше вашего удовлетворения;)

Счастливый взлом!