在以下两种情况下创build文件有什么不同?
open(DATA,">newfile.txt"); #1.using open function close(DATA); `touch newfile.txt`; #2.using touch command
哪一个更好,更快? 注意:在Perl脚本中同时使用open函数和touch命令,并考虑用于创build空文件。
文件按string一行input到数组中
明显的区别在于,在第二种情况下,你要出门到系统。 启动一个运行该命令的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 )),如上所述。
*哪一个更好更快?
这个问题没有意义。 这两个片段是不相同的,所以你应该问“哪一个做我想要的? open会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是为了打开文件阅读或写作。 根据给定的模式,open命令也可以创建一个不存在的文件。
要使用touch手段来调用一个单独的进程(一个shell),所以给定的限制, open API命令是首选。
打开功能用于读取/写入文件。 该函数使用文件描述符,然后写入指定的文件。 而触摸功能创建一个新的文件。
open :用于读/写。
touch :用于更新/修改。
但是, touch通过实际克隆(perl克隆)来运行另一个进程来打开一个shell。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。