最近,我在Perl中为cPanel插件编写了一些脚本,其中尽管大多数代码都在Perl中,但是还有很多system()命令,我用它直接执行shell命令.
我很确定我可以使用Perl模块代替.记住时间紧迫,我认为使用系统命令更容易(及时完成项目).在回顾展中,我认为这是一个糟糕的编程实践.
我的问题是,在使用Perl的模块和使用system()命令时,是否有任何权衡,内存或其他方面.例如,使用时会有什么不同:
my $directory = "temp"; mkdir $directory;
和
system ("mkdir temp");
另外,如果我要使用Perl模块,那么开始时不会涉及安装大量模块吗?
最明显的经济是,在第一种情况下,你的Perl进程正在创建目录,而在第二种情况下,Perl正在启动一个运行命令shell的新进程,该命令shell解析命令行并运行shell mkdir
命令来创建目录,然后删除子进程.您将创建和删除进程并为每次调用运行shell system
:没有进程缓存或类似的经济.
我想到的第二件事是,如果你的原始版本mkdir
失败了,在Perl中处理错误很简单,而shelling out运行mkdir
命令会使你的程序与错误保持一定距离,处理起来更加尴尬可能出现的许多不同问题.
还有可维护性和可移植性的问题,即使您不希望在多台计算机上运行程序,也会影响您.一旦你放弃对system
命令的控制,你无法控制发生的事情.我本来可以写一个mkdir
会删除你的主目录,或者不那么灾难性的,你的程序可能会发现自己在一个mkdir
不存在的系统上,或者做了一些稍微不同的事情.
在特定情况下mkdir
,这是一个内置的Perl操作符,是每个Perl安装的一部分.还有许多核心库需要您放入use Module
您的程序,但已经安装,无需进一步操作.
我相信其他人会提出更多理由来选择Perl操作符或模块而不是shell命令.一般来说,您应该更喜欢在语言中保留所有内容.只有少数情况下您必须运行第三方程序,并且它们通常涉及允许您使用专有数据格式的自定义软件.