使用反引号或exec()
或system()
执行命令。
答案 0 :(得分:4)
是的,几乎在所有情况下这都是糟糕的做法!如果你有选择的话,尤其如此。
执行外部命令是:
非常难以正确(但很容易获得工作)。您无法逃脱shell args并将其称为一天,您必须考虑潜在的不同语言的多个级别的转义。
<强>慢即可。 fork + exec例如rm
比相应的系统调用慢一千倍。
严格,容易出错且无法解释的集成点。您通常必须将数据转换为平面字符串列表并返回。您无法使用语言的功能,如异常处理,嵌套数据结构或回调。
由于这个原因,以下是不良原因来调用外部命令:
不知道如何用您的语言执行X,但知道shell命令。一个典型的例子是cp -R foo bar
。
不知道某些东西是如何工作的,但知道shell oneliner就是这样做的。一个典型的例子是foo *.mp4 > >(tee file)
。
不想学习新的API,例如json或http,而是使用jq
或curl
等shell工具。
但是,如果您正在调用一个执行非平凡事情的程序,那么它没有本机库或绑定,并且您知道如何使用execve
语义调用(NOT {{1并且perl system
语义调用shell),这是一个有价值的工具。
执行上述所有外部命令的良好用法示例是调用exec
从安装程序构建项目,或运行make
以启动Minecraft服务器。
答案 1 :(得分:2)
某些操作系统命令可能具有语言不可用的内置功能(perl的mkdir()缺少* ix mkdir的-p)。然后,使用语言结构而不是解析输出(readdir()vs ls
)可能更容易做到。
重要的是要记住,用perl编写的东西可能比调用特定于os的外部程序更容易移植到非unix系统。
答案 2 :(得分:2)
这是一个很棒的 * 练习。 Perl和PHP非常适合很多东西,但是它们并不是很好用,并且在项目中使用外部程序和其他工具有一个用例。但Perl绝对擅长的一件事就是将输入和输出格式粘合在一起,让你将几个不同的工具混合到一个项目中,让项目的每个部分都做到最好。
* 我的意思是,通常是一种很好的做法。像@files=qx(ls $dir)
和@txt=qx(cat $textfile)
这样的事情让所有正确思考的Perl程序员都感到畏缩。
答案 3 :(得分:0)