我有一个带有输入和输出文件参数的perl程序,我想支持使用"-"
指定标准输入/输出的约定。问题是我不能只打开文件名,因为open(my $input, '<', '-')
打开一个名为-
的文件,而不是标准输入。所以我必须做这样的事情:
my $input_fh;
if ($input_filename eq '-') {
# Special case: get the stdin handle
$input_fh = *STDIN{IO};
}
else {
# Standard case: open the file
open($input_fh, '<', $input_filename);
}
类似于输出文件。有没有办法在没有自己测试特殊情况的情况下做到这一点?我知道我可以破解ARGV文件句柄来进行输入,但这对输出不起作用。
编辑:我被告知open
的2参数形式实际上是我正在寻找的魔法。不幸的是,它还做了一些创造性的解释,以便将文件名与第二个参数中的模式分开。我想open
的3参数形式是100%无魔法 - 它总是打开你告诉它的完全文件。我问我是否可以为"-"
提供一个例外,同时仍然明确地处理所有其他文件名。
我应该将上面的代码粘贴到子程序/模块中并停止抱怨吗?
答案 0 :(得分:4)
改为使用双参数形式:
open ($input_fh, "< " . $input_filename);
来自man perlfunc
:
在2参数(和1参数)表单中打开“' - '”打开 STDIN和打开“'&gt; - '”打开STDOUT。
请注意,<
模式在双参数形式中是可选的,因此"< -"
完全合法。
答案 1 :(得分:0)
我想我找到了我正在寻找的东西。有一个名为IO::All
的漂亮模块,可以满足我的需求。
对于Debian / Ubuntu /类似用户,该包名为libio-all-perl
。我想将这个链接指向“apt:libio-all-perl”,但显然只允许使用http链接。
还有Iterator::Diamond
,它实现了我要求的可调灵魔。它被设计用于替换“菱形”运算符<>
,但如果仅使用一个文件调用它(可能会有一些开销,但谁在乎呢?)它可能会按照我的要求执行。