2013-05-22 1 views
5

나는 커맨드 라인에서 정규 표현식을 사용하고 특정 파일 이름과 파일 유형에 대해 현재 디렉토리를 재귀 검색하고 정규 표현식에 대해 각각 grep하고, 파일 이름과 줄 번호를 포함하여 결과를 출력합니다. 복사하는 경우

cat <<'EOF' >perlgrep2.pl 
#!/usr/bin/env perl 
$expr = join ' ', @ARGV; 

my @filetypes = qw(cpp c h m txt log idl java pl csv); 
my @filenames = qw(Makefile); 

my $find="find . "; 
my $nfirst = 0; 
foreach(@filenames) { 
    $find .= " -o " if $nfirst++; 
    $find .= "-name \"$_\""; 
} 
foreach(@filetypes) { 
    $find .= " -o " if $nfirst++; 
    $find .= "-name \\*.$_"; 
} 

@files=`$find`; 

foreach(@files) { 
    s#^\./##; 
    chomp; 
} 

@ARGV = @files; 

foreach(<>) { 
    print "$ARGV($.): $_" if m/\Q$expr/; 
    close ARGV if eof; 
} 
EOF 

cat <<'EOF' >a.pl 
print "hello "; 
$a=1; 
print "there"; 
EOF 

cat <<'EOF' >b.pl 
print "goodbye "; 
print "all"; 
$a=1; 
EOF 

chmod ugo+x perlgrep2.pl 
./perlgrep2.pl print 

및 터미널에이 붙여 넣기 [기본 그렙 + 내가 가서 필요에 따라 사용자 정의 할 수 있습니다 기능을 찾을]이 표시됩니다

perlgrep2.pl(36): print "hello "; 
perlgrep2.pl(0): print "there"; 
perlgrep2.pl(0): print "goodbye "; 
perlgrep2.pl(0): print "all"; 
perlgrep2.pl(0):  print "$ARGV($.): $_" if m/\Q$expr/; 

이것은 매우 놀라운 일이다 나를. 이 프로그램은 $를 제외하고는 작동하는 것으로 보입니다. $ ARGV 변수에는 예상 한 값이 없습니다. perl이 <> 이상의 루프의 첫 번째 반복을 실행할 때 perl이 이미 세 파일 (총 36 줄)을 읽은 변수의 상태에서 나타납니다. 무슨 일이야 ? 어떻게 고치는 지 ? 이것은 Perl 5.12.4입니다.

답변

10

while(<>)을 사용해야하는 곳은 foreach(<>)입니다. foreach(<>)@ARGV의 모든 파일을 임시 목록 으로 읽어 들여 전에 반복합니다.

+0

감사합니다. 나는 최근에 많은 perl 문서를 읽었으며 나는 그것을 선택하지 않았다는 것을 말해야 만합니다. – Colin

+0

아, 그래서 "for"는 목록 컨텍스트에서 <>를 평가하여 전체 파일을 목록으로 읽어 들이고 다음 줄을 읽는 스칼라 컨텍스트에서 <>를 평가합니다. – Colin

+0

@Colin 맞아. – hobbs

관련 문제