5

Perlとスコープに関する質問があります。さまざまな変数がたくさんある共通のファイルがあります。メインスクリプトに共通ファイルが必要ですが、変数にアクセスできません。それらはその範囲外のようです。宣言はその問題を克服すると思いましたourが、うまくいかないようです。

スクリプト1:common.pl

#!/usr/bin/perl

our $var1 = "something";
our $var2 = "somethingelse";

スクリプト2:ftp.pl

#!/usr/bin/perl

use strict;
use warnings;

require('common.pl');

print $var1; 

エラーが発生します:

グローバルシンボル「$var1」には明示的なパッケージ名が必要です

4

5 に答える 5

8

2番目の例にはステートメントはありrequireませんが、とにかく機能しません。our字句スコープのパッケージ変数を宣言するのは何ですか。ステートメントがないためpackage、デフォルトのパッケージを使用しますmain。したがって、最初のスクリプトで変数を設定します$main::var1が、これはそのファイルのスコープ内でのみ使用できます。

他のスクリプトに共通の変数を提供するためのより良い方法は、Exporterを使用することです。パッケージシンボルを1つの場所で定義でき、Exporterは、必要に応じて、それらを要求元のスクリプトまたはクラスの名前空間にコピーします。

于 2009-10-11T13:52:20.220 に答える
7

代わりに、構成をモジュールに入れます。

ファイル: MyConfig.pm

package MyConfig;
require Exporter;
use strict;

our @ISA                = qw(Exporter);
our @EXPORT             = qw( getconfig ); 

my %confighash = ( 
            thisone => 'one',
            thatone => 2,
            somthingelse => 'froboz',
                   );



sub getconfig {
 return  %confighash;
 }

1;

使用例:

#!/usr/bin/perl
use strict;
use warnings;

use MyConfig;

my %config = getconfig();

print $config{ somthingelse };

これはfrobozを印刷する必要があります

于 2009-10-11T16:26:25.243 に答える
6

そこに適切な設定ファイルが必要なようです。セットアップが必要なときに読み取ることができる非コード構成ファイルを探します。CPANには、想像できるほぼすべての構成形式を処理するモジュールがあります。

自分のやり方でやりたい場合は、ourそれらを取り除き、で宣言しますuse vars。PBP警察にあなたを怖がらせないでください。:)あなたは本当にourパッケージ変数のスコープを制限する必要があるだけです、そしてそれはあなたがやろうとしていることの正反対です。

于 2009-10-11T14:02:43.350 に答える
2

our()はあなたが思っているのとは少し違うことをします。その唯一の目的は、使用するパッケージ変数を宣言するように厳密に要求することです(完全に修飾されているかインポートされている場合を除く)。strictと同様に、その効果は字句スコープです。これを使用して$main:var1、複数のファイル(個別のスコープ)からグローバルにアクセスできるようにするには、各ファイルで$var1言う必要があります。our $var1

または、必要なファイルを、それを使用する任意のパッケージに変数をエクスポートする独自のパッケージを持つモジュールに変更します。

于 2009-10-12T03:37:27.360 に答える
1

これを試して。私はPerlを初めて使用しますが、これが私が作成したスクリプトで動作させる方法です

#!/usr/bin/perl

$var1 = "something";
$var2 = "somethingelse";
Script 2: ftp.pl

#!/usr/bin/perl

use strict;
use warnings;

our $var1;
our $var2;

require('common.pl');

print $var1;
于 2010-11-13T16:07:25.437 に答える