【发布时间】:2012-05-23 22:13:28
【问题描述】:
当我遇到一些我不理解的奇怪行为时,我正在使用一些没有任何用处的混淆代码。
这是我的代码。
no strict;
sub foo{1&&{${$_[0]},${$_[0]}}}say map {&${${_}}(${_})->{${${_}}}}map{\$_}qw(foo);
缩进:
no strict;
sub foo {
1 && { ${$_[0]} => ${$_[0]} }
}
say map { &${ ${_} }( ${_} )->{ ${ ${_} } } }
map { \$_ } qw (foo);
它应该做的是获取字符串foo,构建对它的引用,然后调用具有该名称的函数(&foo)。该函数应返回一个 hashref,其中键和值都表示为 foo 字符串。之后,它会打印返回的 hashref 的键 foo 的值,即 foo。
到目前为止,一切都很好。没用,但还是很有趣。奇怪的是,当我删除 sub 中的 1 && 部分时,尽管有卷曲,它仍会返回一个列表,我不知道为什么会这样做。
如果我只是说sub foo { { 'foo'=>'foo' } },它会返回引用。为什么在我的情况下没有?还有,为什么我加1 &&会这样?
【问题讨论】:
-
我喜欢 perl 的“可读性”仍然,或多或少不可读:)
-
这对 Perl 来说太折磨人了。当它适合一条线时,几乎没有一半的借口。如果您使用多行,则应该为了清楚起见而编写它,而事实并非如此(除非有一些解释性的 cmets 被排除在问题之外)。
-
@asf107 他的意思是“缩进”,而不是“可读”。普通的 perl 代码是完全可读的,尽管一些由快乐的业余爱好者编写的代码看起来像一团糟。
-
@TLP:你是对的。由于这不是正常的代码,我会说没关系。这个问题很可能出现在可读性很强的生产代码中。不过,我不确定你是否称我为快乐的业余爱好者。我当然很高兴。 :D
-
@JonathanLeffler:这就是重点。 ;-)
标签: perl function obfuscation hashref