バイトストリームで string eval を実行する
evalbytes
は eval
の
string eval (eval EXPR
構文) と良く似ていますが、
evalbytes
の EXPR はバイト文字列という点が異なります。
EXPR が省略されたら $_
が適用されます。
eval
の string eval については、
eval
の解説ページを参照してください。
次の例は Perl コード "int(rand(10))"
を evalbytes
で実行していますが、
引数には、Perl コードを pack
でバイナリーに変換したものを与えています。
use v5.16;
my $bin = pack( 'a*', 'int(rand(10))' );
my $result = evalbytes($bin);
print $result, "\n"; # 0 ~ 9 のランダムな整数
上記サンプルは eval
を使うと次と同じです。
my $result = eval "int(rand(10))";
print $result, "\n"; # 0 ~ 9 のランダムな整数
evalbytes
は Perl v5.16 以降で利用できます。
evalbytes
を使うには、Perl v5.16 以降でも、
use v5.16;
または use feature 'evalbytes'
を宣言する必要があります。
もしくは、evalbytes
の前に CORE::
を前置しても構いません。
その場合は、use v5.16;
も use feature 'evalbytes'
も不要です。
my $result = CORE::evalbytes($bin);
evalbytes
の用途としては、実行したいコードがバイナリーで取得される状況が想定できます。
たとえば、ネットワーク経由でコードが送られてくるような場合などです。
しかし、外部から送られてくるコードを無条件に実行できしまうのは、セキュリティー上、非常に危険なことです。
evalbytes
を利用する場合は、細心の注意を払ってください。