Почему этот код не делает то, что я имею в виду? - PullRequest
1 голос
/ 08 марта 2010
$w = 'self-powering';
%h = (self => 'self',
      power => 'pauә',
      );
if ($w =~ /(\w+)-(\w+)ing$/ && $1~~%h && $2~~%h && $h{$2}=~/ә$/) {
    $p = $h{$1}.$h{$2}.'riŋ';
      print "$w:"," [","$p","] "; 
}

Я ожидаю, что результат будет

self-powering: selfpauәriŋ

Но я получаю:

self-powering: [riŋ]

Я думаю, что-то не так с кодом

$h{$2}=~/ә$/

Кажется, что когда я использую

$h{$2}!~/ә$/

Perl будет делать то, что я имею в виду, но почему я не могу получить «самообеспечение: самопожертвование»? Что я делаю неправильно? Есть идеи?

Спасибо, как всегда, за любые комментарии / предложения / указатели:)

Ответы [ 2 ]

6 голосов
/ 08 марта 2010

При запуске

 $h{$2}!~/ә$/

В вашем операторе if содержимое $ 1 и $ 2 изменяется на пустое, поскольку не было найдено ни одной группировки (не было). Если вы делаете это так:

if ($w =~ /(\w+)-(\w+)ing$/){
    my $m1 = $1;
    my $m2 = $2;
    if($m2~~%h && $m2~~%h && $h{$m2}=~/ә$/) {
        $p = $h{$m1}.$h{$m2}.'riŋ';
        print "$w:"," [","$p","] "; 
    }
}

Я ожидаю, что вы получите то, что вы хотите.

1 голос
/ 08 марта 2010

Работаете ли вы с включенным use warnings? Это скажет вам, что $1 и $2 не то, что вы ожидаете. Ваше второе регулярное выражение, а не первое, определяет значения этих переменных, когда вы входите в блок if. Для иллюстрации на более простом примере:

print $1, "\n"
    if  'foo' =~ /(\w+)/
    and 'bar' =~ /(\w+)/;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...