迭代perl中的枚举

时间:2015-10-07 18:06:47

标签: perl enums

每次创建枚举时,我都会尝试创建(自动)数组。为此,我通过sub(myenum)发送所需的枚举数组,该子数据首先创建一个数组,然后调用enum(通过使用)。

在下面的示例中,我有两个枚举,一个直接,一个使用上述方法。我的方法不起作用:-(我做错了什么?

@enumArray=();

sub myenum($)
{
  my @a = split (/\s+/,$_[0]);
  my $prefix = $a[0];
  $prefix =~ s/^://;
  my $len = scalar @a;
  $len--;
  my $i=0;
  for ($i=1;$i<=$len;$i++) {
    push (@enumArray, "$prefix.$a[$i]");  
  }
  use enum (@enumArray);
}

myenum(":THIS a=100 b c");

use enum qw(:THAT a=999 b c);

print THISa . " " . THISb . " " . THISc . "\n";
print THATa . " " . THATb . " " . THATc . "\n";

2 个答案:

答案 0 :(得分:1)

use在编译时执行操作。具体地,

use enum qw( :THAT a=999 b c );

相当于

BEGIN {
   require enum;
   import enum qw( :THAT a=999 b c );
}

更详细地描述了here

这意味着你想要

BEGIN {
   require enum;
   import enum split ' ', ':THIS a=100 b c';
}

use enum qw( );
BEGIN { import enum split ' ', ':THIS a=100 b c'; }

use enum qw( );

sub myenum {
   import enum split ' ', $_[0];
}

BEGIN { myenum(':THIS a=100 b c') }

我假设以下不会做:

use enum split(' ', ':THIS a=100 b c');

答案 1 :(得分:0)

进一步调查@ ikegami的回答,我认为这是获得所需内容的一种方式。这涉及创建一个新的包myenum,它是enum上的一个简单包装器,它还维护一个枚举数组。

myenum.pm

package myenum;

use strict;
use warnings;

use enum;

# array with all enums
our @enums;

sub import {
    my $prefix = '';

    # basic parsing like what enum does
    for my $name (@_[1..$#_]) {
        if (substr($name, 0, 1) eq ':') {
            $prefix = substr($name, 1);
            next;
        }
        # add the enums to the array
        push @enums, $prefix . $name;
    }

    # call enum's import() as if it was called from the current caller
    goto &enum::import;
}

1;

主程序:

use strict;
use warnings;

use myenum qw(:THAT a=999 b c);

# this array has the enums
print "@myenum::enums\n";

print THATa . " " . THATb . " " . THATc . "\n";

# output:
#
# THATa=999 THATb THATc
# 999 1000 1001

注意:这只是我作为实验编写的大部分骨架代码,您肯定需要进行更改以满足您的需求。特别是因为在新的编辑中你已经说过你需要进行反向查找。