Вопрос о выражениях Reg, используемых в операторе переключения Perl - PullRequest
1 голос
/ 06 мая 2011

Perl Версия: 5.8 ActivePerl используется.

Я пытался вставить выражения reg в качестве отдельных условий для оператора switch в Perl, но не смог.

Не могли бы вы рассказать мне больше о том, как исправить?

Я посмотрел на документ и не могу найти такой пример.Спасибо.

while (my $line =<$fh>) { # change foreach to while
    switch ($line) {
        case ($line =~ m/\<IDCateA\sName="(\w+)\"\sid="(\w+)\"\s/)  {print "            $1 = $2,\n";}
        case ($line =~ m/\<IDCateB\sName="(\w+)\"\sid="(\w+)\"\s/)  {print "            $1 = $2,\n";}
    }
    my $nextline = <$fh>;
}

Часть данных, как это,

 <IDCateA Name="SystemAlpha" id="0" units="" min="0" max="8" default="0" value="3"/>
 <IDCateB Name="SystemBeta" id="1" units="" min="0" max="2" default="0" value="0"/>

Ответы [ 2 ]

4 голосов
/ 06 мая 2011

Избегайте использования Switch.pm;это реализовано с использованием хрупких технологий.Я считаю, что он выполняет регулярные выражения в области видимости внутри модуля Switch, так что $ 1 и т. Д. Не доступны в вашем коде (после удаления $line =~, которые там не принадлежат).

ВашПример кодовой панели отсутствует use Switch.У меня возникли проблемы с переключением Switch для работы с __DATA__.

perldoc -q switch показывает несколько способов создания оператора типа switch, если вы не можете использовать синтаксис 5.10.1 с заданным / когда дляэкземпляр:

use strict;
use warnings;

while (my $line = <DATA>) {
    for ($line) {
        if (/<IDCateA\sName="(\w+)"\sid="(\w+)"\s/) {print "  $1 = $2,\n"}
        elsif (/<IDCateB\sName="(\w+)"\sid="(\w+)"\s/) {print "   $1 = $2,\n"}
    }
}

__DATA__
<IDCateA Name="SystemAlpha" id="0" units="" min="0" max="8" default="0" value="3"/>
<IDCateB Name="SystemBeta" id="1" units="" min="0" max="2" default="0" value="0"/>
4 голосов
/ 06 мая 2011

Вы должны использовать given или foreach с when от 5.10 или лучше, а не старый устаревший модуль Switch.pm.

...