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.
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
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
@Colin đúng. – hobbs