每次创建枚举时,我都会尝试创建(自动)数组。为此,我通过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";
答案 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
注意:这只是我作为实验编写的大部分骨架代码,您肯定需要进行更改以满足您的需求。特别是因为在新的编辑中你已经说过你需要进行反向查找。