Perl中"open function"和"touch command"的区别?

Vam*_*ond 2 linux perl file

以下两种文件创建方式有何不同?

  open(DATA,">newfile.txt");       #1.using open function
  close(DATA);

  `touch newfile.txt`;             #2.using touch command  
Run Code Online (Sandbox Code Playgroud)

哪一个好又快?注意:当在Perl脚本中使用open function和touch命令时,并考虑将其用于创建空文件.

zdi*_*dim 5

明显的区别在于,在第二种情况下,您将前往系统.启动shell运行命令或命令通过execvp系统调用运行(取决于参数,见下文).有很多事情发生,一些事情也可能出错.

更重要的是,还有更多工作要做.如果文件已经存在怎么办?首先,open将截断它,同时touch只更新时间戳.但是你想要一个文件,所以你需要先检查一下.怎么会失败?你需要检查一下.因此,这应该是一个小例程.

然后在Perl中写下所有内容.委派这么简单的工作没有任何好处,只有陷阱.


注意:使用三参数 open

open my $fh, '>', $file
Run Code Online (Sandbox Code Playgroud)

所有必要的检查.然后你还有一个更好的词法(间接)文件句柄来使用.


感谢hek2mgi的评论和ikegami澄清qx可能会绕过shell取决于参数(看似没有文档?),就像系统一样.

这可以检查,每hek2mgi评论,通过strace -f script.pl,凡与qx(touch "NEW")在脚本中,我们找到这一行

[pid 24332] execve("/bin/sh", ["sh", "-c", "touch \"NEWFILE\""], [/* ...

虽然在脚本/bin/sh的输出qx(touch NEW)中没有(没有引号,没有shell).

要注意,qx确实接受一个数组(在文档中未提及),它显然被插值.这是从输出端看到strace -fqx(@cmd)@cmd = qw(ls -l > tt.out),其具有

[pid 30773] execve("/bin/sh", ["sh", "-c", "ls -l > tt.out"], [/* ...

qw(ls -l如上所述,如果需要(本例)而不是(),则运行shell .

  • 基本正确。但 perl 并没有启动 shell。perl 克隆自身并执行 execve touch 自身,无需 shell。我也必须意识到这一点。检查跟踪。 (2认同)
  • 这是一个优化.如果没有特殊字符,Perl会绕过shell.`touch foo` =没有shell,`touch"foo"`= shell.如果唯一的特殊字符是"2>&1",Perl也会绕过shell. (2认同)