【问题标题】:Which file is Perl's diamond operator (null file handle) currently reading from?Perl 的菱形运算符(空文件句柄)当前从哪个文件读取?
【发布时间】:2017-03-15 03:49:24
【问题描述】:

我正在使用 Perl 的 diamond <> 运算符来读取命令行中指定的文件。

我希望能够报告"Trouble on line $. of file $FILENAME" 之类的消息,但我如何知道钻石当前使用的是哪个文件?

【问题讨论】:

  • 请注意:使用 $ARGV 来检测打开的文件是危险的,例如:mycmd file.1 file.1 file.1(多个同名文件)。坚持使用eof
  • “外部包”的感知问题令人沮丧和荒谬。大多数 Perl 模块只是带有.pm 扩展名的源文件,不需要安装过程。默认情况下,@INC 包含当前目录为.,因此只需将必要的文件复制到与源相同的目录即可使包可用并满足依赖关系。
  • @Borodin 如果可以直接用该语言提供某些内容,我更愿意了解它。就这么简单。
  • 如果没有同样的效果也能达到同样的效果,那么推荐一个需要您下载并安装 Perl 模块的解决方案是不恰当的。您陈述的偏好看起来非常像解决方案不得涉及安装模块的常见咒语,这掩盖了从 Stack Overflow 解决方案复制的任何内容也是“外部”。您还应该记住,默认情况下 Perl 安装了许多 core 模块,并且要求排除这些模块的解决方案会很苛刻。

标签: perl diamond-operator


【解决方案1】:

perlvar:

    $ARGV

Contains the name of the current file when reading from <> .

但也要考虑 perlvar 中的$.。如果您使用perl -n 执行此操作,结果可能不会如您所愿,因为在perl -n 用例中计数器未重置

$.

最后访问的文件句柄的当前行号。

Perl 中的每个文件句柄都会计算已读取的行数 从中。 (取决于 $/ 的值,Perl 的想法是什么 构成一行可能与您的不匹配。)当从 文件句柄(通过 readline()&lt;&gt; ),或者在调用 tell()seek() 时 在它上面,$. 成为该文件句柄的行计数器的别名。

您可以通过分配给 $. 来调整计数器,但这不会 实际移动搜索指针。本地化 $. 不会本地化 文件句柄的行数。相反,它将本地化​​ perl 的 $. 当前是哪个文件句柄的别名。

$. 在文件句柄关闭时重置,但在打开文件句柄时不会重置 文件句柄在没有干预close() 的情况下重新打开。更多 详细信息,请参阅 perlop 中的 I/O 运算符。因为&lt;&gt; 从不做 显式关闭,行号在 ARGV 文件中增加(但请参阅 eof 中的示例)。

您也可以使用HANDLE-&gt;input_line_number(EXPR) 访问该线路 给定文件句柄的计数器,而不必担心哪个 处理您最后一次访问。

助记符:许多程序使用“.”表示当前行号。

这是一个例子:

$ perl -nE 'say "$., $ARGV";' foo.pl bar.pl
1, foo.pl
2, foo.pl
3, foo.pl
4, foo.pl
5, foo.pl
6, foo.pl
7, foo.pl
8, foo.pl
9, foo.pl
10, foo.pl
11, foo.pl
12, foo.pl
13, bar.pl
14, bar.pl
15, bar.pl

如果您希望它重置,您需要在读取循环结束时检查eof感谢@Borodin)。另见perldoc for eof

$ perl -nE 'say "$., $ARGV"; close ARGV if eof' foo.pl bar.pl

【讨论】:

  • 是的。我知道美元。已经。感谢 $ARGV:出于某种原因,它避开了我的视线。
  • @sylvainulg 看看这个例子,它让我很困惑。如果句柄刚刚重新打开到另一个文件,则不会重置。
  • 好的,所以我想$.=1 if $ARGV ne $lastfilename 以避免混淆用户...
  • 规范的方法是在你的读循环结束时写close ARGV if eof。这会将$. 重置为零。
  • 首先,我对这个 But also consider $. in perlvar. 部分感到困惑。但是OP确实将其包含在问题中。我有另一个用例(根据内容模式检查文件名),您的答案的第一部分正是我正在寻找的。​​span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多