这段代码是否创建了匿名的Perl哈希?

Geo*_*Geo 0 perl hash

在阅读所提供的片段FormFiller(这里我有点意外了),我注意到这条线:

$f->add_filler( password => Interactive => []);
Run Code Online (Sandbox Code Playgroud)

password => Interactive => []相当于{"password" => {"Interactive"=>[]}}?如果没有,它会变成什么?

Eth*_*her 7

=>在语义上(几乎)相同,(参见perldoc perlop的 "逗号运算符" ),所以你这样做:

$f->add_filler( 'password', 'Interactive', [] );
Run Code Online (Sandbox Code Playgroud)

如果该方法支持此调用样式(它不支持),则它本身必须将这些参数转换为

{ password => { Interactive => [] } }
Run Code Online (Sandbox Code Playgroud)

但更典型的是,哈希样式的参数将作为合法哈希传递,以开头:

$f->add_filler( password => { Interactive => 1 } );
Run Code Online (Sandbox Code Playgroud)

这将由这样的函数接收:

sub add_filler
{
    my $this = shift;
    my %configs = @_;
    # ...
}
Run Code Online (Sandbox Code Playgroud)

  • 不,那仍然是两个论点.通过将参数列表读入哈希而不是数组,该方法可以选择将这些参数解释为哈希:`my $ this = shift; 我的%config = @_;` (3认同)

dav*_*420 5

不,它完全一样

$f->add_filler( "password", "Interactive", []);
Run Code Online (Sandbox Code Playgroud)


Gre*_*con 5

Data::Dumper模块非常适合回答这样的问题.使用以下mock:

package Foo;
use Data::Dumper;
sub new { bless {} => shift }
sub add_filler {
  my $self = shift;
  print Dumper \@_;
}
Run Code Online (Sandbox Code Playgroud)

然后打电话给它

package main;
my $f = Foo->new;
$f->add_filler( password => Interactive => []);
Run Code Online (Sandbox Code Playgroud)

看看你什么时候得到:

$VAR1 = [
          'password',
          'Interactive',
          []
        ];
Run Code Online (Sandbox Code Playgroud)

这表明add_filler接收到三个参数的平面列表:两个字符串和对匿名数组的引用.