作为标题所述 - 请问有人能解释一下下面的脚本是如何工作的吗?
这段代码会输出文本:"Perl guys are smart"。
这段代码会输出文本:"Perl guys are smart"。
''=~('(?{'.('])@@^{'^'-[).*[').'"'.('-[)@{:__({:)[{(-:)^}'^'}>[,[]*&[[[[>[[@[[*_').',$/})')
这个代码只会输出 "b"
use strict;
use warnings;
''=~('(?{'.('_/).+{'^'/]@@_[').'"'.('=^'^'_|').',$/})')
perl -MO=Deparse 只显示以下内容:
use warnings;
use strict 'refs';
'' =~ m[(?{print "b",$/})];
但是我不知道为什么... ;(
如何推荐分解类似的脚本?从哪里开始?
因此,尝试了这个:
'' =~
(
'(?{'
.
(
'])@@^{' ^ '-[).*['
)
.
'"'
.
(
'-[)@{:__({:)[{(-:)^}' ^ '}>[,[]*&[[[[>[[@[[*_'
)
.
',$/})'
)
几个部分通过.
连接在一起。按位异或^
的结果可能会给出文本部分。这些是:
perl -e "print '-[)@{:__({:)[{(-:)^}' ^ '}>[,[]*&[[[[>[[@[[*_'"
打印出 "Perl guys are smart" 和第一个 ^
生成的 "print"。
但是,当我将其重写为:
'' =~
(
'(?{'
.
(
'print'
)
.
'"'
.
(
'Perl guys are smart'
)
.
',$/})'
)
我的Perl告诉我:
panic: top_env
奇怪,我第一次看到这样的错误消息...
这意味着不能用result
替换'str1' ^ 'str2'
(不知道为什么),那么为什么Perl会打印出panic消息?
我的Perl版本:
This is perl 5, version 12, subversion 4 (v5.12.4) built for darwin-multi-2level
Ps: examples are generated here