在Perl中的“打开function”和“触摸命令”之间的区别?

在以下两种情况下创build文件有什么不同?

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

哪一个更好,更快? 注意:在Perl脚本中同时使用open函数和touch命令,并考虑用于创build空文件。

明显的区别在于,在第二种情况下,你要出门到系统。 启动一个运行该命令的shell或者通过execvp系统调用运行该命令(取决于参数,见下文)。 还有很多事情,还有一些事情可能会出错。

更重要的是,还有更多的事情要做。 如果文件已经存在? 一方面, open将截断它,而touch只会更新时间戳。 但是你想要一个新的文件,所以你需要首先检查。 如果这失败了呢? 你需要检查。 因此,这应该是一个小程序。

然后用Perl编写。 委托这样一个简单的工作没有任何好处,只有陷阱。


注意:使用三参数open

 open my $fh, '>', $file 

与所有必要的检查。 那么你也有一个更好的词法(间接)文件句柄来处理。


感谢hek2mgi的意见和ikegami澄清, qx可能绕过shell取决于参数(什么看起来没有文档?),就像系统一样。

这可以通过strace -f script.pl来检查,通过脚本中的qx(touch "NEW") ,我们可以找到该行

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

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

要注意的是, qx确实接受一个数组(文档中没有提到),这显然是内插的。 这可以从qx(@cmd)上的strace -f输出中看到@cmd = qw(ls -l > tt.out)

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

然后,如果需要(这个例子),运行一个shell,而不是( qw(ls -l )),如上所述。

*哪一个更好更快?

这个问题没有意义。 这两个片段是不相同的,所以你应该问“哪一个做我想要的? openopen文件,如果它存在,而touch将保持不变。


至于在使用系统调用vs炮击运行一个外部命令之间哪一个更好,如果你不把这个问题的大部分代码都省略掉,答案是显而易见的!

直接使用系统调用:

 utime(undef, undef, $qfn) or die("Can't touch \"$qfn\": $!\n"); 

通过外部命令使用系统调用:

 use String::ShellQuote qw( shell_quote ); my $cmd = shell_quote("touch", "--", $qfn); my $output = `$cmd 2>&1`; die("Can't touch \"$qfn\": Killed by signal ".($? & 0x7F)."\n" if $? & 0x7F; die("Can't touch \"$qfn\": Exited with error ".($? >> 8).": $output" if $? >> 8; 

正如你所看到的那样,炮击远远更复杂和容易出错。 当然,启动整个程序来进行系统调用而不是仅仅进行系统调用要慢得多。

他们是两个非常不同的命令。

touch用于修改文件的访问和修改时间。 默认情况下,它将访问和修改时间设置为当前时间,如果该文件不存在,则会将其创建为空文件。

open是为了打开文件阅读或写作。 根据给定的模式,open命令也可以创建一个不存在的文件。

要使用touch手段来调用一个单独的进程(一个shell),所以给定的限制, open API命令是首选。

打开功能用于读取/写入文件。 该函数使用文件描述符,然后写入指定的文件。 而触摸功能创建一个新的文件。

open :用于读/写。

touch :用于更新/修改。

但是, touch通过实际克隆(perl克隆)来运行另一个进程来打开一个shell。