evalbytes

バイトストリームで string eval を実行する

構文

解説

evalbyteseval の string eval (eval EXPR 構文) と良く似ていますが、 evalbytesEXPR はバイト文字列という点が異なります。 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 を利用する場合は、細心の注意を払ってください。