2016-02-18 2 views
1

Так что у меня этот файл:Perl ошибки компиляции времени в зависимости от процедурного порядка подпрограммами

[email protected] ~/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) ; 

[email protected] ~/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. 
[email protected] ~/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» - независимо от того, где она помещается в скрипт?

+0

Обозначение косвенного метода - это то, почему у нас не могут быть приятные вещи :( – ikegami

ответ

4

Если не указано, вам нужно называть свои субсети скобки, т.е. 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). Позднее ваш код будет благодарен вам за лучшую читаемость и меньше сюрпризов.

+0

скобки = единственные, круглые скобки = множественное число –

 Смежные вопросы

  • Нет связанных вопросов^_^