3

そうしないuse strict;と、次のコードが正常に機能し、「アリス」が出力されます。

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

これはあなたの質問の範囲を超えていることを私は知っています.池上の答えはうまく答えていますが、まだ言うべきことがあると思います. パッケージスコープの変数を変更することを意図した関数がある場合、それらの変数をオブジェクト属性としてより適切に書き換えることができます。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 に答える