3

如果我不这样做use strict;,以下代码可以正常工作并打印出“alice”:

assign_name();
print_name();

sub assign_name {
    $name = "alice";
}

sub print_name {
    print $name;
}

但是,当我这样做时,use strict;我知道我必须在使用它之前声明变量。我在应该使用our而不是my声明全局变量的地方阅读。所以我有以下内容:

use strict;
use warnings;

assign_name();
print_name();

sub assign_name {
    our $name = "alice";
}

sub print_name {
    print $name;   # This is line 12.

}

然后我收到以下错误:

Variable "$name" is not imported at test.pl line 12.
Global symbol "$name" requires explicit package name at test.pl line 12.
Execution of test.pl aborted due to compilation errors.

请帮忙。

4

3 回答 3

10

只需声明两个潜艇都可以看到的变量。

use strict;
use warnings;

my $name;

assign_name();
print_name();

sub assign_name {
    $name = "alice";
}

sub print_name {
    print $name;
}

(没有理由在our这里使用!)

于 2012-09-28T17:07:31.127 回答
2

我知道这超出了您的问题范围,ikegami 的回答很好地回答了它,但我认为还有更多要说的。如果您有旨在更改包范围变量的函数,那么您可能会更好地将这些变量重写为对象属性。在 Perl 中,我们可以使用Moose.

#!/usr/bin/env perl

use strict;
use warnings;

{ # proper use of scoping, h/t tchrist

  package Person;

  use Moose;
  use namespace::autoclean; # recommended

  has 'name' => ( is => 'rw', isa => 'Str', required => 1);

  __PACKAGE__->meta->make_immutable; # recommended

}

my $person = Person->new( name => 'Joel' );
$person->name( 'Adam' ); # change name

print $person->name . "\n";

在这个例子中,我们创建了一个name属性,我们可以在对象构造期间设置它,然后使用访问器方法更改或查看它。本来是全局的数据,在这种情况下是名称,然后包含在对象的内部数据中。这允许代码的不同部分重用相同的逻辑,而不必担心全局数据的状态。

于 2012-09-28T22:16:48.730 回答
1

您应该声明全局变量 upper :

use strict;
use warnings;

my $name;

assign_name();
print_name();

sub assign_name {
    $name = "alice";
}

sub print_name {
    print $name;   # This is line 12.
}
于 2012-09-28T17:04:47.197 回答