使用 Perl 查找文件

2023-11-27

File::Find and the wanted 子程序

这个问题比原来的标题(“子例程的原型和前向声明”!)要简单得多。我希望答案,无论多么简单,都能帮助我理解子例程/函数、原型和范围以及File::Find module.

使用 Perl,子例程几乎可以出现在任何地方,并且通常不需要进行前向声明(除非子例程声明了原型,我不确定如何在 Perl 中以“标准”方式执行此操作)。对于我通常使用 Perl 所做的事情来说,这些不同的运行方式之间几乎没有什么区别somefunction:

sub somefunction;  # Forward declares the function
&somefunction; 
somefunction();
somefunction;   # Bare word warning under `strict subs`

我经常使用find2perl生成我将其复制/破解到脚本部分的代码。这很可能是一种糟糕的风格,现在我的脏衣服被公开了,但就这样吧:-)File::Find the wanted函数是必需的子程序 -find2perl创建它并添加sub wanted;到它创建的结果脚本。有时,当我编辑脚本时,我会删除“sub" from sub wanted最终结果是&wanted; or wanted();。但如果没有sub wanted;转发声明表我收到此警告:

Use of uninitialized value $_ in lstat at findscript.pl line 29

我的问题是:为什么会发生这种情况?这是一个真正的问题吗?这“只是一个警告”,但我想更好地理解它。

  • 文档和代码说$_位于内部sub wanted {}。为什么如果我使用它会是未定义的wanted();代替sub wanted;?
  • Is wanted在某处使用原型?我是否遗漏了一些明显的东西Find/File.pm?
  • 是不是因为wanted返回代码参考? (???)

我的猜测是,前向声明表格“初始化”wanted以某种方式,以便第一次使用时不会有空的默认变量。我想这就是原型——甚至 Perl 原型,比如它们现有的——的工作方式。我尝试通过 Perl 源代码进行 grep 来了解什么sub当使用调用函数时正在执行的操作sub function代替function(),但目前这可能超出了我的能力范围。

非常感谢任何加深(并加速)我对此理解的帮助。

EDIT:这是一个Stack Overflow 上最近的示例脚本我使用创建的find2perl的输出。如果您删除sub from sub wanted;你应该得到同样的错误。

EDIT:正如我在下面的评论中指出的(但我也会在这里标记它):几个月来我一直在使用Path::Iterator::Rule代替File::Find。这个需要perl >5.10,但我从来不需要在奇怪的“从不升级”的站点上部署生产代码,5.8.*只有政策如此Path::Iterator::Rule已经成为我永远不想放弃的模块之一。也有用的是Path::Class。干杯。


我不太喜欢 File::Find。它就是行不通right. The find命令不会返回文件列表,因此您必须使用非本地的你的数组变量find捕获您找到的文件列表(不好),或者将整个程序放入您的wanted子例程(甚至更糟)。另外,单独的子例程意味着您的逻辑与您的逻辑是分开的find命令。实在是太丑了。

我所做的是内联我的wanted我里面的子程序find命令。子例程与查找保持一致。另外,我的非本地的数组变量现在只是我的一部分find命令并且看起来没那么糟糕

这是我的处理方式File::Find-- 假设我想要的文件具有.pl suffix:

my @file_list;
find ( sub {
    return unless -f;       #Must be a file
    return unless /\.pl$/;  #Must end with `.pl` suffix
    push @file_list, $File::Find::name;
}, $directory );

# At this point, @file_list contains all of the files I found.

这与以下完全相同:

my @file_list;

find ( \&wanted, $directory );

sub wanted {
    return unless -f;
    return unless /\.pl$/;
    push @file_list, $File::Find::name;
}

# At this point, @file_list contains all of the files I found.

内衬看起来更好。而且,它将我的代码放在一起。另外,我的非本地的数组变量看起来并不那么奇怪。

我也喜欢利用shorter以这种特殊方式的语法。通常,我不喜欢使用推断$_,但在这种情况下,它使代码更容易阅读。我原来的通缉是这样的:

sub wanted {
    my $file_name = $_;
    if ( -f $file_name and $file_name =~ /\.pl$/ ) {
        push @file_list, $File::Find::name;
    }
}

File::Find使用起来不是那么棘手。你只需要记住:

  • 当您找到不需要的文件时,可以使用return转到下一个文件。
  • $_包含不带目录的文件名,您可以使用它来测试文件。
  • 该文件的全名是$File::Find::name.
  • 该文件的目录是$File::Find::dir.

而且,最简单的方法是将所需的文件推送到数组中,然后在程序中稍后使用该数组。

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

使用 Perl 查找文件 的相关文章

随机推荐

  • JMeter:java.net.NoRouteToHostException:无法分配请求的地址(地址不可用)

    我创建了一个带有 HelloController 的简单 Spring boot 应用程序 Get API http localhost 8080 hello Response Hello World 现在我创建了一个 JMeter 脚本
  • JavaScript 中 while(i--) 是什么意思?

    我正在使用 swipejsswipejs com 主页滑块使用此逻辑来突出显示活动的无序列表元素 我想知道这是如何实现的同时条件 works ul li li ul var bullets document getElementById b
  • 绑定许多数据框,添加带有其 id 的列[重复]

    这个问题在这里已经有答案了 我有许多重复命名的数据框 df 1 lt data frame x c 1 2 y 2 df 2 lt data frame x c 2 4 y 4 df 3 lt data frame x 2 y c 4 5
  • 哪里有复杂 ASP.net MVC 模型的示例? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在寻找更复杂的 asp net 的示例mvc模型 我在 ASP net 站点上看到的所有模型都非常非常简单 并且只涉及一两个数据库表 我很好奇如
  • 对实体/资源进行 RESTful API 授权?

    我正在一个具有非常复杂的访问控制规则的系统中开发 API 通常需要复杂的 SQL 查询来确定用户是否具有对特定资源的读取或写入访问权限 这会导致我们的客户端应用程序变得非常复杂和冗余 因为它们必须了解所有这些规则才能确定是否向用户提供每个对
  • Flask中如何获取请求体字节?

    请求的content type is application json 但我想获取请求正文字节 Flask 会自动将数据转换为json 如何获取请求正文 您可以通过调用获取非表单相关的数据request get data 您可以通过访问来获
  • 单个图像文件用于存储页面上的所有小图像

    在最近的一场Stackoverflow 播客 Jeff 谈到拥有一个图像文件 其中包含遍布整个页面的所有小图像 然后使用 CSS 对其进行剪切 以便所有图像都能正确显示 重点是减少服务器请求的数量 以便页面加载速度更快 我当时想 哇 这真的
  • powershell脚本格式表输出中的颜色词

    是否可以使用格式表为 powershell 输出仅对某些单词 而不是完整的行 进行着色 例如 此脚本递归扫描文件夹中的字符串 然后使用格式表输出结果 dir r i Select String args 0 format table Pro
  • 从 xml 创建 python 对象表示的模块 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在寻找一个易于处理的
  • 当用户向下滚动页面时加载图像 -

    我注意到博客中有一种趋势 即在向下滚动页面并且图像出现在视图屏幕中之前 图像不会加载 我想这一定是某种 jquery 魔法 但经过一番谷歌搜索后我无法弄清楚它是如何工作的 有谁知道这是如何做到的 编辑 如果您想查看此行为的示例 请查看 be
  • PHP:CURL已启用但没有效果

    I m trying to get data from external website using cURL in PHP but somehow it s not working I ve checked out that CURL e
  • 缺少“构建签名的 apk”选项

    将 Android Studio 更新到最新版本后 我找不到构建签名 apk 的选项 我已经尝试安装 Android Studio 的 beta 版和金丝雀版本 但它们似乎也不带有该选项 有人可以帮我弄清楚如何生成签名的apk吗 我尝试过重
  • 共享App应用程序快捷方式[UIApplicationShortcutIconTypeShare]

    我见过很多应用程序都使用UIApplicationShortcutIconTypeShare直接从主屏幕共享应用程序的应用程序快捷方式 它直接从主屏幕启动 UIActivityViewController 而无需打开应用程序 你是怎样做的
  • 每个 CPU 架构的真正 ELF TLS ABI 要求是什么?

    乌尔里希 德雷珀的论文on thread local storage 概述了几种不同 cpu 架构的 TLS ABI 但我发现它不足以作为实现 TLS 的基础 原因有两个 它省略了许多重要的体系结构 如 ARM MIPS 等 同时包括一堆完
  • 模板参数推导和 cons 限定

    谁能解释一下为什么代码不能编译 template
  • 如何将字符串与 chrono::milliseconds 连接起来?

    我需要一个带有时间戳 以毫秒为单位 的字符串 我通过这种方式得到了毫秒 在 stackoverflow 上查找之后 milliseconds ms duration cast lt milliseconds gt system clock
  • 如何检查模板参数的类型?

    假设我有一个模板函数和两个类 class animal class person template
  • 使用本机库进行 Surefire JUnit 测试

    我们在 Hudson 中使用 Maven 来运行 Java 构建过程 并使用 Surefire 插件来执行 JUnit 测试 但是我在一个需要本机 dll 的项目的单元测试中遇到了问题 我们看到的错误是 测试错误 TestFormRegis
  • 将脚本插入多个 Google 电子表格

    我是一名业余程序员 我实际上只做了一些事情来让我的生活更轻松 我设置了 Google 表单和电子表格来跟踪学校不同年级的纪律问题 我编写了一个简短的脚本 通过电子邮件通知适当的人员任何提交 并且可以过滤和创建有关选定学习者的报告 因为我做D
  • 使用 Perl 查找文件

    File Find and the wanted 子程序 这个问题比原来的标题 子例程的原型和前向声明 要简单得多 我希望答案 无论多么简单 都能帮助我理解子例程 函数 原型和范围以及File Find module 使用 Perl 子例程