2014-10-27 49 views
2

我做了一个答案如下评论我earlier question about glob函数调用之间如何存储glob迭代器?

水珠()或死亡的作品罚款当一个函数调用中。它可以重复调用并按预期工作。所以上面的两个文件存在。第三次功能失败时称为三次全局(main,function,main = success)。函数内的行为与函数内的行为不同。

ysth回应:

在功能或没有没有区别,但在源中的每个水珠运营商是一个独立的迭代器,所以你不会看到这个问题,除非你循环回以某种方式

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

sub in_function { 
    my $file = shift; 

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

这个问题试图继续一个不存在的“线程”。每个帖子堆栈溢出应该是唯一的 – Borodin 2014-10-27 17:48:35

+2

总是使用glob在列表上下文中的可重复使用的代码,除非你确定你会耗尽迭代器在试图开始一个新的迭代之前 – ysth 2014-10-27 17:50:11

+0

未被glob连接到'glob(3)'?如果是这样,这取决于你的glob的实现。 – 2014-10-27 17:50:15

回答

5

它存储在由操作码(MY_CXT.x_GLOB_ENTRIESext/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 
+0

我明白,多个调用glob被“保存”,但不知道在哪里/如何调用。隐含的堆栈指针指向哈希内存中的glob函数?看不到它,困扰我。 – Paul 2014-10-27 18:02:14

+3

它不在堆栈上。这是行不通的。必须在堆中。 C的堆,在这种情况下。 – ikegami 2014-10-27 18:03:32

+0

第二次调用函数怎么知道在堆上的哪个地方去引用先前创建的对象,放在哪里?当在功能之外使用时,它可以工作。那么它在记忆方面有什么不同呢? 好的......我看到它知道,哇......真的,如何从文档中知道 – Paul 2014-10-27 18:07:11