如何在Perl中将数组替换为像关键字一样的宏?

时间:2011-06-08 22:22:57

标签: perl

我在模块中定义了很多结构数组。 e.g。

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

我经常重复结构序列。例如,我可能有五个{Field1 => “FieldValue1”}连续排列。是否可以在某些数据结构中保存结构序列并将其插入到我的数组中?

e.g。

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

3 个答案:

答案 0 :(得分:1)

你可以这样做,但他们都会结束彼此的副本。因此,编辑第一个将改变所有这些。而是使用map

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

答案 1 :(得分:1)

任何时候你发现自己都在重复样板代码,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

换句话说,编写一个为您返回新数据结构的子例程。如果您需要自定义结构,子例程可以采用多种选项。

答案 2 :(得分:0)

上面的答案很适合他们自己的目的,但他们并不完全是我想要的。

我最终用push()来创建数组。 $templatearray1$templatearray2是结构数组。 Push()的行为是不插入数组引用。相反,它会插入数组的元素。 e.g。

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',
   },
));