Perl-скрипт для получения первого элемента массивов, переданного как ссылка - PullRequest
3 голосов
/ 11 ноября 2011

Я хочу вызвать подпрограмму, передав ей около 4 массивов, затем получить первое значение каждого массива и затем создать новый массив (массив первых элементов переданных массивов) в подпрограмме, а затем вернуть обратномассив.Вот код, который я пробовал с

my @a = (97,34,6,7);
my @b = ("A", "B", "F", "D");
my @c = (5..15);
my @d = (1..10);
my @tailings = popmany ( \@a, \@b, \@c, \@d );

print @tailings;

sub popmany {
    my @retlist = ();
    for my $aref (@_) {            #1
        my $arrele = @$aref;       #2
        push @retlist , $arrele    #3
    }
    return @retlist;
}

Здесь в # 1 я использую цикл и получаю первый массив, затем в строке 2 я назначаю весь массив переменной, думая, что по умолчанию perl будетхранить только первую переменную массива в @arrele.Когда я помещаю $ arrele в новый массив @retlist, извините, я не обращаюсь ни к каким примечаниям, поэтому моя процедура может быть неправильной.Но это приводит меня к выводу вроде 441110

, который не имеет смысла.

Пожалуйста, объясните мне код, как я могу это сделать.

Ответы [ 4 ]

10 голосов
/ 11 ноября 2011

Это здесь:

my $arrele = @$aref;

, где вы просите perl поместить @{$aref} в скалярный контекст, который возвращает длину (количество элементов в) массива, на который указывает $ aref.

Вместо этого попробуйте:

my $arrele = $aref->[0];

, который вместо этого получит доступ к первому элементу массива.

5 голосов
/ 11 ноября 2011

Строка

my $arrele = @$aref;  

назначает длину массива @$aref для $arrele.Чтобы получить первый элемент массива, вы можете использовать любой из:

my $arrele = $$aref[0];
my $arrele = $aref->[0];    
my ($arrele) = @$aref;  # note the parenthesis which create list context

Кроме того, поскольку вы генерируете список на основе другого списка, вы можете использовать map:

sub popmany {
    return map $_->[0], @_;
}
1 голос
/ 11 ноября 2011

Гораздо проще записать как

  sub popmany 
  {
    map $_->[0], @_;
  }
1 голос
/ 11 ноября 2011
sub popmany { 
    my @retlist = (); 
    for my $aref (@_) { #1 
        my $arrele = @$aref[0]; #2 
        push @retlist , $arrele#3 
    } 
    return @retlist; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...