以下两种文件创建方式有何不同?
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命令时,并考虑将其用于创建空文件.
明显的区别在于,在第二种情况下,您将前往系统.启动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 -f上qx(@cmd)用@cmd = qw(ls -l > tt.out),其具有
[pid 30773] execve("/bin/sh", ["sh", "-c", "ls -l > tt.out"], [/* ...
qw(ls -l如上所述,如果需要(本例)而不是(),则运行shell .