Ошибки времени компиляции Perl в зависимости от процедурного порядка подпрограмм

Итак, у меня есть этот файл:

casper_mint@casper-mint-dell ~/learn_perl_hard_way $ cat bettypage
foo foo foo foo foo foo foo
boo boo boo

И хотел прочитать это и напечатать это между 2 подпрограммами.

Это продолжало выбрасывать ошибки:

#!/usr/bin/perl
use strict;
use warnings ;

sub read_file {
    my $file = shift ;
    open (FILE, $file) || die  " Couldn't open $file";
    while (my $line = <FILE>) {
          read_line $line ;
    }
}

sub read_line {
    my @list = split " ", shift ;
    foreach my $word (@list) {
            print "$word\n";
    }
}

read_file(@ARGV) ;

casper_mint@casper-mint-dell ~/learn_perl_hard_way $ ./test_hash.pl bettypage
Can't locate object method "read_line" via package "foo foo foo foo foo foo foo" (perhaps you forgot to load "foo foo foo foo foo foo foo"?) at ./test_hash.pl line 13, <FILE> line 1.
casper_mint@casper-mint-dell ~/learn_perl_hard_way $

Поэтому я поставил подпрограмму "read_line" перед "подпрограммой read_file" - поскольку это зависит от нее, с процедурной точки зрения, и она прекрасно работает.

#!/usr/bin/perl
use strict;
use warnings ;

sub read_line {
    my @list = split " ", shift ;
    foreach my $word (@list) {
            print "$word\n";
    }
}

sub read_file {
    my $file = shift ;
    open (FILE, $file) || die  " Couldn't open $file";
    while (my $line = <FILE>) {
           read_line $line ;
           }
     }

read_file(@ARGV) ;

Из работы с bash я знаю, что подпрограммы обычно должны стоять на первом месте в коде, чтобы он работал.

Тем не менее, я подумал, что Perl компилирует скрипт, а затем выполняет его. И при компиляции я не думал, что будет иметь значение, где находится подпрограмма.

Чтобы компиляция всего перед выполнением подпрограммы была, по крайней мере, доступна для чтения всей программой. Если perl компилирует весь скрипт перед его выполнением, почему порядок подпрограммы имеет значение - разве подпрограмма "read_line" не должна быть доступна подпрограмме "read_file" - независимо от того, где она находится в скрипте?

1 ответ

Если не указано иное, вы должны вызывать ваши сабвуферы с круглыми скобками, т.е. read_line($line)

От perlsub

To call subroutines:

1.  NAME(LIST);    # & is optional with parentheses.
2.  NAME LIST;     # Parentheses optional if predeclared/imported.
3.  &NAME(LIST);   # Circumvent prototypes.
4.  &NAME;         # Makes current @_ visible to called subroutine.

Но на самом деле, просто привыкните всегда использовать круглые скобки (вариант 1). Ваш код позже поблагодарит вас за лучшую читаемость и меньше сюрпризов.

Другие вопросы по тегам