Perl: перебирать этот фанк-массив? - PullRequest
1 голос
/ 14 сентября 2010

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

@row1 = ( "Current Scan", "Last Month");
@row2 = ( "240", "0");
@row3 = ( "226", "209");
@row4 = ( "215", "207");

@array = (\@row1, \@row2, \@row3, \@row4);
print Dumper(@array);
printarray(@array);

Dumper дает мне следующий вывод:

$VAR1 = [
          'Current Scan',
          'Last Month'
        ];
$VAR2 = [
          '240',
          '0'
        ];
$VAR3 = [
          '226',
          '209'
        ];
$VAR4 = [
          '215',
          '207'
        ];

Я пробовал несколько циклов безуспешно.Каждый печатает только первую строку ($ VAR1) и выходит.Вот моя последняя попытка:

sub printarray {
  @array = shift;
  $rowi = 0;
  foreach my $row (@array) {
    for (my $coli = 0; $coli <= @$row; $coli++) {
      print "$array[$rowi][$coli]\n";
    }
    $rowi++;
  }
}

Я явно упускаю из виду нечто простое.Что я делаю неправильно?Заранее спасибо!

Ответы [ 5 ]

10 голосов
/ 14 сентября 2010

Если вы хотите просто напечатать массив, попробуйте следующий код:

foreach my $row (@array) {
   foreach my $elem (@$row) {
       print $elem; ## print elements without separator
   }
   print "\n"; ## new line after row
}

Если вам нужны индексы для какой-то цели, то мы идем:

for(my $row_i = 0; $row_i < @array; $row_i++) {
    for(my $column_i = 0; $column_i < @{ $array[$row_i] }; $column_i++) {
        print $array[$row_i][$column_i];
    }
}

Идея состоит в том, что @array в скалярном контексте возвращает количество элементов в массиве. И @{ $array[$row_i] } немного сложнее. Это массив разыменования, хранящийся в $array[$row_i].

Обновление для подпрограммы:

В Perl вы можете передать массив по ссылке:

 printarray(\@array); ## pass reference

 sub printarray {
     my $array_ref = shift; ## no copy created

     foreach my $row (@$array_ref) { ## now we need to dereference
         ...
     }
 }

Вы также можете передать копию массива:

 printarray(@array);

 sub printarray {
     my @array_copy = @_; ## store local copy of array
     ...
 }

Для получения более подробной информации смотрите Как я могу передать / вернуть {Function, FileHandle, Array, Hash, Method, Regex}? Страница справочника.

И, пожалуйста, добавьте use strict; в начале программы. Это заставит вас объявлять все переменные, но сэкономит кучу времени, если вы введете что-то неправильно.

3 голосов
/ 14 сентября 2010

Когда вы передаете массив в подпрограмму, вы по сути передаете восемь скаляров. Затем, когда вы делаете

sub printarray {
  @array = shift;

... вы выталкиваете только первый элемент в списке. Попробуйте:

sub printarray {
  @array = @_;
1 голос
/ 14 сентября 2010

Да, проблема в том, как вы передаете массив в подпрограмму.Perl выравнивает массивы в списках параметров.По сути, printarray(@array) (в данном примере) эквивалентно printarray($array[0], $array[1], $array[2], $array[3]).shift в начале printarray принимает первый параметр и присваивает его @array.Поэтому независимо от размера массива printarray видит только первый элемент.

1 голос
/ 14 сентября 2010
   #!/usr/bin/perl
   use warnings;
   use strict;

   my @row1 = ( "Current Scan", "Last Month");
   my @row2 = ( "240", "0");
   my @row3 = ( "226", "209");
   my @row4 = ( "215", "207");

   my @array = (\@row1, \@row2, \@row3, \@row4);

   foreach my $row (@array) {
     foreach my $value (@$row) {
        print "$value\n";
     }
   }

Это напечатает

  Current Scan
  Last Month
  240
  0
  226
  209
  215
  207

Не уверен, что это то, что вы хотели.

0 голосов
/ 14 сентября 2010

Вы ищете что-то вроде этого:

#!/usr/bin/perl
use warnings;
use strict;
use Algorithm::Loops 'MapCar';

my @row1 = ( "Current Scan", "Last Month");
my @row2 = ( "240", "0");
my @row3 = ( "226", "209");
my @row4 = ( "215", "207");

my @array = (\@row1, \@row2, \@row3, \@row4);

MapCar { print "Scan: $_[0]: $_[1], $_[2], $_[3]\n" } @array;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...