Так что у меня этот файл: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» - независимо от того, где она помещается в скрипт?
Обозначение косвенного метода - это то, почему у нас не могут быть приятные вещи :( – ikegami