2013-07-19 4 views
1

Я пытаюсь прочитать из файла. Вот что мои файлы выглядит ..Perl Wildcards-Regex

abc123 
     abdef012 
    fedabc_23 
     xyz12 
    12345 

Теперь, что я пытаюсь сделать, это, получить параметр из командной строки, и в соответствии с введенным wildchar как, *,?, + Соответствующие строки сверху файл должен быть напечатан. Но я застрял здесь. Я знаю. Как * работает, но не уверен в других дикхарах. Пожалуйста, помогите мне.

#/perl/bin/perl 
use Getopt::Long; 
open (DATA, "filname.txt") || die "Can't open the file:$!"; 

my $fil=''; 

my $res= GetOptions (
"f=s" =>\$fil 
); 
$fil=~ s/[\*]//g; #Works only if '*' is at the end 

/(\w*$fil\w*)/ && !$seen{$1}++ && push @arr, $1 while <DATA>; 

Как использовать другие подстановочные знаки? Как это обобщить?

ответ

3

Позвольте мне получить это прямо:

У вас есть файл, и вы хотите, чтобы ввести регулярное выражение и распечатать все строки, соответствующие этому выражению? Что-то вроде grep?

use strict; 
use warnings; 
use autodie; 

my $regex = shift; 
my $file = shift; 

open my $fh, "<", $file; #Autodie will handle not being able to open files... 
while (my $line = <$fh>) { 
    print $line if $line =~ /$regex/; 
} 
close $fh; 

Или вы пытаетесь использовать globbing и не регулярные выражения?

Существует модуль Perl под названием Text::Glob, который будет соответствовать globs или конвертировать glob в регулярное выражение.

Я никогда не использовал его, но он кажется довольно простым:

use strict; 
use warnings; 
use autodie; 
use Text::Glob qw(match_glob); 

my $glob = shift; 
my $file = shift; 

open my $fh, "<", $file; #Autodie will handle not being able to open files... 
while (my $line = <$fh>) { 
    print $line if match_glob($glob, $line); 
} 
close $fh; 
1

Символ * означает 0 или более из предыдущего символа, поэтому d*x будет соответствовать ddddddddx или dx или ddx.

Символ + означает, чтобы соответствовать 1 или более из предыдущего символа, SOT d+x будет также соответствовать ddddddx или dx или ddx

Квадратные скобки определяют класс символов так [\*] означает, чтобы соответствовать либо обратный слэш или * символ. Многие специальные символы в регулярном выражении теряют смысл, находясь внутри класса символов с квадратной скобкой. Таким образом, [\*]x будет соответствовать \x или *x.

? означает, что соответствует предыдущему символу 0 или 1 раз. Таким образом, d?x будет соответствовать dx или x

. соответствует любому персонажу.

Эти идеи могут быть объединены таким образом, чтобы соответствовать любому символу между кавычками, которые вы могли бы использовать '.*', который найдет все символы между первой цитатой в строке и последней цитатой в строке (включая любые кавычки между ними). Или для соответствия только текста между двумя котировками вы можете сделать * не жадным, включив ?, как в '.*?'.

Вы можете узнать больше о том, как эти притяжательные кванторы работают над http://www.regular-expressions.info/possessive.html.

+0

«d * х» не будет соответствовать пустой строке, это будет, однако, соответствует одиночному «х» – doubleDown

+0

хороший вызов, я имел в виду, чтобы удалить это немного, но забыл –

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