gpt4 book ai didi

perl - 在 Perl eval 中捕获变量赋值

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

我希望能够从 Perl eval 中捕获变量赋值。也就是说,确定在代码中分配了哪些变量名称并提取它们的值。

例如,如果我运行:

eval '$foo=42; $bar=3.14;'

eval 的结果是 3.14(最后评估的值),但我也希望能够确定名称“$foo”和“$bar”及其值(事先不知道名称)。

我已经阅读了通过 Safe 和 Eval::Context 将变量插入到 eval block 中的几种方法,但还没有任何提取它们的方法。我更熟悉 Python 的 eval/exec,它内置了对此的支持。

最佳答案

在 eval 中声明的任何词法变量都将在 eval 结束后丢失。要捕获和隔离在 eval 中设置的全局变量,您可以考虑使用 Safe模块来创建一个新的全局命名空间。类似于以下内容:

use Safe;

my $vars = Safe->new->reval(qq{
$code_to_eval;
$code_to_search_the_symbol_table_for_declared_variables
});

搜索代码定义为遍历嵌套 %main:: 的内容符号表搜索任何感兴趣的变量。你可以让它返回一个包含信息的数据结构,然后你可以用它做你喜欢的事情。

如果您只担心在根级别定义的变量,您可以编写如下内容:
use strict;
use warnings;

my $eval_code = '$foo=42; $bar=3.14;';

use Safe;
my $vars = Safe->new->reval(
$eval_code . q{;
my %vars;
for my $name (keys %main::) {
next if $name =~ /::$/ # exclude packages
or not $name =~ /[a-z]/; # and names without lc letters

my $glob = $main::{$name};
for (qw($SCALAR @ARRAY %HASH)) {
my ($sigil, $type) = /(.)(.+)/;
if (my $ref = *$glob{$type}) {
$vars{$sigil.$name} = /\$/ ? $$ref : $ref
}
}
}
\%vars
});

print "$_: $$vars{$_}\n" for keys %$vars;
# $foo: 42
# $bar: 3.14

搜索代码还可以使用 Padwalker 在当前词法范围内搜索任何使用 peek_my 定义的变量。功能。

关于perl - 在 Perl eval 中捕获变量赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8250505/

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