Объяснение «глобальный символ требует явного имени пакета» - PullRequest
3 голосов
/ 29 августа 2010

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

#!/usr/bin/perl -w

use strict;

sub croak { die "$0: @_: $!\n"; }


sub output {
  my %chains = shift;
  my @keys = keys %chains;

  my $index = rand($keys);
  my $key = $keys[$index];

  my $out_buf = $key;
  for (my $i = 0; $i < 100; ++$i) {
    my $aref = $chains{$key};
    my $word = @$aref[rand($aref)];
    $out_buf .= " $word";

    $key =~ s/.+ //;
    $key .= " $word";
  }
  print $out_buf, "\n";
}


sub get_chains {
  my %chains;
  my @prefixes

  while (my $line = <FILE>) {
    my @words = split " ", $line;

    foreach my $word (@words) {
      if ($prefixes == 2) {
    my $key = join " ", @prefixes;

    my $arr_ref = $chains{$key};
    push(@$arr_ref, $word);

    shift @prefixes;
      }
      push(@prefixes, $word);
    }
  }

  return %chains;
}



sub load_book {
  my $path_name = shift @ARGV; 
  open(FILE, $path_name) || croak "File not found.\n"; 
}

load_book;
my %chains = get_chains;
output %chains;

----ERRORS----

"my" variable $line masks earlier declaration in same statement at markov.pl line 33.
"my" variable $path_name masks earlier declaration in same scope at markov.pl line 55.
Global symbol "$keys" requires explicit package name at markov.pl line 12.
syntax error at markov.pl line 32, near ") {"
Global symbol "$prefixes" requires explicit package name at markov.pl line 36.
Global symbol "%chains" requires explicit package name at markov.pl line 48.
syntax error at markov.pl line 49, near "}"
syntax error at markov.pl line 56, near "}"
Execution of markov.pl aborted due to compilation errors.

Какую ошибку я делаю?

1 Ответ

15 голосов
/ 29 августа 2010

В вашем скрипте три синтаксических ошибки:

Глобальному символу $ keys требуется явное имя пакета в строке 12 markov.pl.

Вы не объявили $ keys, и из-за «use strict» это фатальная ошибка. Вы, вероятно, имели в виду:

my $index = rand(@keys);

Вторая ошибка:

Глобальному символу "$ prefixes" требуется явное имя пакета в строке 36 markov.pl.

это то же самое: вы имели в виду:

if (@prefixes == 2) {

Наконец, в строке 30 вы пропускаете точку с запятой после:

my @prefixes

Это сбивает с толку синтаксический анализатор и вызывает все другие ошибки и предупреждения.

Возможно, вы захотите прочитать документацию perldata , если не знаете, как использовать сигилы ($, @,%).

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