使用Perl模块与使用system()调用

时间:2013-11-30 10:45:09

标签: perl cpanel

最近,我在Perl中为cPanel插件编写了一些脚本,其中尽管大多数代码都在Perl中,但是还有很多system()命令,我用它直接执行shell命令。

我很确定我可以使用Perl模块代替。记住时间紧迫,我认为使用系统命令更容易(及时完成项目)。回顾过去,我认为这是一个糟糕的编程实践。

我的问题是,在使用Perl的模块和使用system()命令时,是否有任何权衡,内存或其他方面。例如,使用时会有什么不同:

my $directory = "temp";
mkdir $directory;

system ("mkdir temp");

另外,如果我要使用Perl模块,那么在开始时是否会涉及安装大量模块?

1 个答案:

答案 0 :(得分:9)

最明显的经济是,在第一种情况下,你的Perl进程正在创建目录,而在第二种情况下,Perl正在启动一个运行命令shell的新进程,该命令shell解析命令行并运行shell {{ 1}}命令创建目录,然后删除子进程。您将创建和删除流程并运行shell,以便每次调用mkdir:没有进程或类似经济的缓存。

第二件事是,如果您的原始system失败,则在Perl中处理错误很简单,而shelling运行mkdir命令会使您的程序处于与错误的距离,处理可能出现的许多不同问题更加尴尬。

还有可维护性和可移植性的问题,即使您不希望在多台计算机上运行程序,也会对您产生影响。一旦你放弃对mkdir命令的控制,你无法控制发生的事情。我本来可以编写一个system删除你的主目录,或者不那么灾难性的,你的程序可能会发现自己在mkdir不存在的系统上,或者做了一些略有不同的事情。

mkdir的特定情况下,这是一个内置的Perl运算符,是每个Perl安装的一部分。还有许多核心库要求您将mkdir放入程序中,但已经安装,无需进一步操作。

我相信其他人会提出更多理由来选择Perl操作符或模块而不是shell命令。一般来说,您应该更喜欢在语言中保留所有内容。只有少数情况下您 运行第三方程序,而且它们通常涉及允许您使用专有数据格式的自定义软件。