带有返回旧值的 glob 的行输入运算符

2024-02-18

以下摘录代码在 perl 5.16.3 及更早版本上运行时,具有奇怪的行为,其中对行输入运算符中的 glob 的后续调用会导致 glob 继续返回以前的值,而不是重新运行 glob。

#!/usr/bin/env perl

use strict;
use warnings;

my @dirs = ("/tmp/foo", "/tmp/bar");

foreach my $dir (@dirs) {    
    my $count = 0;
    my $glob = "*";
    print "Processing $glob in $dir\n";
    while (<$dir/$glob>) {
        print "Processing file $_\n";
        $count++;
        last if $count > 0;
    }
}

如果你放入两个文件/tmp/foo以及其中的一个或多个/tmp/bar,并运行代码,我得到以下输出:

处理 /tmp/foo 中的*

处理文件/tmp/foo/foo.1

在 /tmp/bar 中处理*

处理文件/tmp/foo/foo.2

我以为当while后终止last,新调用while在第二次迭代中将重新运行 glob 并给我列出的文件/tmp/bar,但我得到了内容的延续/tmp/foo.

这几乎就像角度运算符 glob 的作用就像预编译模式一样。我的假设是角度运算符正在符号表中创建一个文件句柄,该文件句柄仍然打开并在幕后重用,并且它的范围仅限于包含foreach,或者可能是整个子例程。


From perlop 中的 I/O 运算符 http://perldoc.perl.org/perlop.html#I/O-Operators(我的重点)

(文件)glob 仅在启动时才评估其(嵌入)参数 新列表。在重新开始之前必须读取所有值。在列表中 上下文,这并不重要,因为你会自动获取它们 反正。但是,在标量上下文中,运算符返回下一个值 每次被调用时,或者undef当列表用完时。

Since <>在这里在标量上下文中调用,然后使用以下命令退出循环last第一次迭代后,下次输入时,它会继续从原始列表中读取。


评论中澄清了这一任务背后的实际需求:仅处理目录中的某些文件,并且从不返回所有文件名因为可能有很多。

所以分配自glob到一个列表并使用它,或者更好的是使用for代替while正如评论者ysth https://stackoverflow.com/users/17389/ysth,在这里没有帮助,因为它返回一个巨大的列表。

我还没有找到方法glob (what <>使用文件名模式)一旦生成列表,就删除并重建列表,而无需先到达其末尾。 显然,操作符的每个实例都有自己的列表。所以使用另一个<>在 - 的里面while循环并希望以任何方式重置它,即使使用相同的模式,也不会影响正在迭代的列表while (<$glob>).

只是要注意,用 a 打破循环die (with while in an eval)也没有帮助;下次我们再讨论这个问题时while同样的清单还在继续。将其包裹在封闭物中

sub iter_glob { my $dir = shift; return sub { scalar <"$dir/*"> } }

for my $d (@dirs) {
    my $iter = iter_glob($d);
    while (my $f = $iter->()) {
        # ...
    }
}

遭遇同样的命运;原始列表继续使用。

那么解决方案是使用readdir反而。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有返回旧值的 glob 的行输入运算符 的相关文章

随机推荐

  • docker 构建 Dockerfile 时允许更多内存

    我尝试构建一个 Dockerfile 并得到以下结果 Linking CXX executable bin clang collect2 error ld terminated with signal 9 Killed make 2 bin
  • QT 5.5.1 .so 库与 android

    我已经下载了用于 armeabi 和 x86 android 平台的 openssl 编译库here https github com emileb OpenSSL for Android Prebuilt并尝试将其加载到 pro 文件中
  • 查找 PHP 依赖项

    有没有可以列出 PHP 文件使用的类名称的工具 例如 如果我在此文件上运行它 它将报告 Obj1 和 Obj2 如果它真的很聪明 它也可能会报告 Obj3 但这不是必需的 我正在尝试打包一些代码 并且需要一些帮助以确保我没有错过任何依赖项
  • 从 Visual Studio 2017 部署 Angular 2 应用程序

    我使用 Visual Studio 2017 并开发了两个 Angular 2 应用程序 第一个是纯 Angular 2 没有后端代码 数据来自 wcf 服务 第二个是托管在 MVC 应用程序 net 4 6 中的 Angular 2 SP
  • 创建具有两行文本的自定义按钮,每行文本具有不同的字体

    我有点被困在这里 真的需要一些帮助 在我看来 向按钮添加两行单独的文本应该很容易 但事实并非如此 有一种方法可以使用 html 标签来做到这一点 但它不允许您指定 大 和 小 之外的字体或文本大小 这是我的按钮 它被称为 clicky
  • Spring Data Redis Lettuce 连接问题

    我有带有 MYSQL DB 的 Spring Boot 应用程序 并且我使用 Cacheable Annotation 将数据缓存在服务器层的 Redis 中 Cacheable value employeeCache key custom
  • 遗传算法 - 路径的交叉和变异算子

    我想知道是否有人知道图中路径的直观交叉和变异运算符 谢谢 问题有点老了 但问题似乎没有过时或解决 所以我认为我的研究仍然可能对某人有帮助 就 TSP 问题而言 突变和交叉是相当微不足道的 在最短路径或最优的情况下 每个突变都是有效的 即因为
  • Matplotlib 将文件保存为 JPEG 编码器错误

    我试图将 matplotlib 图保存为 JPEG 文件 但出现以下错误 我不确定这是否与我的安装或我的代码有关 因此我还附加了一个示例程序来执行该程序 该程序会产生以下错误 我将图形保存为 png 或 pdf 没有问题 只有 jpg 存在
  • 在 php 中访问 joomla 会话 - codeigniter

    我需要检查用户是否已登录 CodeIgniter 登录发生在 Joomla 网站上 我尝试了以下方法来初始化 joomla define JEXEC 1 define DS DIRECTORY SEPARATOR define JPATH
  • ... 操作员的名字是什么?

    Is the 运算符 扩展 运算符 根据其词法位置 参数位置与解构赋值 数组 参数位置等 具有两种不同的语义 或者它有两个名字 传播 和 休息 吗 这是同一个运算符 根据用途不同 名称也不同 其余属性 其余属性收集尚未被解构模式拾取的剩余自
  • React 中的 TextField 内无法识别新行 '\n'

    Context 我正在使用 Material UI TextField 并映射从数据库 MongoDB 获取的对象数组 就像是 state map item gt
  • 当模块导入 Angular 时,如何自动运行模块中的服务?

    我想知道在导入模块时如何从模块运行服务而无需任何手动服务注入并运行 就像RouterModule does NgModule imports BroserModule MyModuleWithServicesThatShouldAutoRu
  • .NET 正则表达式 - 创建字符串?

    我有一个正则表达式 用于提取文件夹名称的两个部分 0 9 8 0 9A Ba c BLAH 没问题 这将匹配 12345678 abc BLAH 我有 12345678 和 abc 分为两组 是否可以通过提供带有两个字符串的方法并将它们插入
  • Artifactory 失去了对当地文物的追踪

    我正在使用 Artifactory OSS 4 1 0 和 Java 1 8 0 51 当我尝试从 Artifactory Web 界面下载本地工件之一时 我得到以下信息 errors status 500 message Could no
  • Easy_install 没有安装 Mechanize?

    我正在从旧的 Win2K 机器迁移到新的 功能更强大的 Vista 64 位 PC 大部分迁移都进行得相当顺利 但我确实发现我需要重新安装所有与 Python 相关的工具 我已经下载了 mechanize 0 1 11 tar gz 文件并
  • 在 Matlab 中使用 svmtrain 内存不足

    我有一组数据正在尝试使用 SVM 来学习 对于上下文 数据的维数为 35 包含大约 30 000 个数据点 我之前用这个数据集在 Matlab 中训练过决策树 大约花了 20 秒 由于对错误率不太满意 我决定尝试 SVM 我第一次尝试svm
  • MySql 中的 EntityFunctions 支持

    我在 MySQL 中使用 EntityFunctions DiffMinutes 时遇到错误 下面是我的代码 return db DiscoveredDevices Where m gt EntityFunctions DiffMinute
  • 哪个 Hook 可以更改 WooCommerce 购物车页面中的数量更新?

    当购物车中的产品数量发生变化时 我试图触发一个功能 更具体地说 我想在客户修改购物车中的金额时运行此功能 我正在寻找购物车中剩余的金额 然后拦截更新购物车事件 目前我正在使用 add action woocommerce remove ca
  • 将 pandas 数据框中的单元格拆分为多行

    我有一个包含订单数据的数据框 每个订单都有多个包存储为逗号分隔的字符串 package package code 列 我想拆分包裹数据并为每个包裹创建一行 包括其订单详细信息 这是一个示例输入数据框 import pandas as pd
  • 带有返回旧值的 glob 的行输入运算符

    以下摘录代码在 perl 5 16 3 及更早版本上运行时 具有奇怪的行为 其中对行输入运算符中的 glob 的后续调用会导致 glob 继续返回以前的值 而不是重新运行 glob usr bin env perl use strict u