在Perl“open函数”和“接触命令”之间的区别?

问题描述 投票:2回答:5

什么是在以下两种情况的文件创建的差异。

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

  `touch newfile.txt`;             #2.using touch command  

哪一个更好,快?注意:当同时打开功能和Perl脚本中使用触摸命令,其用于创建空文件的考虑。

linux perl file
5个回答
5
投票

该明显的区别是,在第二种情况下你出去到系统中。甲壳开始运行于命令或经由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)),如上面所讨论的。


3
投票

*哪一个更好,快?

这个问题是没有意义的。这两个片段是不等价的,所以你应该问“这其中的一个我想要做什么?”如果它存在的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;

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


0
投票

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

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

open是打开文件进行读取或写入。根据给定的模式,打开命令还可以创建一个文件,如果它不存在。

使用touch意味着调用单独的工艺(一个外壳),所以给定的此限制,open API命令是优选的。


0
投票

打开功能是用来读取/写入文件。该功能采用了文件描述符,然后写入指定的文件。而触摸功能创建一个新的文件。


0
投票

open:用于读/写。

touch:用于更新/修改。

但是,touch打开通过实际克隆本身(perl的克隆)进行运行的另一个进程的壳。

© www.soinside.com 2019 - 2024. All rights reserved.