Perl中“open function”和“touch command”的区别?

时间:2017-07-24 05:18:00

标签: linux perl file

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

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

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

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

5 个答案:

答案 0 :(得分:5)

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

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

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

注意:使用三参数open

open my $fh, '>', $file

进行所有必要的检查。然后你还可以使用更好的词法(间接)文件句柄

感谢hek2mgi提供评论,感谢ikegami澄清qx可能会根据参数(看似未记录的内容)绕过shell,与system非常相似。

可以strace -f script.pl根据qx(touch "NEW")评论来检查这个问题,我们在脚本中找到/bin/sh

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

虽然脚本中qx(touch NEW)的输出中没有qx(没有引号,没有shell)。

要注意,strace -f确实接受了一个阵列(在文档中未提及),它明显被插值。这可以从qx(@cmd) @cmd = qw(ls -l > tt.out)的{​​{1}}输出qw(ls -l看出来,其中

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

如上所述,如果需要,则运行shell(此示例),否则运行("meetingDuration": "PT2H"))。

答案 1 :(得分:2)

  

*哪一个更快更好?

这个问题毫无意义。这两个片段不相同,所以你应该问“这些中的哪一个能做我想要的?” open会破坏文件(如果存在),而touch则会保持不变。

至于在使用系统调用vs shelling out运行外部命令之间哪个更好,如果你不遗漏问题的大部分代码,答案是显而易见的!

直接使用系统调用:

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;

正如您所看到的,炮轰更加复杂且容易出错。当然,启动整个程序来进行系统调用而不仅仅是进行系统调用要慢得多。

答案 2 :(得分:0)

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

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

open用于打开文件进行读写。根据给定的模式,open命令也可以创建一个文件(如果它不存在)。

使用touch表示调用单独的进程(shell),因此在给定限制的情况下,首选open API命令。

答案 3 :(得分:0)

Open函数用于读/写文件。该函数使用文件描述符,然后写入指定的文件。而touch功能会创建一个新文件。

答案 4 :(得分:0)

open:用于读/写。

touch:用于更新/修改。

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