1

私はある種のperl「ターミナル」(ペーストビンコード)を持っています。これを私が書いたものと呼びます。それを書く背後にある考え方は、perlコードを1行ずつ実行して、既存の(大きな)データセット。スクリプトを変更してデータセットをリロードし、スクリプトを再実行する必要はありません。

(これはほぼ1年前に書いたもので、ほとんどが学習実験(動的機能タブレットを使用)でしたが、今では使用できるようになり、使用できない問題がいくつか見つかりました。)

そのため、evalユーザーがコマンドを入力しましたが、コマンドは期待どおりに動作しておらず、おそらく誰かがこれがなぜそうなるのかを明らかにすることができます。

これは「重要な」ビットです。コマンドラインデータはに格納されて@argsおり、その最初の要素はに格納されてい$progます。既存の関数があるかどうかを確認します(ユーザーが関数を作成できるようにし、実際に参照を悪用してアクションテーブルを取得できるようにします)。ない場合は、コマンドを評価してみます。

if(exists($actions{$prog})){
        print "\n";
        $actions{$prog}->(@args);
        print "\n";
}else{
        print "\nEVALing '$command'\n";
        eval $command;
        warn $@ if $@;
        print "\n";
}

以下に示すように、スカラーの割り当てでは期待どおりに機能しますが、配列とハッシュの割り当てでは失敗します。

user@host:~/$ perl term.pl 
1358811935>$a = 0;
EVALing '$a = 0;'

1358811937>print $a;
EVALing 'print $a;'
0
1358811944>@b = qw(2 3);                                                                                                      
EVALing '@b = qw(2 3);'
Global symbol "@b" requires explicit package name at (eval 5) line 1.

1358811945>print @b;
EVALing 'print @b;'
Global symbol "@b" requires explicit package name at (eval 6) line 1.

1358812008>my @b = qw(2 3);                                                                                                   
EVALing 'my @b = qw(2 3);'

1358812008>print "@b";
EVALing 'print "@b";'
Possible unintended interpolation of @b in string at (eval 9) line 1.
Global symbol "@b" requires explicit package name at (eval 9) line 1.

1358812016>print join(',',@b);                                                                                                
EVALing 'print join(',',@b);'
Global symbol "@b" requires explicit package name at (eval 10) line 1.

1358812018>
4

2 に答える 2

3

変数$a$bは、によって使用されるため、特別sortです。したがって、strict宣言されていなくても文句を言わないでください。を使用$xすると、配列やハッシュと同じエラーが発生します。

于 2013-01-21T23:54:22.697 に答える
1

この種のことについては、おそらく、と言って任意のパッケージ変数を使用できるようにする必要がありますno strict 'vars';。評価されたコードで字句(my)変数を宣言することは機能しますが、次の評価のスコープには含まれなくなります。

または、評価されたコードが使用する変数のセットを事前に宣言します(おそらく%miscハッシュを含む)。

完全に異なるアプローチは、これまでに入力されたすべてのコードの連結を評価するたびに行われます(出力の印刷が要因である場合は、入力された最新のコードまで出力をリダイレクトします)。

于 2013-01-22T00:00:59.880 に答える