gpt4 book ai didi

Perl 模块类方法 vs 普通子程序

转载 作者:行者123 更新时间:2023-12-04 18:05:46 24 4
gpt4 key购买 nike

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

Package 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 代码,我只会使用类方法选项(如 Bar 示例),但在阅读了前同事的一些代码后,我开始思考这个问题,这些代码使用了 Foo 示例中的语法。两者似乎本质上都在做同样的事情,但似乎有更多的东西。

最佳答案

决定因素是您的 Module 是否是面向对象的模块。

  • 如果 Module 只是子例程集合的容器,那么我希望它使用 Exporter 并提供将其子例程的子集导入调用 namespace 的机会。一个例子是 List::Util
  • 另一方面,如果有一个构造函数 Module::new ,并且打算以面向对象的方式使用它,那么您不应该将简单的子例程与方法混合(可能除了模块内部使用的私有(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;

    酒吧.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 模块类方法 vs 普通子程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28634680/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com