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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

使用单独的线程时,RequestCycle为空

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Delphi:在线程上的plugindll中创建的对象中使用adocomponents时发生异常

来自分类Dev

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

来自分类Dev

在cURL中使用PUT时,$ _ POST数组为空

来自分类Dev

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

来自分类Dev

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

来自分类Dev

使用Mockito时,实例变量保持为空

来自分类Dev

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

来自分类Dev

如何在线程中使用autotest / ActionController :: TestCase?

来自分类Dev

为什么要在线程中使用弯针

来自分类Dev

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

来自分类Dev

我如何在线程中使用true?

来自分类Dev

在线程中使用exec(compile())导入问题

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

在php中使用eval时出错

来自分类Dev

Streamlit-在线程中创建的SQLite对象只能在同一线程中使用

来自分类Dev

线程新手:在线程参数中使用std :: ref()出现问题

来自分类Dev

当变量为空时mysql插入null

来自分类Dev

比较变量时为空结果

来自分类Dev

回声时环境变量为空

来自分类Dev

发送 POST 时 $_POST 变量为空

Related 相关文章

  1. 1

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

  2. 2

    使用单独的线程时,RequestCycle为空

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

    Delphi:在线程上的plugindll中创建的对象中使用adocomponents时发生异常

  8. 8

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

  9. 9

    在cURL中使用PUT时,$ _ POST数组为空

  10. 10

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

  11. 11

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

  12. 12

    使用Mockito时,实例变量保持为空

  13. 13

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

  14. 14

    如何在线程中使用autotest / ActionController :: TestCase?

  15. 15

    为什么要在线程中使用弯针

  16. 16

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

  17. 17

    我如何在线程中使用true?

  18. 18

    在线程中使用exec(compile())导入问题

  19. 19

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

  20. 20

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

  21. 21

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

  22. 22

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

  23. 23

    在php中使用eval时出错

  24. 24

    Streamlit-在线程中创建的SQLite对象只能在同一线程中使用

  25. 25

    线程新手:在线程参数中使用std :: ref()出现问题

  26. 26

    当变量为空时mysql插入null

  27. 27

    比较变量时为空结果

  28. 28

    回声时环境变量为空

  29. 29

    发送 POST 时 $_POST 变量为空

热门标签

归档