在 Perl 中打开和读取文件的最佳方法是什么?

2023-12-02

请注意 - 我并不是在寻找打开/读取文件的“正确”方式,或者每次都应该打开/读取文件的方式。我只是有兴趣了解大多数人使用什么方式,也许同时学习一些新方法:)*

我的 Perl 程序中一个非常常见的代码块是打开一个文件并对其进行读取或写入。我见过很多这样做的方法,而且多年来我执行这项任务的风格也发生了几次变化。我只是想知道是什么best(如果有最好的方法)方法是这样做吗?

我曾经打开这样的文件:

my $input_file = "/path/to/my/file";
open INPUT_FILE, "<$input_file"  || die "Can't open $input_file: $!\n";

但我认为这存在错误捕获的问题。

添加括号似乎可以修复错误捕获:

open (INPUT_FILE, "<$input_file")  || die "Can't open $input_file: $!\n";

我知道你也可以将文件句柄分配给变量,所以我可以使用 $input_filehandle,而不是像上面那样使用“INPUT_FILE” - 这样更好吗?

对于读取一个文件,如果它很小,像这样的通配符有什么问题吗?

my @array = <INPUT_FILE>;

or

my $file_contents = join( "\n", <INPUT_FILE> );

或者你应该总是循环遍历,像这样:

my @array;
while (<INPUT_FILE>) {
  push(@array, $_);
}

我知道在 perl 中有很多方法可以完成任务,我只是想知道是否有打开和读取文件的首选/标准方法?


没有通用标准,但有理由选择其中之一。我的首选形式是这样的:

open( my $input_fh, "<", $input_file ) || die "Can't open $input_file: $!";

原因是:

  • 您立即报告错误。 (如果您想要的话,请将“死亡”替换为“警告”。)
  • 您的文件句柄现在是引用计数的,因此一旦您不使用它,它将自动关闭。如果您使用全局名称 INPUT_FILEHANDLE,则必须手动关闭该文件,否则它将保持打开状态,直到程序退出。
  • 读取模式指示符“

如果文件很小并且您知道需要所有行,则以下内容非常有用:

my @lines = <$input_fh>;

如果您需要将所有行作为单个字符串处理,您甚至可以这样做:

my $text = join('', <$input_fh>);

对于长文件,您需要使用 while 迭代行,或使用 read。

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

在 Perl 中打开和读取文件的最佳方法是什么? 的相关文章

随机推荐

  • 如何分析 goroutine 的数量

    基本上我想知道我的程序是否随着时间的推移而泄漏 goroutine 所以 我想看看随着时间的推移有多少 goroutine 正在运行 有什么办法可以通过pprof 我已经搞定了go tool pprof http localhost 888
  • 如何在 docker 容器上设置 ulimit / 文件描述符 镜像标签为 phusion/baseimage-docker

    我需要在 docker 容器上正确设置文件描述符限制 我使用 ssh 连接到容器 https github com phusion baseimage docker 已经尝试过 编辑limits conf容器忽略这个文件 新贵程序位于htt
  • 如何在空手道框架中编辑配置的标头

    在我的框架中 我有 headers js 文件 我使用命令在每个功能文件的背景上调用该 js 文件 configure headers read headers js 这按预期工作 某些情况下我需要更改 client id 值 例如 hea
  • SSLHandshakeException:收到致命警报:Java 6 -> 8 升级后握手失败

    我们最近将一个项目从 Java 6 更新到了 Java 8 现在我们在 SSL 握手方面遇到了障碍 服务层使用客户端请求和接收来自第三方应用程序的调用 在服务层 密钥库初始化为 System setProperty javax net ss
  • 从数据库中写入和读取最新(按日期)的行

    我对下面的代码有三个问题 基本上我正在尝试以 currentdate count 格式写入行 继续将行日期附加到同一个 csv 文件中 读取最近的 5 个条目并打印它 目前我尝试了以下操作并遇到以下错误 1 如何以当前日期格式写入一行 计数
  • Android 上的 Proguard 与 OrmLite

    我应该如何在 Android 上将 proguard 与 ormlite 库一起使用 尝试这个 keep class com j256 keepclassmembers class com j256 keep enum com j256 k
  • 第 n 个子元素选择错误的元素

    对于这个特定的站点 当我通过 CSS 或 jQuery 使用 nth child 时 nth child 选择器捕获了错误的元素 我在调用的选择器之前有一个孩子 home article nth child 3 captures 2nd c
  • 评估 FeatherJS 身份验证需求

    我和我的同事想构建一个聊天应用程序 ReactJS NodeJS 我们一直在寻找最好的框架来实现这一点 FeathersJS 似乎无疑是最稳定且功能丰富的 socket io 包装器 然而 由于我们希望允许我们的应用程序扩展 因此我们决定将
  • 如何检测字符串列表中的公共子字符串

    给定一组字符串 例如 EFgreen EFgrey EntireS1 EntireS2 J27RedP1 J27GreenP1 J27RedP2 J27GreenP2 JournalP1Black JournalP1Blue Journal
  • 尝试改变返回 Iterator 的闭包内的状态时,出现 Rust 错误“无法推断借用表达式的适当生命周期”

    我正在尝试学习 Rust 并在尝试模拟嵌套 Python 生成器时遇到了与生命周期相关的问题 正如编译器所报告的 问题在于由闭包改变的值的生命周期 代码的关键是 flat mapping 一个闭包 它调用一个函数 该函数在其返回的迭代器中改
  • html5-canvas 在线移动对象

    我想在斜线上移动物体 我已经给出了我的代码 在我的第三个 div 的代码中 当我移动滑块时 我在这条线上画了一条斜线 我想移动一个对象 我在第一个分区中正在做类似的事情 我在曲线上移动物体的地方 我正在寻找一些函数 在其中我将提供点并且对象
  • 如何使用 .htaccess 允许在我的 iframe 中访问页面但不能直接访问?

    我有一个用 iframe 制作的网站 我想在自己的 iframe 中显示一个页面 但我想拒绝直接访问 我怎样才能在我的 htaccess 您可以使用Referer用于检查请求是否来自您网站上的链接 或 img src 或 iframe sr
  • Argparse,处理可重复的项目集

    是否可以创建一组相关且可重复的可选参数 假设我有三个参数 a b c 组成一个集合 a 是必需的 但 b 和 c 是可选的 更新 我希望能够指定多组这些 Script py a 1 b 2 c 3 a 4 c 6 a 7 b 8 a 10
  • 我需要将哪些参数传递给 PackageWeb powershell 脚本才能将其部署到我的远程计算机

    尽管如此 我还是在 MSBuild MSDeploy world 中闲逛 并且最近经常摸不着头脑 我希望能够仅构建一次 Web 应用程序项目并将其部署到多个配置 我找到了这个PackageWeb解决方案来自 Sayed I Hashimi
  • 如何将附加属性设置为布尔值

    我正在尝试设置附加属性元素添加到 Open API Schema 3 X 中 但不幸的是我无法在文档中找到任何可以帮助我的内容 我在 Spring boot 中有一个应用程序 它使用 Spring doc OAS 该 OAS 依赖于 Swa
  • 如何从网址中删除问号[重复]

    这个问题在这里已经有答案了 有什么办法可以删除网址中的问号吗 现在假设 URL 可以是http www domain com profile a 10但也可以是http www domain com profile b ticket 所以在
  • 使用 git Branch -f 或 git update-ref 快进现有分支是否更好?

    我意识到我可以使用git update ref快进我不在的现有分支 然后我发现类似的事情可以通过git branch f 我明白那个git update ref更加灵活 它可以移动任何参考 但这可能很危险 那么是不是更好用git branc
  • Sass中如何给全局变量赋值?

    我运行这个 Sass 代码 a 1 if 2 2 4 a 2 debug a 我期望看到 2 然而 输出是 Line 5 DEBUG 1 我知道 Sass 创建了一个新的 a里面的变量 if范围 我怎样才能改变这种行为并为全局分配一个值 a
  • SQLite UPSERT /更新或插入

    我需要对 SQLite 数据库执行 UPSERT INSERT 或 UPDATE 有一个命令 INSERT OR REPLACE 在许多情况下很有用 但是 如果您想由于外键而保留自动增量的 id 则它不起作用 因为它会删除该行 创建一个新行
  • 在 Perl 中打开和读取文件的最佳方法是什么?

    请注意 我并不是在寻找打开 读取文件的 正确 方式 或者每次都应该打开 读取文件的方式 我只是有兴趣了解大多数人使用什么方式 也许同时学习一些新方法 我的 Perl 程序中一个非常常见的代码块是打开一个文件并对其进行读取或写入 我见过很多这