【问题标题】:Perl: Return hashref from function does not workPerl:从函数返回 hashref 不起作用
【发布时间】: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


【解决方案1】:

如果没有1 && 部分,花括号将被解释为一个块,从而返回一个列表。通过附加部分,perl 解释器会根据需要创建一个匿名哈希引用。

除了1 &&,您还可以使用简单的+ 来帮助perl 解释器:

sub foo {
  +{ ${$_[0]} => ${$_[0]} }
}

【讨论】:

  • 另外,我相信明确的return { ... }; 会起作用(这更清楚)。
  • @JonathanLeffler 当然,显式返回将是最好的解决方案,但由于帖子被标记为混淆...... ;)
  • 确实如此,但我忘了把它放进去。dgw 的回答解释了发生了什么。我没有想到它会被视为一个块。如果您考虑一下,这很有意义。谢谢你。
猜你喜欢
  • 2015-01-19
  • 2016-07-22
  • 1970-01-01
  • 2012-10-23
  • 2017-08-08
  • 1970-01-01
  • 2019-11-19
  • 2015-05-31
  • 1970-01-01
相关资源
最近更新 更多