gpt4 book ai didi

perl - O=Deparse 是如何工作的,Perl 是否具有并折叠常量数组?

转载 作者:行者123 更新时间:2023-12-04 05:27:10 26 4
gpt4 key购买 nike

我想知道,是否-MO=Deparse向您展示所有 Perl 优化,为什么在 Perl 5.10 中没有折叠?

$ perl -MO=Deparse -e'[qw/foo bar baz/]->[0]'
['foo', 'bar', 'baz']->[0];
-e syntax OK

IRC 上的一些人认为 O=Deparse可能不会显示所有内容,但它肯定会显示一些恒定的折叠。
$ perl -MO=Deparse -e'use constant "foo" => "bar"; foo'
use constant ('foo', 'bar');
'???';
-e syntax OK

如果我明确编写常量 sub,结果相同。虽然可以预测,但 constant.pm 中的文档也很有趣。您是否创建了一个常量列表而不是一个常量数组。我认为这不仅不像标量常量那样折叠,而且它需要在每次调用时创建一个新数组的开销。
$ perl -MO=Deparse -e'use constant foo => qw/foo bar baz/; (foo)[0]'
use constant ('foo', ('foo', 'bar', 'baz'));
(foo)[0];
-e syntax OK

我能得出的唯一结论是 -MO=Deparse显示所有的折叠,而常量数组只是没有在 Perl 中优化?是这样吗?有技术原因吗?

最佳答案

您不能创建常量数组,因为数组不是数据。 Perl 5 有五种类型的数据(可以存储在变量中的东西):

  • 没有值(value) (undef)
  • 号码
  • 字符串
  • 引用
  • 列表(由一种或多种上述类型组成)

  • 您可以从其中任何一个中创建一个常量。 Perl 5 也有三个容器:
  • 标量
  • 数组
  • 哈希

  • 标量可以保存前四种类型的数据中的任何一种,数组和散列可以保存列表。重要的是不要混淆保存数据的事物和数据本身。

    至于 B::Deparse , 它在构建后转储 optree,因此它将显示所有常量折叠的结果。

    我还没有考虑得足够多,但我没有看到任何明显的原因不能折叠。

    关于perl - O=Deparse 是如何工作的,Perl 是否具有并折叠常量数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3561210/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com