gpt4 book ai didi

perl - 这两个 eval 之间的区别是否用常量折叠来解释?

转载 作者:行者123 更新时间:2023-12-04 01:07:37 26 4
gpt4 key购买 nike

这两个 eval 只改变 Module::FOO()FOO()

# Symbols imported, and used locally.
eval qq[
package Foo$num;
Module->import();
my \$result = Module::FOO() * Module::FOO();
] or die $@;

# Symbols imported, not used locally referencing parent symbol.
eval qq[
package Foo$num;
Module->import();
my \$result = FOO() * FOO();
] or die $@;

为什么顶部 block 会占用显着更少的空间?脚本和输出转载如下,

脚本

package Module {
use v5.30;
use warnings;
use constant FOO => 42;
use Exporter 'import';
our @EXPORT = ('FOO');
}


package main {
use v5.30;
use autodie;
use warnings;

$|=1;
say "Our PID is $$";

for my $num ( 0..1e5 ) {
eval qq[
package Foo$num;
Module->import();
my \$result = Module::FOO() * Module::FOO();
] or die $@;
eval qq[
package Foo$num;
Module->import();
my \$result = FOO() * FOO();
] or die $@;
}

say "DONE";

_debug();

}

sub _debug {
open my $fh, "<", "/proc/$$/status";
while ( <$fh> ) {
next unless /Rss/;
print;
}
}

结果

包(命名空间)合格

RssAnon:      78896 kB
RssFile: 5220 kB
RssShmem: 0 kB

本地导入

RssAnon:     168180 kB
RssFile: 5496 kB
RssShmem: 0 kB

最佳答案

这是 Perl 内部不断折叠的结果。这可以通过 irc.freenode.net/#perl 上的 haarg 中的以下示例进行演示,

use strict;
use warnings;

package Module {
use constant FOO => 42;
use Exporter 'import';
our @EXPORT = ('FOO');
}

my $subs = {
loc => sub {
package Foo;
Module->import();
my $result = FOO() * FOO();
},
fq => sub {
package Foo;
Module->import();
my $result = Module::FOO() * Module::FOO();
},
};

use Data::Dumper;
$Data::Dumper::Deparse = $Data::Dumper::Indent = 1;
print Dumper($subs);

这将导致,

$VAR1 = {
'loc' => sub {
package Foo;
use warnings;
use strict;
'Module'->import;
my $result = FOO() * FOO();
},
'fq' => sub {
package Foo;
use warnings;
use strict;
'Module'->import;
my $result = 1764;
}
};

你可以看到其中一个有,

my $result = FOO() * FOO();

虽然另一个有,

my $result = 1764;

如果声明模块并在编译阶段(子编译的情况下)完成导入,或者在字符串评估的情况下执行之前,您都可以获得常量折叠,就像这样

BEGIN {

package Module {
use constant FOO => 42;
use Exporter 'import';
our @EXPORT = ('FOO');
}
package Foo { Module->import() }

}

关于perl - 这两个 eval 之间的区别是否用常量折叠来解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65931084/

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