2015-10-07 19 views
-1

Я пытаюсь создать (автоматически) массив каждый раз, когда создаю перечисление. Для этого я посылаю нужный массив перечислений через sub (myenum), который сначала создает массив, а затем вызывает enum (через использование).итерация над перечислениями в perl

В приведенном ниже примере у меня есть две перечисления, одна прямая, одна с указанным выше методом. Мой метод не работает :-(Что я делаю неправильно?

@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

'enum' не следует вызывать в цикле for. Какой результат вы ожидаете? Прочтите https://metacpan.org/pod/enum – toolic

+0

'use' происходит во время компиляции, а не во время выполнения. Кроме того, с философской точки зрения, разве вы не считаете, что динамически заданная величина констант кажется странной? –

+0

К сожалению! Ты прав. «Использовать перечисление» не должно быть в цикле for. Исправлены сообщения. Почему я делаю это, я хотел бы сделать обратный поиск и получить фактическую строку (а не число), если я хочу напечатать тип перечисления (например, функцию перечисления в строку). –

ответ

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

Примечание: Это только в основном скелет код, который я написал в качестве эксперимента, и вы, безусловно, необходимо внести изменения в соответствии с твои нужды. Тем более, что в новом редактировании вы сказали, что вам нужно делать обратный поиск.

+0

Я попробую этот. Мне не повезло с BEGIN sub и импортными комбинациями. –

+0

извините. предыдущий комментарий является неполным. Я пробовал следующее без успеха ... –

+0

sub myenum ($) { #line 1 import enum (split ('', $ _ [0])); #line 2 import enum qw (: ЭТО a = 100 b c); } BEGIN { # 1 не работает с строкой 1 или 2 в подпрограмме #myenum (": THIS a = 100 b c"); # 2 не работает. #my $ str = ": ЭТО a = 100 b c"; #import enum (split ('', $ str)); # 3 works #use enum qw (: ЭТО a = 100 b c); # 4 не работает import enum (split ('', ": THIS a = 100 b c")); } use enum qw (: THAT a = 999 b c); печать THISa. "". THISb. "". ЭТО. "\ П"; печать THATa. "". THATb. "". THATc. "\ П"; –

Смежные вопросы