私はある種の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>