2013-11-26 3 views
0

Я довольно плохо с регулярным выражением и попытался выполнить поиск в google, но все, что я пробовал, не сработало.Perl regex match array

Вот мой код:

@liner = split(/\s+/, $_); 
foreach my $v (@liner) { 
    if ($v =~ /*.duplex.*/) { 
     print ECRIRE ";$v"; 
    } 
} 

$ v содержит что-то вроде: "Полный дуплекс", но может содержит другие вещи, как "Half-дуплекс" ....

Так что я хочу мое условие, чтобы соответствовать «любому char» дуплексу «любой символ».

Я пытался что-то вроде if ($v =~ /(*.)duplex(.*)/)

и некоторые другие, но не работает. Может кто-нибудь мне помочь?

+2

Первый '* .' недопустим - это нужно, чтобы быть' '*.. – Christoph

ответ

3
foreach (split(/\s+/)) { 
    print ECRIRE ";$_" if /duplex/i; 
} 

К счастью, в Perl RegEx не совпадает с целой строкой, а это означает, что вы не должны префикс и суффикс все с «*.»:

/abcd/ 

является синонимом

/.*abcd.*/ 

(если не вы используете конкретный вариант, который добавляет новые строки в соответствующих символов для точки)

Этот цикл соответствует всем дуплексным во всех случаях (/ i делает регистр RegEx нечувствительным).

(проверялось, но пальцы скрещены)

+0

О, боже ...Что за нуб я ... Спасибо, чувак за объяснения! –

+0

Это даже не компилируется – Borodin

+0

Если у вас нет интерпретатора perl. Работает сейчас (проверено). – 0xCAFEBABE

-1

Модуль List::MoreUtils имеет firstval функцию, которая будет возвращать первое значение в списке, который удовлетворяет некоторое ограничение. Это очень полезно для написания краткого и читаемого кода. Это не основной модуль, и вам, возможно, потребуется его установить.

Как уже было сказано, все, что вам нужно в вашем регулярном выражении, это /duplex/, так как это проверит, что строка содержит строку. Вы можете улучшить его с помощью /duplex/i, который вместо этого выполняет нечувствительность к регистру.

И, наконец, если вы пишете split /\s+/, тогда вы почти наверняка захотите split ' '; это буквальное однопространство строка, а не регулярное выражение, и это по умолчанию для split, если вы не указали первый параметр. Разница в том, что если целевая строка запускает с пробелом, тогда spltting с /\s+/ вернет пустую строку в качестве первого элемента списка, тогда как с ' ' она вернет только символы без пробела. Если вы не передадите никаких параметров на split, то это эквивалентно split ' ', $_, что часто является тем, что вы хотите.

Эта короткая программа демонстрирует эти моменты.

use strict; 
use warnings; 

use List::MoreUtils 'firstval'; 

$_ = 'simplex full-duplex half-duplex'; 

print firstval { /duplex/ } split; 

выход

full-duplex