Почему вы должны поставить 1; в конце модуля Perl 5? - PullRequest
17 голосов
/ 31 августа 2010

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

Ответы [ 2 ]

23 голосов
/ 31 августа 2010

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

source: wiki

7 голосов
/ 31 августа 2010

Это потому, что 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 $realfilenamereturn действительно является последним оператором eval ed из файла, который действительно является последним оператором в файле.

Если такой последний оператор не является истинным значением, ## AND HERE elsif(), который я выделилбудет вызван, и require умрет, так как модуль не возвращает истинное значение.use Module также умрет, так как он делает require за кулисами.

Короче говоря, не имеет значения, чем вы заканчиваете файл, если это понимаемое значениекак существо true от perl.Примеры в дикой природе (CPAN) включают 1;, хотя в наши дни некоторые файлы заканчиваются на 1 (без пропуска точки с запятой), а другие просто странно используют такие вещи, как '0 but true'; или 'supercalifragilisticexpiralidous';, все из которых анализируютсякак «истинные» значения Perl.

Надеюсь, что вышесказанное к вашему удовлетворению;)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...