什么是在以下两种情况的文件创建的差异。
open(DATA,">newfile.txt"); #1.using open function
close(DATA);
`touch newfile.txt`; #2.using touch command
哪一个更好,快?注意:当同时打开功能和Perl脚本中使用触摸命令,其用于创建空文件的考虑。
该明显的区别是,在第二种情况下你出去到系统中。甲壳开始运行于命令或经由execvp
系统调用该命令运行(取决于参数,见下文)。有很多事情,和很多事情可以去错了也是如此。
更重要的是,真的是有更多的事情要做。如果该文件已经存在?一方面,open
将截断它,而touch
只会更新时间戳。但是你要一个新的文件,所以你需要先检查反正。如果这失败了呢?你需要检查。因此,这应该是一个小程序。
然后,只需写这一切在Perl。有一个在委托这样一个简单的工作,只有陷阱没有优势。
注意:使用三个参数open
open my $fh, '>', $file
与所有必要的检查。然后,你也有一个更加美好的词汇(间接)的文件句柄的工作。
由于hek2mgi征求意见,并为ikegami澄清qx可以绕过取决于参数的外壳(这似乎没有证件?),就像system一样。
这可以检查,每hek2mgi评论,由strace -f script.pl
,凡与脚本qx(touch "NEW")
我们找到这一行
[pid 24332] execve("/bin/sh", ["sh", "-c", "touch \"NEWFILE\""], [/* ...
而没有在输出脚本/bin/sh
没有qx(touch NEW)
(不包括引号,无壳)。
要注意,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
)),如上面所讨论的。
*哪一个更好,快?
这个问题是没有意义的。这两个片段是不等价的,所以你应该问“这其中的一个我想要做什么?”如果它存在的open
将痛殴文件,而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
是打开文件进行读取或写入。根据给定的模式,打开命令还可以创建一个文件,如果它不存在。
使用touch
意味着调用单独的工艺(一个外壳),所以给定的此限制,open
API命令是优选的。
打开功能是用来读取/写入文件。该功能采用了文件描述符,然后写入指定的文件。而触摸功能创建一个新的文件。
open
:用于读/写。
touch
:用于更新/修改。
但是,touch
打开通过实际克隆本身(perl的克隆)进行运行的另一个进程的壳。