所以我想知道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/

    10-12 04:49