2015-05-05 2 views
0

У меня есть код perl ниже. Я пытаюсь установить flag на 1, если у моего $location есть строка /foo/HELLO, которая работает нормально. Но теперь я хочу, чтобы установить flag в 0 если $location имеет /foo/* (он имеет /foo/ и что-нибудь после того, как кроме ПРИВЕТ)perl regex, чтобы соответствовать строке, начиная с шаблона

Как я могу сформулировать мое регулярное выражение в else состоянии достичь его?

use strict; 
use warnings; 

my $flag =0; 

my @locations= (
    "/path/with/foo/HELLO", 
    "/path/with/foo/def-abc-addons.install", 
    "/path/with/foo/def-abc-addons.lintian-overrides", 
    "/path/with/foo/def-abc-addons.postrm", 
    "/abc/def/ggfg", 
    "/frgrg/hjytj/dgth", 
); 

foreach my $location(@locations){ 
    if ($location =~ m/\/foo\/HELLO/) { 
     print 'match'; 
     $flag=1; 
    } else { 
     print 'no match'; 
     $flag=0 
    } 
} 
+0

Конечно, 'else' состояние делает это? – Sobrique

+0

Я попытался изменить ваш вопрос, но я не уверен, что понимаю вас. Вы говорите * «Я пытаюсь установить флаг' '' '', если в моем '$ location' есть строка' \ foo \ HELLO' * *, и вы говорите, что он работает. Однако в этом случае ваш код устанавливает '$ flag' в 1. Затем вы продолжаете говорить * «Я хочу установить' флаг' в '0', если' $ location' имеет '\ foo \ *' "* - вы имеете в виду'/foo/* '? – Borodin

+0

@Borodin: Обновлен вопрос. Извините за путаницу, вызванную – Jill448

ответ

2

Вы в else, так что вы уже знаете, что это не имеет /foo/HELLO. Так просто проверить /foo/ все еще есть:

} elsif ($location =~ m=/foo/=) { 
0

Вы можете использовать grep и map построить хэш строки и связанные с ними флаг значений:

use strict; 
use warnings; 

use Data::Dumper qw(Dumper); 

my @locations= (
    "/path/with/foo/HELLO", 
    "/path/with/foo/def-abc-addons.install", 
    "/path/with/foo/def-abc-addons.lintian-overrides", 
    "/path/with/foo/def-abc-addons.postrm", 
    "/abc/def/ggfg", 
    "/frgrg/hjytj/dgth", 
); 

my %h = map { $_ =~ m|/foo/HELLO| ? ($_ => 1) : ($_=>0) } grep {m|/foo/\w+|} @locations; 

print Dumper \%h; 

Теперь %h:

{ 
     '/path/with/foo/def-abc-addons.install' => 0, 
     '/path/with/foo/def-abc-addons.lintian-overrides' => 0, 
     '/path/with/foo/def-abc-addons.postrm' => 0, 
     '/path/with/foo/HELLO' => 1 
    }; 

Просто измените регулярное выражение в соответствии с тем, что вы пытаетесь выполнить.

0

I думаю что вы ищете, чтобы отфильтровать файлы, которые имеют /foo/, но не /foo/HELLO/ в пути. Вы можете сделать это с помощью оператора grep, как показано ниже:

Этот код требует больше работы, если ваше требование более жесткое, чем вы описываете. Здесь много краевых случаев и подводных камней, и никто из них не рассматривается. Например, если путь содержит /foo/HELLONWHEELS, то она будет отклонена, и что может или не может быть ваше намерение

use strict; 
use warnings; 
use 5.010; 

my @locations= qw(
    /path/with/foo/HELLO 
    /path/with/foo/def-abc-addons.install 
    /path/with/foo/def-abc-addons.lintian-overrides 
    /path/with/foo/def-abc-addons.postrm 
    /abc/def/ggfg 
    /frgrg/hjytj/dgth 
); 

say for grep m{ /foo/ (?!HELLO) }x, @locations; 

выход

/path/with/foo/def-abc-addons.install 
/path/with/foo/def-abc-addons.lintian-overrides 
/path/with/foo/def-abc-addons.postrm 
Смежные вопросы