gpt4 book ai didi

perl - 标量上下文中的 glob 是惰性迭代器吗?

转载 作者:行者123 更新时间:2023-12-01 00:53:58 26 4
gpt4 key购买 nike

我很喜欢glob经常被忽视的类似迭代器的功能。

我不清楚它是否计算/加载整个列表到内存中,即使在标量上下文中使用也是如此。在此示例代码中,while 循环不会在屏幕上打印任何内容(4**24 不是一个小数字):

use strict;
use warnings;
use feature 'say';

my $opt = "{A,B,C,D}" x 24;
say while glob $opt;

我尝试/观察到的事情:

  • 我试图通过编写 1 while glob $opt; 来消除缓冲成为问题的可能性,但它仍然需要很长时间,我最终还是 Ctrl+C出去了。

  • 当我运行脚本时,通过 Windows 任务管理器检查我的内存使用情况似乎没有显示任何差异。

  • 运行 perl -MO=Deparse 只会确认 glob 正在标量上下文中使用,而不会指示任何内存使用情况。

  • 运行 perl -MO=Concise 会产生以下输出,我不知道如何解读:

    m  <@> leave[1 ref] vKP/REFC ->(end)
    1 <0> enter ->2
    2 <;> nextstate(main 49 -:5) v:%,*,&,{,x*,x&,x$,$,469762048 ->3
    7 <2> sassign vKS/2 ->8
    5 <2> repeat[t2] sK/2 ->6
    3 <$> const[PV "{A,B,C,D}"] s ->4
    4 <$> const[IV 24] s ->5
    6 <0> padsv[$opt:49,74] sRM*/LVINTRO ->7
    8 <;> nextstate(main 74 -:6) v:%,*,&,{,x*,x&,x$,$,469762048 ->9
    l <@> leave vK* ->m
    9 <0> enter v ->a
    - <1> null vKP/1 ->l
    g <|> and(other->h) vK/1 ->l
    f <1> defined sK/1 ->g
    e <2> sassign sK/2 ->f
    c <@> glob[t5] sK/1 ->d
    - <0> ex-pushmark s ->a
    a <0> padsv[$opt:49,74] s ->b
    b <#> gv[*_GEN_0] s ->c
    - <1> ex-rv2sv sKRM*/3 ->e
    d <#> gvsv[*_] s ->e
    - <@> lineseq vK ->-
    j <@> say vK ->k
    h <0> pushmark s ->i
    - <1> ex-rv2sv sK/3 ->j
    i <#> gvsv[*_] s ->j
    k <0> unstack v ->a
    - syntax OK

我正在运行 ActivePerl 5.16.3。

最佳答案

当您观察到第一次 glob 调用和第一次打印结果之间的延迟时,它似乎并不懒惰。在标量上下文中执行 glob 所花费的时间进一步证实了这一点 not 在循环中(在我的示例中,我使用了较小的指数,因此延迟仍然很明显但不会太长):

use strict;
use warnings;
use feature 'say';
use Time::HiRes;

$| = 1;

my $opt = "{A,B,C,D}" x 10;
say Time::HiRes::time;
my $x = glob $opt;
say $x;
say Time::HiRes::time;
say while glob $opt;
say Time::HiRes::time;

关于perl - 标量上下文中的 glob 是惰性迭代器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30299042/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com