通常建议不要在Perl代码中使用其他linux工具; 例如,如果有人打算打印文本文件的最后一行,他可以:
$last_line = `tail -1 $file` ;
Run Code Online (Sandbox Code Playgroud)
或者以其他方式打开文件并逐行阅读
open(INFO,$file);
while(<INFO>) {
$last_line = $_ if eof;
}
Run Code Online (Sandbox Code Playgroud)
使用上一个有什么陷阱,为什么我应该避免在我的代码中使用shell工具?
感谢名单,
Cha*_*ens 24
Ry4*_*ase 15
最好将所有操作保留在Perl中,因为它更快,因为它更安全.它更快,因为你没有产生一个新的进程,而且它更安全,因为你不必担心shell元字符欺骗.
例如,在你的第一个案例中如果$file
包含" afilename ; rm -rf ~
",那么你将是一个非常不开心的露营者.
PS做尾巴的最好的全部Perlway是使用File :: ReadBackwards
一个原因是您的Perl代码可能在没有名为'tail'的shell工具的环境中运行.
根据项目,这是个人电话:
用tail
?精细.但这确实是一个特例,因为它很容易使用,因为它是如此微不足道.
一般来说问题不是效率或可移植性,这在很大程度上是无关紧要的; 问题是易用性.要运行外部实用程序,您必须找出它接受的参数,编写代码以将程序的数据结构转换为该格式,正确引用它们,构建命令行并运行应用程序.然后,您可能必须提供数据并从中读取数据(涉及事件循环等复杂性,担心死锁等),最后解释返回值.(UNIX进程认为"0"为真,其他任何都是假的,但Perl假设相反. foo() and die
很难阅读.)这是很多工作要做,这就是人们避免它的原因.创建类的实例并在其上调用方法以获取所需的数据要容易得多.
(您可以通过这种方式抽象出进程;例如,请参阅Crypt :: GpgME.它处理与调用相关的复杂性gpg
,这通常涉及创建除STDOUT,STDIN和STDERR之外的多个文件句柄.)
归档时间: |
|
查看次数: |
536 次 |
最近记录: |