Как я могу заменить массив на ключевое слово macro like в Perl?

#perl

#perl

Вопрос:

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

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

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

например

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

Ответ №1:

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

 my $array3 = [ map {Field1 => "FieldValue1"}, 1..5 ];
  

Ответ №2:

Каждый раз, когда вы обнаруживаете, что повторяете шаблонный код, 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. Звучит здорово. Что, если бы я хотел чередовать одну конкретную структуру между двумя последовательностями make_struct? например, мой $array = [make_struct, { myCustomStruct => «blah»}, make_struct];

Ответ №3:

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

В итоге я использовал 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',
   },
));