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

将数组存储到Perl哈希中的正确语法是什么?,perl,arrays,data-structures,hash,Perl,Arrays,Data Structures,Hash,我正在创建一个新对象,如下所示: TestObject->new(@array1, @array2) sub new { my $class = shift; my $self = {}; my $self->{Array1} = shift; my $self->{Array2} = shift; bless($self, $class); return $self; } 我的new方法如下所示: TestObject->new(@ar

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

TestObject->new(@array1, @array2)
sub new {
  my $class = shift;
  my $self = {};

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

  bless($self, $class);

  return $self;
}
我的
new
方法如下所示:

TestObject->new(@array1, @array2)
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 "})"

建议?我读过,但他们没有使用
shift
方法的参数创建数组散列的示例。所以我的问题可能就在那里。

当您将数组作为参数传递时,它们是平坦的。您可以传递对它们的引用。看


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


您需要取消阵列引用:

@{$self->{Array2}}

顺便说一下,如果你正在使用OO,我强烈建议你研究一下。这会让你的生活更轻松

您需要取消阵列引用:

@{$self->{Array2}}

顺便说一下,如果你正在使用OO,我强烈建议你研究一下。这会让你的生活更轻松

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

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

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

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

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

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

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

你可能要找的语法是:

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

请注意如何使用
@

解除对数组的引用您正在移动一个arrayref而不是一个实际数组

你可能要找的语法是:

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


注意数组是如何使用
@

解除引用的,不过我认为您首先也需要引用它,对吗?就像新的(\@array1,\@array2)?那样有效。当我尝试这样做时,我只是尝试了@$self->{Array2},忘记了$self->{Array2}周围的{和}。这个答案完全忽略了将实际数组传递到函数中的问题,这意味着代码可能会编译,但会编译DTWT。我认为您首先也需要引用它,对吗?就像新的(\@array1,\@array2)?那样有效。当我尝试这样做时,我只是尝试了@$self->{Array2},忘记了$self->{Array2}周围的{and}。这个答案完全忽略了将实际数组传递到函数中的问题,这意味着代码可能会编译,但会进行DTWT。另外,请注意,这将修改原始数组,而不是它的副本。我想这是他想要的,因为他使用了
shift
而不是订阅,但这仍然值得一提+1还要注意,这将修改原始数组,而不是它的副本。我认为这是他想要的,因为他使用的是
shift
,而不是订阅,但这仍然值得一提+1new(\@array1,\@array2)将更加高效,因为[@foo]创建了一个新的匿名数组,然后(浅显地)将@foo的元素复制到该数组中,而\@foo创建了对现有数组的引用。还要注意,在Perl中,我们通常将其称为引用,而不是指针。Perl中没有类似C的指针。这正是因为我通常使用[]语法而不是\@。对象应该封装数据;它不能对这些数组在其上下文之外发生的任何事情负责。只有在极少数情况下才会提出效率问题,即我们必须处理大量数据并微调数据复制Catwalk:那么您可能需要深度复制(例如Storable::dclone)
[@foo]
将复制@foo中的值,但如果值本身是引用,则新数组仍将连接到可从旧数组访问的值。[替换以前完全错误的注释:]实际上,封装问题应该归被调用方处理。让打电话的人随心所欲;如果你想不受参数变化的影响,在被调用方中进行复制;对象的数据版本是否也被更改?令人惊讶的是,这经常被忽视!new(\@array1,\@array2)将更加高效,因为[@foo]创建了一个新的匿名数组,然后(浅显地)将@foo的元素复制到该数组中,而\@foo创建了对现有数组的引用。还要注意,在Perl中,我们通常将其称为引用,而不是指针。Perl中没有类似C的指针。这正是因为我通常使用[]语法而不是\@。对象应该封装数据;它不能对这些数组在其上下文之外发生的任何事情负责。只有在极少数情况下才会提出效率问题,即我们必须处理大量数据并微调数据复制Catwalk:那么您可能需要深度复制(例如Storable::dclone)
[@foo]
将复制@foo中的值,但如果值本身是引用,则新数组仍将连接到可从旧数组访问的值。[替换以前完全错误的注释:]实际上,封装问题应该归被调用方处理。让打电话的人随心所欲;如果你想不受参数变化的影响,在被调用方中进行复制;对象的数据版本是否也被更改?令人惊讶的是,这经常被忽视!次要缺点:不要在Perl中使用间接对象语法(新的Foo与更好的Foo->new相反)。参见也不要使用所有小写的包名。Minor nit:不要在Perl中使用间接对象语法(new Foo,而不是更好的Foo->new)。参见也不要使用所有小写的包名。这到底是什么<代码>移位(我的$self->{Array1})这到底是什么<代码>移位(my$self->{Array1})