Как я могу заменить массив для макро как ключевое слово в Perl? - PullRequest
1 голос
/ 09 июня 2011

Я определяю множество массивов структур в модуле. например,

my $array = [
   {
      Field1 => "FieldValue1"
   },
   {
      #etc...
   },
];
my $array2 = [
   {
      Field1 => "FieldValue1"
   },
   {
      #etc...
   },
];

Я часто повторяю последовательности структур. Например, у меня может быть пять {Field1 => "FieldValue1"} структур подряд. Можно ли сохранить последовательность структур в некоторой структуре данных и вставить ее в мои массивы?

, например

my $array3 = [ $Field1, $Field1, $Field1 ]; # $Field1 is a sequence of structs

Ответы [ 3 ]

1 голос
/ 09 июня 2011

Каждый раз, когда вы обнаруживаете, что повторяете шаблонный код, Perl обычно обходится без него.

Мне не совсем понятно, что вы хотите сделать, но вы могли бы сделать что-то вроде этого:

sub make_struct {
    {Field1 => "FieldValue1"}
}

my $array = [map make_struct, 1 .. 10];  # array with 10 hashes

sub make_struct_array {[map make_struct, 1 .. $_[0]]}

my $array2 = make_struct_array 20;  # array with 20 hashes

Итак, другими словами, напишите подпрограмму, которая возвращает новую структуру данных для вас. Подпрограмма может принимать различные варианты, если вам нужно настроить структуру.

1 голос
/ 09 июня 2011

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

my $array3 = [ map {Field1 => "FieldValue1"}, 1..5 ];
0 голосов
/ 09 июня 2011

Ответы выше работают хорошо для их собственных целей, но они не совсем то, что я хотел.

В итоге я использовал push() для создания массивов. $templatearray1 и $templatearray2 являются массивами структур. Поведение Push () состоит в том, чтобы не вставлять ссылку на массив. Вместо этого он вставляет элементы массивов. например,

my $myarray = [];
push(@$myarray, @$templatearray1);
push(@$myarray, @$templatearray2);
push(@$myarray, @$templatearray1);
push(@$myarray, @$templatearray2);
push(@$myarray, @$templatearray1);
push(@$myarray, @$templatearray2);
push(@$myarray, (
   {
      key1 => 'blah1',
      key2 => 'blah2',
   },
));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...