読者です 読者をやめる 読者になる 読者になる

Perl日記

PerlとかRubyとかPHPとかPythonとか

evalではstrict 'refs'でも展開(?)できる

こちらを見て。
404 Blog Not Found:perl - 実践で役立たないPerl正規表現 完全解説


そうか、evalって重ねられるんだと思ってやってみたらできた。

use strict;
use warnings;

my $aaa = 123;
my $bbb = '$aaa';
my $ccc = '$bbb';
say eval eval eval $ccc;
#=> 123


あれ?、なんかこれって use strict; でできないんじゃなかったかと思ってたんだけど…。

use strict;
use warnings;

our $aaa = 123;
our $bbb = 'aaa';
our $ccc = 'bbb';

say ${${$ccc}};
Can't use string ("bbb") as a SCALAR ref while "strict refs" in use at - line 8.

うんやっぱりそうだ。
ちなみに my だとシンボルテーブルに乗らないからできない。


no strict 'refs' で打ち消せばいける。

use strict;
no strict 'refs';

use warnings;

our $aaa = 123;
our $bbb = 'aaa';
our $ccc = 'bbb';

say ${${$ccc}};
#=> 123


なんか eval () って何でもありだなー。
黒魔術っていうんですかね、こういうのを。