Чтобы поместить выходной файл a.txt
в том же каталоге, что и входной файл, необходимо извлечь имя каталога из имени входного файла, и предварять его имя выходного файла (a.txt
). Есть несколько способов сделать это; вероятно, проще всего использовать dirname()
из стандартного модуля File::Basename:
use File::Basename;
my $dir = dirname($file);
open(OUT_FILE, ">", "$dir/a.txt") or die "Failed to open $dir/a.txt: $!";
или вы могли бы использовать File::Spec непосредственно:
use File::Spec;
my ($volume, $dir) = File::Spec->splitpath($file);
my $outname = File::Spec->catpath($volume, $dir, 'a.txt');
open(OUT_FILE, ">", $outname) or die "Failed to open $outname: $!";
или вы могли бы просто использовать regexp substitution:
my $outname = ($file =~ s![^/]+$!a.txt!r);
open(OUT_FILE, ">", $outname) or die "Failed to open $outname: $!";
Пс. В любом случае, я бы рекомендовал принятие несколько хороших привычек, которые помогут вам лучше писать сценарии Perl:
Всегда начинайте ваши скрипты с use strict;
и use warnings;
. Исправьте любые ошибки и предупреждения, которые они создают. В частности, объявите все свои локальные переменные с помощью my
, чтобы сделать их лексически охваченными.
Проверьте возвращаемое значение таких функций, как open()
, и прекратите выполнение сценария, если они не сработают. (Я сделал это в своих примерах выше.)
Используйте форму с тремя аргументами open()
, как я уже говорил в приведенных выше примерах. Это гораздо меньше шансов сломаться, если ваши имена файлов содержат забавные символы.
Рассмотрите возможность использования лексических файловых дескрипторов (open my $out_file, ...
) вместо глобальных файловых дескрипторов (open OUT_FILE, ...
). Я не делал этого в своих фрагментах кода выше, потому что я хотел сохранить их совместимыми с остальной частью вашего кода, но это была бы хорошая практика.
Если вы предварительно объявив регулярное выражение, как ваши $search_text
, использовать qr//
вместо простой строки, например:
my $search_text = qr/ATOM/;
Это немного более эффективным, и цитируя правила для специальных символов являются намного более здравыми.
Для печати нескольких столбцов из массива, следует использовать join()
и кусочек списка, например:
print OUT_FILE join("\t", @fields[2,6,7,8]), "\n";
Наконец, если бы я тебя, я бы пересмотреть мой файл схема именования: имя выходного файла a.txt
соответствует вашему имени входного файла glob *.txt
, поэтому ваш скрипт, скорее всего, сломается, если вы запустите его дважды подряд.
Проверьте успешность вызовов 'open':' use autodie; ' – toolic
Работает для меня. Вы действительно хотите, чтобы выходной файл назывался 'something.txt a.txt' с пространством? – choroba
Нет. Мне нужно, чтобы новый выходной файл назывался a.txt для каждой подпапки отдельно. – perlselami