2013-05-22 33 views
5

Tôi đã viết một chương trình perl để lấy regex từ dòng lệnh và thực hiện tìm kiếm đệ quy của thư mục hiện tại cho một số tên tệp và filetypes, grep mỗi một cho regex, và xuất kết quả, bao gồm tên tệp và số dòng. [Grep cơ bản + tìm chức năng mà tôi có thể đi vào và tùy chỉnh khi cần thiết]

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 

Nếu bạn sao chép và dán vào thiết bị đầu cuối của bạn, bạn sẽ thấy điều này:

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/; 

này rất ngạc nhiên khi tôi. Chương trình dường như đang hoạt động ngoại trừ $. và biến $ ARGV không có giá trị tôi mong đợi. Nó xuất hiện từ trạng thái của các biến mà perl đã đọc tất cả ba tệp (tổng cộng 36 dòng) khi nó thực hiện lần lặp đầu tiên của vòng lặp qua <>. Chuyện gì vậy? Làm thế nào để khắc phục ? Đây là Perl 5.12.4.

Trả lời

10

Bạn đang sử dụng foreach(<>) nơi bạn nên sử dụng while(<>). foreach(<>) sẽ đọc mọi tệp trong @ARGV vào danh sách tạm thời trước nó sẽ bắt đầu lặp lại trên tệp đó.

+0

Cảm ơn bạn! Tôi phải nói rằng tôi đã đọc rất nhiều tài liệu perl gần đây và tôi đã không chọn nó lên. – Colin

+0

Ah, vì vậy "cho" đánh giá <> trong ngữ cảnh danh sách, đọc toàn bộ (các) tệp trong danh sách và trong khi đánh giá <> trong ngữ cảnh vô hướng đọc dòng tiếp theo. – Colin

+0

@Colin đúng. – hobbs

Các vấn đề liên quan