所以我有这个文件:
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”子程序可用 - 无论它放在脚本中的什么位置?
答案 0 :(得分: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)的习惯。您的代码将在以后感谢您,具有更好的可读性和更少的意外。