将数组存储到Perl哈希中的正确语法是什么?

时间:2009-11-16 14:20:28

标签: perl arrays data-structures hash

我正在创建一个像这样的新对象:

TestObject->new(@array1, @array2)

我的new方法如下所示:

sub new {
  my $class = shift;
  my $self = {};

  my $self->{Array1} = shift;
  my $self->{Array2} = shift;

  bless($self, $class);

  return $self;
}

作为访问数据的简单测试,我正在尝试这个,然后一旦我开始工作,我就可以构建更有意义的逻辑:

sub mymethod {
  my $self = shift;
  my $param = shift;

  my $array1Value = shift(my $self->{Array1});
  my $array2Value = shift(my $self->{Array2});

  print $array1Value." ".$array2Value;
}

但是当我致电mymethod时,我收到了这个错误:

Type of arg 1 to shift must be array (not hash element) at Tests/MyObject.pm line 21, near "})"

连连呢?我读了this page on Perl data structures,但他们没有使用shift方法创建数组哈希的示例。所以我的问题可能就在那里。

4 个答案:

答案 0 :(得分:5)

将数组作为参数传递时,它们会被展平。您可以传递对它们的引用。见perlsub

#!/usr/bin/env perl

package foo;

sub new {
    my $class = shift;
    my $self = {};

    $self->{Array1} = shift;
    $self->{Array2} = shift;

    bless($self, $class);

    return $self;
}

sub mymethod {
  my $self = shift;
  my $param = shift;

  my $array1Value = shift( @{$self->{Array1}} );
  my $array2Value = shift( @{$self->{Array2}} );

  print "$array1Value $array2Value\n";
}

package main;

my @a = ( 0, 1, 2);
my @b = ( 3, 4, 5);
my $o = new foo( \@a, \@b );;
$o->mymethod;

答案 1 :(得分:4)

在这种情况下,你必须使用指向数组的指针,而不是数组:

  TestObject->new([@array1], [@array2])

然后再

my $array1Value = shift(@{$self->{Array1}});

答案 2 :(得分:1)

您正在移动arrayref而不是实际数组。

你可能正在寻找的语法是:

my $array1Value = shift @{ $self->{Array1} };
my $array2Value = shift @{ $self->{Array2} };

注意如何使用@取消引用数组。

答案 3 :(得分:0)

你需要退出数组ref:

@{$self->{Array2}}

顺便说一句,如果你使用OO,我强调建议你研究一下Moose。它会让你的生活更轻松!