gpt4 book ai didi

perl - 当 perl 中有 < FH >、<> 或 < * > 时,内部会发生什么?

转载 作者:行者123 更新时间:2023-12-04 16:34:24 24 4
gpt4 key购买 nike

如果这个问题听起来很简单,我很抱歉,我的目的是了解 深入这个(这些?)特定的操作符是如何工作的,我无法在 perldocs 中找到令人满意的描述(它可能存在于某个地方,我一生都找不到它)

特别是,我有兴趣知道

a) <>
b) <*>或任何球体和

c) <FH>
本质上相似或不同,以及它们如何在内部使用。

我构建了自己的测试函数以对此有所了解(如下所示)。我仍然没有完全理解(我的理解甚至可能是错误的)但这是我得出的结论:

  • <>
  • 在标量上下文中:读取正在读取的“当前文件”的下一行(在@ARGV 中提供)。 问题 : 这似乎是一个非常特殊的场景,我想知道为什么会这样,是否可以推广。另外,正在读取的“当前文件”是什么?它在文件句柄中吗?什么是计数器?
  • 在列表上下文中:将@ARGV 中的所有文件读入数组
  • <list of globs>
  • 在标量上下文中:在当前文件夹中找到的与 glob 匹配的第一个文件的名称。 问题 : 为什么是当前文件夹?我该如何改变?改变这种情况的唯一方法是做 之类的事情吗?
  • 在列表上下文中:当前文件夹中与 glob 匹配的所有文件。
  • <FH>只是在分配给变量时似乎返回 undef。
    问题 : 为什么是undef?它没有类型吗?当 FH 不是裸字文件句柄时,这是否表现相似?

  • 一般问题 : 是什么在执行过程中处理<>等的值?在标量上下文中,是否返回了任何类型的引用,或者我们分配给它们的变量是否与任何其他非引用标量相同?

    我还注意到,即使我按顺序分配它们,每次都会重置输出。即我会假设当我这样做时
    $thing_s = <>;
    @thing_l = <>;
    @thing_l将丢失第一项,因为它已经被 $thing_s 收到了。 .为什么不是这样?

    用于测试的代码:
    use strict;
    use warnings;
    use Switch;
    use Data::Dumper;

    die "Call with a list of files\n" if (@ARGV<1);
    my @whats = ('<>','<* .*>','<FH>');
    my $thing_s;
    my @thing_l;
    for my $what(@whats){
    switch($what){
    case('<>'){
    $thing_s = <>;
    @thing_l = <>;
    }
    case('<* .*>'){
    $thing_s = <* .*>;
    @thing_l = <* .*>;
    }
    case('<FH>'){
    open FH, '<', $ARGV[0];
    $thing_s = <FH>;
    @thing_l = <FH>;
    }

    }
    print "$what in scalar context is: \n".Dumper($thing_s)."\n";
    print "$what in list context is: \n".Dumper(@thing_l)."\n";
    }

    最佳答案

    <>东西都是迭代器。所有这些变体都有共同的行为:

  • 在列表上下文中使用,返回所有剩余元素。
  • 在标量上下文中使用,仅返回下一个元素。
  • 用于标量上下文,返回 undef一旦迭代器耗尽。

  • 最后两个属性使它适合用作 while 中的条件。循环。

    有两种迭代器可以与 <> 一起使用:
  • 文件句柄。在这种情况下 <$fh>相当于 readline $fh .
  • 球体,所以 <* .*>相当于 glob '* .*' .
  • <>当它不包含任何内容、一个裸字或一个简单的标量时,它被解析为一个 readline。可以嵌入更复杂的表达式,如 <{ ... }> .

    在所有其他情况下,它被解析为一个 glob。这可以通过使用引号来明确: <"* .*">但你真的应该明确并使用 glob函数代替。

    一些细节不同,例如保持迭代器状态的地方:
  • 从文件句柄读取时,文件句柄保存迭代器状态。
  • 使用 glob 形式时,每个 glob 表达式都有自己的状态。

  • 另一部分是迭代器是否可以重新启动:
  • 返回一个后 glob 重新启动 undef .
  • 文件句柄只能通过搜索重新启动——并非所有 FH 都支持此操作。

  • 如果在 <> 中没有使用文件句柄,则默认为特殊的 ARGV文件句柄。 <ARGV>的行为如下:
  • @ARGV为空,则 ARGVSTDIN .
  • 否则,@ARGV 的元素被视为文件名。执行以下伪代码:
    $ARGV = shift @ARGV;
    open ARGV, $ARGV or die ...; # careful! no open mode is used
    $ARGV标量保存文件名,而 ARGV文件句柄保存该文件句柄。
  • ARGV将是 eof ,下一个文件来自 @ARGV被打开。
  • 仅当 @ARGV完全空 jar <>返回 undef .

  • 这实际上可以用作从许多文件中读取的技巧:
    local @ARGV = qw(foo.txt bar.txt baz.txt);
    while (<>) {
    ...;
    }

    关于perl - 当 perl 中有 < FH >、<> 或 < * > 时,内部会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18858905/

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