所以我想知道Perl类方法和标准模块中的普通子例程之间的使用是否存在任何差异.你有没有时间使用其中一个?对于这个例子,我假设在任一模块中都没有对象方法.
这里快速的小主要课程:
#!/usr/local/bin/perl use strict; use warnings; use Foo; use Bar; my $arg1 = "blah"; my ($str1,$str2); $str1 = Foo::subroutine($arg1); $str2 = Bar->subroutine($arg1); exit(0);
包Foo将保持我的普通子程序调用
use strict; use warnings; package Foo; sub subroutine { my $arg = shift; my $string = "Ordinary subroutine arg is $arg\n"; return $string; } 1;
use strict; use warnings; package Bar; sub subroutine { my $class = shift; my $arg = shift; my $string = "Class method arg is $arg\n"; return $string; } 1;
通常,如果我正在编写Perl代码,我只会使用类方法选项(就像使用Bar示例一样),但是我在阅读了一个使用Foo示例中的语法的前同事的代码之后开始思考这个问题.两者似乎本身都做同样的事情,但似乎不仅仅是满足于眼睛.
解决方法
决策程序是您的Module是否是面向对象的模块.
>如果Module只是一个子程序集合的容器,那么我希望它使用Exporter并提供将其子程序的子集导入调用名称空间的机会.一个例子是List :: Util
>另一方面,如果有一个构造函数Module :: new,并且打算以OO方式使用它,那么你不应该在方法中混合简单的子例程(除了模块可能在内部使用的私有子例程) ).一个例子是LWP :: UserAgent
所以我希望这些来源可以像其中一个或另一个一样写出来,而不是两者之间的混合.当然,在某些情况下应该忽略经验法则,但在这种情况下没有任何想法.
Foo.pm
use strict; use warnings; package Foo; use Exporter 'import'; our @EXPORT_OK = qw/ subroutine /; sub subroutine { my ($arg) = @_; "Ordinary subroutine arg is $arg\n"; } 1;
Bar.pm
use strict; use warnings; package Bar; sub new { my $class = shift; bless {},$class; } sub subroutine { my $class = shift; my ($arg) = @_; "Class method arg is $arg\n"; } 1;
main.pl
#!/usr/local/bin/perl use strict; use warnings; use Foo 'subroutine'; use Bar; my $arg1 = "blah"; print subroutine($arg1); print Bar->subroutine($arg1);
产量
Ordinary subroutine arg is blah Class method arg is blah