Perl编译时错误取决于子例程的过程顺序

时间:2016-02-18 06:47:43

标签: perl subroutine

所以我有这个文件:

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 个答案:

答案 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)的习惯。您的代码将在以后感谢您,具有更好的可读性和更少的意外。