为什么不会出现“学习Perl第6版”的第4章示例?

时间:2011-09-16 08:52:52

标签: perl

我被困在Learning Perl第6版的第4章练习4第78页。我从第301页复制了问题的代码示例。我在Ubuntu 11.04上使用Perl版本5.10.1。我得到的错误,我无法弄清楚有人可以帮忙吗?我将列出下面的代码和错误消息。

#!/usr/bin/perl -w
use strict;

greet( 'Fred' );
greet( 'Barney' );

sub greet {
  state $last_person;

  my $name = shift;

  print "Hi $name! ";

  if( defined $last_person ) {
      print "$last_person is also here!\n";
 }
  else {
      print "You are the first one here!\n";
}
  $last_person = $name;
}


Global symbol "$last_person" requires explicit package name at ./ex4-4 line 8.
Global symbol "$last_person" requires explicit package name at ./ex4-4 line 14.
Global symbol "$last_person" requires explicit package name at ./ex4-4 line 15.
Global symbol "$last_person" requires explicit package name at ./ex4-4 line 20.
Execution of ./ex4-4 aborted due to compilation errors.

3 个答案:

答案 0 :(得分:9)

您需要在脚本顶部说use feature 'state'以启用state个变量。请参阅perldoc -f state

答案 1 :(得分:6)

来自manual

  

从perl 5.9.4开始,您可以使用状态声明变量   关键字代替我的。但是,要做到这一点,你必须拥有   通过使用功能编译指示预先启用该功能,   或者在单行上使用-E。 (见专题)

答案 2 :(得分:1)

feature方法是使用闭包:

{
    my $last_person;

    sub greet {

        my $name = shift;

        print "Hi $name! ",
          defined $last_person ? "$last_person is also here!"
                               : "You are the first one here!",
          "\n";

        $last_person = $name;
    }
}

漂亮的say功能在此示例中也很有用。