管道和管道之间的区别 - 在写入程序时

时间:2016-03-17 10:05:29

标签: perl

将数据写入程序的不同方法

WAY1:

\MongoDB\BSON\UTCDateTime

Way2:

open(WRITEME, "| program arguments");
print WRITEME "data\n";
close(WRITEME);

请解释一下,它们有什么区别?

2 个答案:

答案 0 :(得分:1)

没有区别。

在其他情况 [1] 中,两种形式之间存在差异,但给出的示例没有差异。

然而,使用三参数形式有一个好处,当使用open的这个函数时,可以利用它。 opensystem一样,当命令作为多个值的列表传递时,将直接运行程序(而不是调用shell来执行它)。这意味着以下内容可以避免调用shell:

open(WRITEME, "|-", "program", "arguments");

避免贝壳中间人有很多好处。主要好处是不需要将变量转换为shell文字。换句话说,

open(WRITEME, "|-", "program", "--", $file);

是一种简单的做法

use Shell::StringQuote qw( shell_quote );
open(WRITEME, "| ".shell_quote("program", "--", $file));
  1. 例如,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)我现在在文档中找不到这个。