如何在函数调用之间存储glob迭代器?

时间:2014-10-27 17:24:47

标签: perl iterator

我对earlier question about glob的答案发表了以下评论:

  当不在函数调用中时,

glob()或die工作正常。它可以被重复调用并按预期工作。所以上面的两个文件存在。在函数失败时第四次称为三次glob(main,function,main = success)。函数内的行为与函数内的行为不同。

ysth回复:

  

函数没有区别,但源代码中的每个glob运算符都是一个单独的迭代器,所以除非你以某种方式循环,否则你不会看到问题

在下面的代码中,为什么/在哪里/如何在调用之间保存glob运算符的迭代器?为什么不超出范围?我知道它在做什么,但无法看到它在记忆中的表现。

sub in_function {
    my $file = shift;

    glob($file) or die ("$file file was not found\n"); #this fails second time called
}

1 个答案:

答案 0 :(得分:5)

它存储在由操作码地址(MY_CXT.x_GLOB_ENTRIES中的ext/File-Glob/Glob.xsglob.xs)键入的每个解释器哈希值中。

它被操作码的地址键入的事实意味着源中的操作码的两个实例将具有不同的迭代器。

$ perl -E'say "".glob("{a,b}") for 1..2;'
a
b

$ perl -E'say "".glob("{a,b}"); say "".glob("{a,b}");'
a
a

它是每个解释器这一事实意味着每个线程都有自己的迭代器用于给定的操作码实例。

$ perl -Mthreads -E'
   sub f { say "".glob("{a,b}"); }
   f() for 1..2;
'
a
b

$ perl -Mthreads -E'
   sub f { say "".glob("{a,b}"); }
   async { f() }->join for 1..2;
'
a
a