バイトストリームで 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 を利用する場合は、細心の注意を払ってください。