在 Perl eval 中捕获变量赋值

2024-04-25

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

例如,如果我运行:

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

eval 的结果是 3.14(最后评估的值),但我还希望能够确定名称“$foo”和“$bar”及其值(无需提前知道名称)。

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


在 eval 中声明的任何词法变量都将在 eval 结束后丢失。要捕获和隔离 eval 中设置的全局变量,您可以考虑使用Safe http://perldoc.perl.org/Safe.html#reval-%28STRING,-STRICT%29模块创建一个新的全局命名空间。像下面这样:

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功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Perl eval 中捕获变量赋值 的相关文章

随机推荐

  • `na_if()` 中的错误:!无法将 `y` 转换为匹配 `x` 的类型

    我有一个数据帧 df 3 我想从中改变以以下开头的多个列Team 我想用 NA 替换列中包含的 0 我使用以前成功使用过的代码 但现在出现以下错误 Error in mutate In argument across starts with
  • 具有可选小数点的十进制数的正则表达式

    我的要求是测试粘贴的数据 如果失败则不要粘贴 Regex d 0 4 d 0 2 使用的数据 1 2 tests true 1 2 3 test true as well 要求是 小数点前最小 0 最大 4 位小数点可以是点或逗号如果有小数
  • 判断一个数是否是质数

    我已经仔细阅读了有关该主题的大量代码 但大多数代码生成的数字一直到输入数字都是素数 但是 我需要的代码仅检查给定的输入数字是否为素数 这是我能够写的 但它不起作用 void primenumber int number if number
  • 如何从 Uri 中修剪视频,包括“mp4parser”库可以处理的文件,但使用 Android 框架?

    背景 在过去的几天里 我一直致力于制作一个可定制的 更新版本的视频剪辑库 here https github com AndroidDeveloperLB VideoTrimmer 基于这个图书馆 https github com tita
  • 无法解析程序集 Model.dll

    我有一个使用实体框架的类库项目 它工作得很好 直到我将模型移到一个单独的类库类型项目中 将模型移至名为 Model 的单独类库项目后 我将 app web config 中的连接字符串更改为如下所示
  • 检测互联网连接并显示 UIAlertview Swift 3

    我正在制作一个应用程序 通过使用 if else 语句来检测是否有互联网连接 当有互联网时 不执行任何操作 但如果没有互联网连接 则警报视图说该应用程序需要我管理的互联网 但发现可达性在我的 viewDidLoad 上实现 uialertv
  • Android 实现具有 hashmap 的 Parcelable 对象

    我有这样的课程 public class RateData Map
  • 无法从非 EcmaScript 模块导入命名导出“指令”(仅提供默认导出)

    这是我正在开发的一个离子角度项目 我正在使用 ng lazyload image 插件Link https www npmjs com package ng lazyload image 当我开始编译它时显示这样的错误 Error node
  • 使用 phpunit 9.5 捕获警告、通知和弃用

    Quoting https phpunit readthedocs io en 9 5 writing tests for phpunit html testing php errors warnings and notices https
  • 为什么分析使用 1x1 像素?

    导致插件分析使用 1x1 img 像素调用其代码的原因是什么 这个快捷方式有什么权限 托管 1x1px 图像的服务器记录该请求 这允许收集有关谁加载 和呈现 带有图像的页面的统计信息 浏览器通常允许 img 标签中的跨源 此外 这还允许从与
  • Scala:抽象类型模式 A 未被选中,因为它已被擦除消除

    我正在编写只能捕获特定类型异常的函数 def myFunc A lt Exception try println Hello world or something else catch case a A gt warning abstrac
  • 如何在 Windows 7 上安装 ROracle 软件包?

    我正在尝试在 Windows 7 客户端上安装 ROracle 包 我安装了 Oracle Instant 客户端和 Rtools 安装了 DBI 包 设置了 OCI32 LIB 环境变量 但是当我尝试从命令行安装时 C Temp gt R
  • 按组手动填充多个比例的geom_tile

    I have the following current output 我的目标是像这样的着色 但只填充到最大级别 例如填充停止在当前级别 创建此数据的数据是 df lt tribble Question Code RespondentLe
  • 如何让react中所有可折叠项默认打开?

    我使用reactstrap制作了一个带有令牌的可折叠按钮 并且按钮单击折叠一切正常 我希望保持这种情况 但另一方面 我如何修改它以使所有可折叠按钮在页面初始渲染时打开 访问页面时 所有令牌都需要可见 这意味着所有可折叠项目都需要打开 如果我
  • java 8后具有多个选择的联合查询

    这是我想在 MySQL 中尝试的一个查询 SELECT A x FROM A WHERE A y P UNION SELECT A x FROM A WHERE A y Q 上面是我正在尝试的原始查询的精简版 简单得多的版本 在我原来的查询
  • 从 Android 中的纬度和经度获取城市名称提供的服务不可用 Android 4.0.3?

    我在应用程序中使用的是Android 4 0 3版本 现在我想获取城市名称或其他信息LATITUDE and 经度但当我运行应用程序时 显示服务不可用 Logcat 01 10 13 58 29 279 W System err 1211
  • Twitter Bootstrap Collapse 插件方向 - 水平而不是垂直

    有没有办法从水平方向而不是垂直方向折叠 Bootstrap Collapse 插件 看看代码 这种能力似乎没有内置 但我希望我只是错过了一些东西 任何帮助将不胜感激 谢谢 我想出了如何在不修改或添加任何 JavaScript 的情况下非常轻
  • 自定义 jquery 验证和不显眼的 JavaScript

    我正在尝试编写一个自定义验证 如果在提交表单时文本区域中存在 html 则会给出错误 我有以下内容 它不起作用 我不知道为什么 我也不明白不引人注目的部分 有人可以告诉我如何做到这一点 因为我看到其他有它的例子 文本区域有一个类 note
  • 使用 Polyfit 进行垂直线拟合

    这只是一个基本问题 我正在使用拟合线来分散点polyfit 在某些情况下 我的散点具有相同的 X 值并且polyfit无法在其上放置一条线 必须有某种东西可以处理这种情况 毕竟 它只是一个线配合 我可以尝试交换 X 和 Y 然后再画一条线
  • 在 Perl eval 中捕获变量赋值

    我希望能够从 Perl eval 捕获变量赋值 也就是说 确定代码中分配给哪些变量名称并提取它们的值 例如 如果我运行 eval foo 42 bar 3 14 eval 的结果是 3 14 最后评估的值 但我还希望能够确定名称 foo 和