Передача массивов в подпрограмму, которая печатает каждый массив отдельно - PullRequest
4 голосов
/ 29 июня 2011

Я знаю, что это, вероятно, простое исправление, но я не смог найти ответ через Google и поискать здесь вопросы.

Моя цель - передать несколько массивов в подпрограмму, которая простоперебирает каждый массив отдельно и печатает каждый массив с чем-то до и после него.

Что у меня есть:

@A1 = (1, 2, 3);
@A2 = (4, 5, 6);

printdata(@A1, @A2) ;

sub printdata {
   foreach(@_) {
      print "$_" ; 
      print "@@@"
      }
   }

Я пытаюсь получить:

123 @@@ 456 @@@

Вместо его леченияоба массива равны единице и выполняют итерацию по каждой переменной в массиве, помещая разделитель после каждой переменной, порождая весь массив.

1 @@@ 2 @@@ 3 @@@ и т. Д. *

Я не уверен, как заставить подпрограмму обрабатывать массивы как отдельные, а не как единое целое.

Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

6 голосов
/ 29 июня 2011

Вам необходимо передать массивы как ссылки:

@A1 = (1, 2, 3);
@A2 = (4, 5, 6);

printdata(\@A1, \@A2) ;

sub printdata {
   foreach(@_) {
      print @$_ ; 
      print "@@@"
      }
}

При дополнительном вызове массивы расширяются до списка скаляров, который затем передается в sub в переменной @_.Например:

printdata(@A1, @A2);

равно:

printdata(1,2,3,4,5,6);
5 голосов
/ 29 июня 2011
2 голосов
/ 29 июня 2011
use strict;
use warnings;
use English qw<$LIST_SEPARATOR>;

my @A1 = (1, 2, 3);
my @A2 = (4, 5, 6);
{   local $LIST_SEPARATOR = '';
    my @a = map { "@$_" } \@A1, \@A2;
    $LIST_SEPARATOR = '@@@';
    print "@a\n";
}

Вы также могли бы использовать join (po-tay-to, po-tah-to).

my @a = map { join( '', @$_ ) } \@A1, \@A2;
print join( '@@@', @a ), "\n";
...