Perl:在线程中使用eval时为空变量

米克尔·邦纳维亚勒

将项目从perl 5.8.8更新到perl 5.18.2时遇到问题。
我已将问题简化为以下示例:

use threads;

my $key = "abcdef";

print "test1 key = $key.\n";

my $thr = threads->create(sub {
    eval "print \"test2 key = \$key.\n\";";
}); 

$thr->join();

在perl 5.8.8中,这给出了正确的输出:

test1 key = abcdef.
test2 key = abcdef.

但是在perl 5.18.2中,我有:

test1 key = abcdef.
test2 key = .

我尝试了其他perl版本,但问题似乎在5.14.0版本中出现。我正在寻找纠正此问题的最佳方法,以及有关此perl beaviour修改的说明。

我找到了一些替代方案,但对我来说似乎都不对:

  • 使用“我们的$ key”而不是“ my $ key”;但这会使变量“更公开”
  • 添加“我的$ toto = $ key;” 在评估行之前(尽管仍在评估行中使用$ key);实际上,在评估行之前用$ key进行某些操作(打印,操作,使用...)似乎可以解决问题。但是添加的行对该功能没有用。

对于我来说,在eval命令中使用$ key代替\ $ key并不是解决方案,因为在实际程序中,我将处理更复杂的结构。

疾病

该问题与线程无关。参见类似的PerlMonks线程。要创建一个闭包,编译器需要知道将使用一个变量。您可以在要关闭的子项中提及变量:

my $thr = threads->create(sub {
    $key;  # Create a closure.
    eval "print \"test2 key = \$key.\n\";";
}); 

要查看类似的非线程情况,只需创建一个作用域:

my $sub = do {
    my $key = "abcdef";
    print "test1 key = $key.\n";
    sub {
        $key; # <-- Comment this line to get no value.
        eval "print \"test2 key = \$key.\n\";";
    }
};

$sub->();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在线程中使用队列时为main中的特定变量创建锁

在线程中使用全局变量

在线程函数中使用数据向量时发生线程竞赛

在线程中使用 PySide6

在Perl中使用多个线程时,如何减少内存消耗?

在线程中使用 libarchive 读取存档内容时的数据竞争。我做错了什么?

在线程中使用方法时,“类型无法满足所需的生存期”

在线程中使用forEach循环的引用的线程安全

在线程中运行函数或在函数中使用线程

从在线程中运行的函数访问 while 循环变量并在 C# 中的其他函数中使用

在线程A中创建对象,在线程B中使用。是否需要互斥体?

_POST在表单中使用文件和文本时为空

当值为空时在查询中使用 if 条件

使用Telegram webhook执行代码时,$ _ POST变量为空

尝试使用 RVest 抓取 Web 数据时为空变量

在使用将来的wait_for时无法检查成员变量,但是如果我在线程中睡眠,它将起作用

在 Python 中使用 eval() 时如何避免对未使用的局部变量发出警告

在线程中使用Javafx时间线

为什么notifyAll()不能在线程实例中使用?

Android,当我必须在线程中使用同步

我如何在线程中使用true?

使用NSOperationQueue在线程之间移动变量

在线程中创建的DatabaseWrapper对象只能在同一线程中使用。”当尝试使用celery插入数据库时

当在线程中使用system()时,为什么在Mac OS X上将多线程C程序强制到单个CPU?

当另一个线程可以在Delphi中使用该对象时,如何安全地将其放置在线程中?

在R中使用randomForest时eval()错误

在php中使用eval时出错

尽管目录为非空,但使用“用于目录中的f”时,变量名为空

在匿名线程中使用最终变量