Итак, у меня есть этот файл:
casper_mint@casper-mint-dell ~/learn_perl_hard_way $ cat bettypage
foo foo foo foo foo foo foo
boo boo boo
И хотел прочитать это и распечатать между двумя подпрограммами.
Это продолжало выдавать ошибки:
#!/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» - независимо от того, где она находится в сценарии?