下面两种情况下的文件创建有什么区别。
open(DATA,">newfile.txt"); #1.using open function close(DATA); `touch newfile.txt`; #2.using touch command
哪一个更好更快?注:当open函数和touch命令都用在Perl脚本中时,则考虑其用于创建空文件。
9rnv2umw1#
第 二 种 情况 的 明显 区别 在于 , 你 要 去 系统 。 启动 一 个 shell 来 运行 命令 , 或者 通过 execvp 系统 调用 来 运行 命令 ( 取决 于 参数 , 见 下文 ) 。 有 很多 事情 要 做 , 而且 很多 事情 也 可能 出错 。更 重要 的 是 , 还有 更多 的 事情 要 做 。 如果 文件 已经 存在 怎么 办 ? 首先 , open 会 截断 它 , 而 touch 只 会 更新 时间 戳 。 但是 你 想要 一 个 * 新 * 文件 , 所以 无论 如何 你 都 需要 先 检查 一下 。 如果 失败 了 怎么 办 ? 你 需要 检查 一下 。 因此 这 应该 是 一 个 小 例程 。那么 就 用 Perl 来 写 吧 。 委托 这么 简单 的 工作 没有 任何 好处 , 只有 陷阱 。注意 : 使用 三 个 参数 open
execvp
open
touch
open my $fh, '>', $file or ...
中 的 每 一 个这样 你 就 有 了 一 个 更 好 的 * 词法 ( 间接 ) 文件 句柄 * 来 使用 。感谢 hek2mgi 的 评论 和 ikegami 的 澄清 , qx 可以 根据 参数 绕过 shell ( 什么 看 起来 没有 文档 记录 ? ) † , 很 像 system 。根据 hek2mgi 注解 , 可以 通过 strace -f script.pl 对此 进行 检查 , 其中 , 在 脚本 中 使用 qx(touch "NEW") 时 , 我们 可以 找到 以下 行
strace -f script.pl
qx(touch "NEW")
[pid 24332] execve("/bin/sh", ["sh", "-c", "touch \"NEWFILE\""], [/* ...
格式而 qx(touch NEW) 的 输出 中 没有 /bin/sh ( 没有 引号 , 没有 shell ) 。需要 注意 的 是 , qx 确实 接受 一 个 数组 ( 文档 中 未 提及 ) , 这 显然 是 插值 的 。
qx(touch NEW)
/bin/sh
qx
[pid 30773] execve("/bin/sh", ["sh", "-c", "ls -l > tt.out"], [/* ...
格式然后 , 如 上文 所 述 , 如果 需要 , 则 运行 shell ( 本 示例 ) , 否则 不 运行 shell ( qw(ls -l ) 。† 但 在 这 一 点 上 ( 2022 年 10 月 ) , 我 确实 在 qx 文档 中 找到 了 它 , 响亮 而 清晰 , 而且 是 预先 的
qw(ls -l
ehxuflar2#
这个问题毫无意义。这两个代码段并不等价,所以您应该问“哪个代码段可以完成我想要的任务?”如果文件存在,open将删除该文件,而touch将保持该文件不变。至于在使用系统调用和使用外部命令之间哪一个更好,答案是显而易见的,如果你不从这个问题中忽略大多数代码的话!直接使用系统调用:
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;
正如你所看到的,用shellout来实现要复杂得多,也容易出错。当然,启动整个程序来进行系统调用比只进行系统调用要慢得多。
zbdgwd5y3#
这是两个截然不同的命令。touch用于修改文件的访问和修改时间。默认情况下,它会将访问和修改时间设置为当前时间,如果文件不存在-它会将其创建为空文件。open用于打开文件进行阅读或写入。根据给定的模式,如果文件不存在,open命令也可以创建文件。使用touch意味着调用一个单独的进程(shell),因此考虑到这一限制,首选open API命令。
u0sqgete4#
open:用于读/写。touch:用于更新/修改。但是,touch通过实际克隆自身(perl克隆)来打开shell,以运行另一个进程。
taor4pac5#
打开函数用于读/写文件。该函数使用文件描述符,然后写入指定的文件。而触摸函数创建一个新文件。
5条答案
按热度按时间9rnv2umw1#
第 二 种 情况 的 明显 区别 在于 , 你 要 去 系统 。 启动 一 个 shell 来 运行 命令 , 或者 通过
execvp
系统 调用 来 运行 命令 ( 取决 于 参数 , 见 下文 ) 。 有 很多 事情 要 做 , 而且 很多 事情 也 可能 出错 。更 重要 的 是 , 还有 更多 的 事情 要 做 。 如果 文件 已经 存在 怎么 办 ? 首先 ,
open
会 截断 它 , 而touch
只 会 更新 时间 戳 。 但是 你 想要 一 个 * 新 * 文件 , 所以 无论 如何 你 都 需要 先 检查 一下 。 如果 失败 了 怎么 办 ? 你 需要 检查 一下 。 因此 这 应该 是 一 个 小 例程 。那么 就 用 Perl 来 写 吧 。 委托 这么 简单 的 工作 没有 任何 好处 , 只有 陷阱 。
注意 : 使用 三 个 参数
open
中 的 每 一 个
这样 你 就 有 了 一 个 更 好 的 * 词法 ( 间接 ) 文件 句柄 * 来 使用 。
感谢 hek2mgi 的 评论 和 ikegami 的 澄清 , qx 可以 根据 参数 绕过 shell ( 什么 看 起来 没有 文档 记录 ? ) † , 很 像 system 。
根据 hek2mgi 注解 , 可以 通过
strace -f script.pl
对此 进行 检查 , 其中 , 在 脚本 中 使用qx(touch "NEW")
时 , 我们 可以 找到 以下 行格式
而
qx(touch NEW)
的 输出 中 没有/bin/sh
( 没有 引号 , 没有 shell ) 。需要 注意 的 是 ,
qx
确实 接受 一 个 数组 ( 文档 中 未 提及 ) , 这 显然 是 插值 的 。格式
然后 , 如 上文 所 述 , 如果 需要 , 则 运行 shell ( 本 示例 ) , 否则 不 运行 shell (
qw(ls -l
) 。† 但 在 这 一 点 上 ( 2022 年 10 月 ) , 我 确实 在
qx
文档 中 找到 了 它 , 响亮 而 清晰 , 而且 是 预先 的ehxuflar2#
这个问题毫无意义。这两个代码段并不等价,所以您应该问“哪个代码段可以完成我想要的任务?”如果文件存在,
open
将删除该文件,而touch
将保持该文件不变。至于在使用系统调用和使用外部命令之间哪一个更好,答案是显而易见的,如果你不从这个问题中忽略大多数代码的话!
直接使用系统调用:
通过外部命令使用系统调用:
正如你所看到的,用shellout来实现要复杂得多,也容易出错。当然,启动整个程序来进行系统调用比只进行系统调用要慢得多。
zbdgwd5y3#
这是两个截然不同的命令。
touch
用于修改文件的访问和修改时间。默认情况下,它会将访问和修改时间设置为当前时间,如果文件不存在-它会将其创建为空文件。open
用于打开文件进行阅读或写入。根据给定的模式,如果文件不存在,open命令也可以创建文件。使用
touch
意味着调用一个单独的进程(shell),因此考虑到这一限制,首选open
API命令。u0sqgete4#
open
:用于读/写。touch
:用于更新/修改。但是,
touch
通过实际克隆自身(perl克隆)来打开shell,以运行另一个进程。taor4pac5#
打开函数用于读/写文件。该函数使用文件描述符,然后写入指定的文件。而触摸函数创建一个新文件。