所以我想知道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;
Package Bar将保存我的类方法调用
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代码,我将只使用class方法选项(例如Bar示例),但是在从前同事那里读取了一些使用Foo示例中的语法的代码后,我开始思考这个问题。两者似乎本质上都在做相同的事情,但是似乎不止于此。
最佳答案
决定者是您的Module
是否是面向对象的模块。
Module
只是一个子例程集合的容器,那么我希望它使用Exporter
并提供将其子例程的子集导入到调用 namespace 的机会。一个示例是List::Util
Module::new
,并且打算以一种OO方式使用它,那么您不应将简单的子例程与方法混合使用(也许模块内部使用的私有(private)子例程除外)。一个示例是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
关于Perl模块类方法与普通子例程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28634680/