3

我试图在 Perl 中使用命名参数。我一直在使用http://perldesignpatterns.com/?NamedArguments作为参考。

这似乎是有道理的。但是,我似乎无法真正获得发送的值。

我也尝试过更改为$args{'name'}$args{"name"}但没有运气。我似乎无法获得传入的值。我需要查看哪个方向来弄清楚到底发生了什么?

文件 .pm

package doh;
sub new ()
{
   my %args = @_;
   $name = $args{name};
   print $name;
}
1;
__END__

文件 test.pl

use warnings;
use doh;
$trial = doh::;
$trial->new(name => "Tyson");

运行 test.pl 时不打印输出。

4

1 回答 1

9

我不确定你要做什么$trial = doh::;,但你的主要问题是你试图在处理你的方法调用者之前处理参数。

首先,启动每个 Perl 文件

use strict;
use warnings;

是的,你需要两者。

->在 Perl 中调用方法时(与普通子例程相反),运算符左侧的东西(调用)被推到参数列表的开头。因此,您需要先将其从列表中删除。对于您的构造方法,调用者通常是类名。对于实例方法,它将是对象本身。所以

sub new {
    my $class = shift;
    my %args = @_;

    print "name is: $args{name}\n";
}

(不想用shift也可以直接写my ( $class, %args ) = @_;

对于实例方法,约定是命名变量$self

另请注意,我已经删除了子例程名称后面的括号;这些对 OO 方法没有任何功能,而且它们可能不会按照您的想法去做。

于 2012-10-18T19:57:08.350 回答