2

これは恥ずかしい質問ですが、なぜこの行は機能するのに、他の行は機能しないのでしょうか。

作業ライン:

use strict;
use warning;
use Wx qw(:everything);
my $dialog = Wx::MessageDialog->new(
    $self,
   "About test\n" .  "Version 0.01\n",
   "About Test",
   wxOK | wxCENTRE
);

非稼働ライン:

use strict;
use warning;
use Wx;
my $dialog = Wx::MessageDialog->new(
   $self,
   "About test\n" .  "Version 0.01\n",
   "About Test",
   wxOK | wxCENTRE
);

動作していない回線からのエラーメッセージ:

Bareword "wxOK" not allowed while "strict subs" in use at test.pl line 123.
Bareword "wxCENTRE" not allowed while "strict subs" in use at test.pl line 123.
BEGIN not safe after errors--compilation aborted at test.pl line 348.
4

2 に答える 2

13

これと同等です:

BEGIN {
    require 'Wx';
    Wx->import( ':everything' );
};

そのコードは、「:everything」をWxから現在の名前空間にインポートします。私の推測では、WxはExporterを使用しており、「:everything」で呼び出されたときにインポートするもののグループがあります。

Wxのソースエクスポーターのソースをチェックして、より理解を深めることができます。

私はあなたの働いている/働いていない例を逃しました。wxOKおよびwxCENTRE定数が現在の名前空間にインポートされていないため、機能していないものは機能しません。これは、上で説明したように、エクスポーターを使用して行われます。

于 2011-10-17T14:25:46.437 に答える
6
qw(:everything)

と非常によく似ています

(split ' ', ':everything')

そう

use Wx qw(:everything);

と同じです

use Wx ':everything';

文字列:everythingは Wx のエクスポート ルーチン ( import) に渡されます。セマンティクスは完全にモジュール次第ですが、Wx はそれを「エクスポートできるものすべてをエクスポートする」と定義していると思います。ほとんどのモジュールは:ALL、それを提供する場合、それを使用します。

あなたが尋ねない限り、Wxは何もエクスポートしないようです.Wxにそれらをエクスポートするように指示しない限り、名前空間には存在しませwxOKwxCENTRE

use Wx qw( wxOK wxCENTRE );

また

use Wx qw( :everything );

今後の参考のために、単に何かがうまくいかないと言うのではなく、エラー メッセージなどを含めてください。

于 2011-10-17T14:57:07.257 に答える