将数据写入程序的不同方法
WAY1:
\MongoDB\BSON\UTCDateTime
Way2:
open(WRITEME, "| program arguments");
print WRITEME "data\n";
close(WRITEME);
请解释一下,它们有什么区别?
答案 0 :(得分:1)
没有区别。
在其他情况 [1] 中,两种形式之间存在差异,但给出的示例没有差异。
然而,使用三参数形式有一个好处,当使用open
的这个函数时,可以利用它。 open
与system
一样,当命令作为多个值的列表传递时,将直接运行程序(而不是调用shell来执行它)。这意味着以下内容可以避免调用shell:
open(WRITEME, "|-", "program", "arguments");
避免贝壳中间人有很多好处。主要好处是不需要将变量转换为shell文字。换句话说,
open(WRITEME, "|-", "program", "--", $file);
是一种简单的做法
use Shell::StringQuote qw( shell_quote );
open(WRITEME, "| ".shell_quote("program", "--", $file));
open(my $fh, $x)
和open(my $fh, '<', $x)
之间存在差异。 open(my $fh, "< $x")
和open(my $fh, '<', $x)
之间甚至存在差异。答案 1 :(得分:0)
Way1 使用双参数open
。
这将打开程序参数的管道并写入它。替代方案是"program arguments |"
,最后是|
,这将使程序被读取。 1
Way2 使用三参数open
(这是文件首选)。 |-
表示 programm arguments 应该作为命令运行,我们将输出管道输出到该命令。替代方案是-|
,这意味着我们从该命令中读取。
perldoc -f open
中记录了这一点。
对于三个或更多参数,如果MODE为| - ,则文件名被解释为输出要通过管道输出的命令,如果MODE为 - | ,文件名被解释为管道输出给我们的命令。在双参数(和单参数)形式中,应该用命令替换破折号( - )。有关此问题的更多示例,请参阅在perlipc中使用open()for IPC。 (不允许您打开一个管道输入和输出的命令,但请参阅IPC :: Open2,IPC :: Open3以及perlipc中与另一个进程的双向通信以获取替代方案。)
对于它们两者,你应该使用词法文件句柄而不是GLOB文件句柄,并捕获错误。
open my $fh, '|-', 'ls' or die $!;
您还应该阅读perlopentut。
1)我现在在文档中找不到这个。