1

別のファイルで定義されているハッシュの要素を印刷するにはどうすればよいですか?

file1.pl:

#!/usr/bin/perl
use strict;
use warnings;
our %hash = 
("Quarter" , 25,
 "Dime"    , 10,
 "Nickel"  , 5 );

file2.pl:

#!/usr/bin/perl
use strict;
use warnings;
require "file1.pl"
foreach (sort keys %hash){
print "$hash{$_}\n";
}

出力:

Global symbol "%hash" requires explicit package name.
Global symbol "%hash" requires explicit package name.

親切に助けて

4

2 に答える 2

2

モジュールにはpackageステートメントが必要であり、真の値で終了する必要があります。(現在は真の値を返しますが、明示的に使用するのが好きです。)拡張子1;を付けることをお勧めします。.pm

# MyConfig.pm
package MyConfig;
use strict;
use warnings;
our %hash = (
   "Quarter" => 25,
   "Dime"    => 10,
   "Nickel"  =>  5,
);
1;

さて、そのままにしておくと、%MyConfig::hashの代わりに使用する必要があり%hashます。したがって、変数をモジュールからユーザーの名前空間にエクスポートする必要があります。

# MyConfig.pm
package MyConfig;
use strict;
use warnings;
use Exporter qw( import );
our @EXPORT = qw( %hash );
our %hash = (
   "Quarter" => 25,
   "Dime"    => 10,
   "Nickel"  =>  5,
);
1;

スクリプトに移ります。

#!/usr/bin/perl
use strict;
use warnings;
use MyConfig;
for (sort keys %hash) {
   print "$hash{$_}\n";
}

use MyConfig;require(必要な場合)とインポートを行います。後者は、リストされている変数とサブ@EXPORTを現在の名前空間に取り込みます。

于 2013-03-27T07:55:42.807 に答える
1

%hashあなたが投稿したコードがあなたが主張したエラーメッセージを実際に与えることから多くの編集であったという事実を無視すると、あなたの問題はあなたがfile2.plで宣言しないことです。そのファイルはstrictプラグマを使用しているため(これは良いことです)、この致命的なエラーが発生します。これを克服するには、ハッシュを宣言します。

our %hash;
require 'file1.pl';
#... etc.

ただし、require構成ファイルをロードする手段として使用しようとしている場合は、より良い方法がたくさんあります。たとえばConfig::Any

于 2013-03-27T07:45:24.927 に答える