Каков правильный синтаксис для хранения массива в хэше Perl? - PullRequest
1 голос
/ 16 ноября 2009

Я создаю новый объект, подобный этому:

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 "})"

Предложения? Я прочитал эту страницу о структурах данных Perl , но у них нет примеров создания хэшей массивов с использованием аргументов метода, использующего shift Так что моя проблема может быть там.

Ответы [ 4 ]

5 голосов
/ 16 ноября 2009

Когда вы передаете массивы как параметры, они сглаживаются. Вы можете передавать ссылки на них. См 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;
4 голосов
/ 16 ноября 2009

Вы должны использовать указатели на массивы, а не массивы в этом случае:

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

, а затем и позже

my $array1Value = shift(@{$self->{Array1}});
1 голос
/ 16 ноября 2009

Вы сдвигаете arrayref вместо фактического массива.

Синтаксис, который вы, вероятно, ищете:

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

Обратите внимание, как разыменовывается массив, используя @.

0 голосов
/ 16 ноября 2009

вам нужно разыменовать массив ref:

@{$self->{Array2}}

Кстати, если вы используете OO, я настоятельно рекомендую вам взглянуть на Moose . Это сделает вашу жизнь намного проще!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...