如何解析传递给定义为在Perl中接受2个参数的子例程的一个参数

1 perl subroutine

我正在创建一个新对象,如下所示:

my $new_obj = new P_module({key => 'abc'});
Run Code Online (Sandbox Code Playgroud)

P_module有一个构造函数,定义如下:

sub new {
    my ($pkg, $input) = @_;
    my $obj = {};
    bless ($obj, ref($pkg)||$pkg);
    $obj->{key} = $input->{key};
 }
Run Code Online (Sandbox Code Playgroud)

根据我的阅读,由于散列作为参数传递给new,它将表示为2元素数组.所以,pkg应该key而且input应该是abc.那么,如何obj掌握一把钥匙甚至是key什么$input->{key}意思呢?

ike*_*ami 6

首先,

my $new_obj = new P_module({ key => 'abc' });
Run Code Online (Sandbox Code Playgroud)

写得更好

my $new_obj = P_module->new({ key => 'abc' });
Run Code Online (Sandbox Code Playgroud)

这是短暂的

my %anon = ( key => 'abc' );
my $new_obj = P_module->new(\%anon);
Run Code Online (Sandbox Code Playgroud)

在进行方法调用时,调用者(左边的内容->)作为第一个参数传递.这意味着$pkg是字符串P_module,并且$input是返回的引用{ key => 'abc' }.

由于$input是对散列的引用,因此从引用的散列中$input->{key}获取带有键的元素key的值.


我怎么写这个:

sub new {
    my ($class, %args) = @_;
    my $self = bless({}, $class);      # If base class.
    #my $self = $class->SUPER::new();  # If inheriting.
    $self->{key} = $args{$key};
    return $self;
 }

 my $obj = P_module->new( key => 'abc' );
Run Code Online (Sandbox Code Playgroud)

调用者不需要哈希,也没有理由支持$existing_obj->new.它还使用更多标准名称$class$self.