【问题标题】:Can someone explain this Perl code snippet?有人可以解释这个 Perl 代码片段吗?
【发布时间】:2011-07-17 12:23:51
【问题描述】:

这段小代码一直是我的一堆脚本中的主要内容,但我从其他人编写的另一个工作脚本中获取了语法并对其进行了调整以适应我的需要。我什至不确定这里使用的语法是否是打开文件处理程序的最佳或最常用的方式。

代码是:

$fh = \*STAT_FILE;
open ($fh,">>".$stat_file) or die "Can't open $stat_file: $!\n";
my $print_flag = ( -z $stat_file );

我不完全理解上面代码的第一行和最后一行。具体来说,分别是\*STAT_FILE-z

我知道,在大多数情况下,第二行将打开一个文件以进行追加或退出并引发错误。但同样,我也不明白$! 在该行中的用途。

有人可以用伪代码逐行向我解释这个 Perl 代码吗?另外,如果上面的方法不是首选方法,那是什么?

提前致谢

【问题讨论】:

  • 如果您没有在任何地方使用 $print_flag,请删除该行。

标签: perl file append handler


【解决方案1】:

在 perl 5.6 之前,文件句柄只能是 glob(裸词)或对 glob 的引用(这是 \*STAT_FILE 的含义)。此外,最好使用 3-argument open (See the docs。另请参阅 perlopentut)。所以你现在可以这样做:

open(my $fh, ">>", $stat_file) or die "Failed to open $stat_file: $!";

忘记 \*STAT_FILE。

-z 是one of the file test functions(并将文件名或文件句柄作为参数)并测试文件大小是否为零。

$!是Special Variables 之一,并且包含最近的系统错误消息(在这种情况下为什么无法打开文件,可能是权限问题,或者文件路径中的目录不存在等)。

你应该学会使用 perldoc,这一切都在 perldoc 中:

perldoc perlfunc(特别是 perldoc -f open 和 perldoc -f -X)

perldoc perlvar

【讨论】:

  • open(fh, ">>$stat_file) or die "Failed to open $stat_file: $!"; 也适用于 current (但我认为我的评论涉及多种方式原则perl)
  • @runrig: “你应该学会使用 perldoc,所有这些都在 perldoc 中:”只有在你已经知道 perl doc 页面名称(并不总是那么明显)的情况下才有帮助 :)不过,很高兴让他知道这些重要的事情。 :)
  • @runrig - 感谢您提供信息和代码清理。 @robert P - 你提出的观点正是这个问题在这里结束的原因。我不确定要在文档中查找什么。
  • @CheeseConQueso:我不知道为什么该变量被称为“$print_flag”,也许它在原始程序的某些上下文中有意义。但是,如果您需要多次引用该状态,则将其分配给一个变量比执行多个统计数据更有效。如果您不需要该测试,请不要使用它。
  • @CheeseConQueso:目的是查看文件是否为空。我不知道为什么它在你的程序中。如果您想查看文件是否存在,请在打开之前使用 -e。
【解决方案2】:

第一行为变量分配了对 typeglob(全符号表条目)STAT_FILE 的引用(反斜杠符号)。这是一个非常惯用的 perl 构造,用于传递文件句柄,正如在 Larry Wall “Programming perl” 中所报告的那样,仅命名它。美元!变量包含操作系统重发的错误信息。

所以整个意思是:

  • 第 1 行。在 $fh 变量中放入一个文件句柄;
  • 第 2 行。如果发生故障,打开以附加报告系统消息错误的文件;
  • 第 3 行。如果文件长度为零,则设置标志变量警告

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2020-02-04
    • 2015-09-14
    • 1970-01-01
    相关资源
    最近更新 更多