2013-07-19 4 views
1

파일에서 읽으려고합니다. 여기 내 파일이 이제 ..Perl 와일드 카드 - 정규식

abc123 
     abdef012 
    fedabc_23 
     xyz12 
    12345 

모습입니다, 내가하는 것입니다 노력하고 무엇을, 명령 행에서 옵션을 얻고 입력 wildchar에 따라 같은, *,? 위에서, + 적절한 선 파일을 인쇄해야합니다. 그러나 나는 여기에서 붙어있다. 알아. 어떻게 작동합니까?하지만 다른 wildchars에 대해서는 확실하지 않습니다. 제발 도와주세요.

#/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하지 정규 표현식을 사용하려고?

Text::Glob이라는 Perl 모듈은 glob에서 일치하거나 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*xddddddddx 또는 dx 또는 ddx 일치합니다.

기호 +는 1 또는 선행 문자의 이상, SOT d+xddddddx 또는 dx 또는 ddx

대괄호는 문자 클래스 그렇게 [\*]는 백 슬래시 또는 * 중 하나와 일치하는 것을 의미 정의 일치 일치하는 것을 의미합니다 상징. 정규 표현식의 많은 특수 문자는 대괄호 문자 클래스 안에있는 동안 의미를 잃어 버립니다. 따라서 [\*]x\x 또는 *x과 일치합니다.

?은 앞의 문자를 0 번 또는 1 번 일치시키는 것을 의미합니다. 따라서 d?xdx 또는 x

과 일치합니다. .은 모든 문자와 일치합니다.

이러한 아이디어는 따옴표 사이의 모든 문자와 일치하도록 조합하여 '.*'을 사용할 수 있습니다. 그러면 문자열의 첫 번째 따옴표와 그 문자열의 마지막 따옴표 사이에있는 모든 문자 (그 사이의 따옴표 포함)를 찾을 수 있습니다. 또는 두 따옴표 사이의 텍스트 만 일치 시키려면 '.*?'과 같이 ?을 포함하여 *을 욕심이 없게 만들 수 있습니다.

이러한 소유량 한정 기호가 작동하는 방식에 대한 자세한 내용은 http://www.regular-expressions.info/possessive.html에서 확인할 수 있습니다. 당신은 파일을 가지고 있고, 당신이 정규 표현식 입력 할

, 그리고 그 표현과 일치하는 모든 행을 인쇄 :

+0

"D * X"빈 문자열을 일치하지 않습니다, 그것은 단 하나의 "X" – doubleDown

+0

좋은 전화를 일치합니다, 제가 삭제 의미 그 비트지만 잊어 버렸어. –