Расширение хорошего ответа, предоставленного Джонатаном Леффлером:
Имя файла, в котором было найдено совпадение, находится в $ ARGV
, и с небольшим изменением номер строки может можно найти в $.
. Пример:
while (<>) {
print "$ARGV:$.:$_" if /pattern/;
} continue {
close ARGV if eof; # Reset $. at the end of each file.
}
Более того, если у вас есть список имен файлов, а их нет в командной строке, вы все равно можете получить волшебное поведение ARGV
. Смотрите:
{
local @ARGV = ('one.txt', 'two.txt');
while (<>) {
print "$ARGV:$.:$_" if /Okay/;
} continue {
close ARGV if eof;
}
}
Это обычно полезный шаблон для выполнения построчной обработки ряда файлов, какими бы они ни были, даже если я могу порекомендовать File :: Grep
или App :: Подтвердите
для этой конкретной проблемы :)
Самый простой способ - перечислить файлы в командной строке, а затем просто использовать:
while (<>)
{
print if m/Okay/;
}
В системе, где аргументы командной строки правильно раскрыты, вы можете использовать:
[sinan@host:~/test]$ perl -ne 'print "$.:$_" if /config/' * 1:$(srcdir)/config/override.m4
Проблема с Windows:
C:\Temp> perl -ne "print if /perl/" *.txt Can't open *.txt: Invalid argument.
В Windows вы можете сделать:
C:\Temp> for %f in (*.txt) do perl -ne "print if /perl/" %f
Но вы можете просто использовать cmd.exe
встроенный findstr или инструмент командной строки grep .
поместить файлы в цикл for или что-то в этом роде:
ie
for $file ('F:\wyvern.txt','F:\casanova.txt') {
open(TXT, $file);
while($line = <txt>) {
print "$line" if $line =~ /Okay/;
}
close TXT;
}
Ладно, я полный болван. Но подведем итог: теперь я могу искать указанную строку в одном текстовом файле или нескольких текстовых файлах. Я все еще пытаюсь понять, как поступить со всеми файлами в одной папке. работают следующие коды:
#!/usr/bin/perl
$file = 'F:\one.txt';
open(txt, $file);
while($line = <txt>) {
print "$line" if $line =~ /Okay/;
}
close(txt);
#!/usr/bin/perl
{
local @ARGV = ('F:\wyvern.txt', 'F:\casanova.txt');
while (<>) {
print "$ARGV:$.:$_" if /Okay/;
} continue {
close ARGV if eof;
}
}
Еще раз спасибо за вашу помощь. Я очень ценю это.
Просто поправьте вашу строку:
, я предпочитаю использовать ключевое слово glob
- оно работает так же в этом контексте и позволяет избежать путаницы в различных случаях использования угловых скобок в Perl. То есть:
@files = glob "F: / романы / *";
Подробнее см. perldoc glob .