Я новичок в Perl, но прочитал "Learning Perl" Шварца, Фоя и Феникса и плохо понимаю язык. Я все еще борюсь, даже после использования книги и Интернета.
Моя цель - сделать следующее:
Найдите определенную папку (текущую папку) и получите имена файлов с полным путем. Сохраняйте имена файлов с полным путем и текущим именем папки.
Откройте файл шаблона и вставьте имена файлов с полным путем в определенное место (например, с помощью замены), а также текущее имя папки (в другом месте в том же текстовом файле, я еще не зашел так далеко).
Сохраните новый измененный файл в новый файл в определенном месте (в текущей папке).
У меня есть много файлов/папок, которые я хочу обработать, и я планирую скопировать программу Perl в каждую из этих папок, чтобы программа Perl могла создавать новые файлы .
Я зашел так далеко...:
use strict;
use warnings;
use Cwd;
use File::Spec;
use File::Basename;
my $current_dir = getcwd;
open SECONTROL_TEMPLATE, '<secontrol_template.txt' or die "Can't open SECONTROL_TEMPLATE: $!\n";
my @secontrol_template = <SECONTROL_TEMPLATE>;
close SECONTROL_TEMPLATE;
opendir(DIR, $current_dir) or die $!;
my @seq_files = grep {
/gz/
} readdir (DIR);
open FASTQFILENAMES, '> fastqfilenames.txt' or die "Can't open fastqfilenames.txt: $!\n";
my @fastqfiles;
foreach (@seq_files) {
$_ = File::Spec->catfile($current_dir, $_);
push(@fastqfiles,$_);
}
print FASTQFILENAMES @fastqfiles;
open (my ($fastqfilenames), "<", "fastqfilenames.txt") or die "Can't open fastqfilenames.txt: $!\n";
my @secontrol;
foreach (@secontrol_template) {
$_ =~ s/@/$fastqfilenames/eg;
push(@secontrol,$_);
}
open SECONTROL, '> secontrol.txt' or die "Can't open SECONTROL: $!\n";
print SECONTROL @secontrol;
close SECONTROL;
close FASTQFILENAMES;
Моя проблема в том, что я не могу понять, как использовать мой список файлов для замены "@" в моем текстовом файле шаблона:
my @secontrol;
foreach (@secontrol_template) {
$_ =~ s/@/$fastqfilenames/eg;
push(@secontrol,$_);
}
Функция замены не заменит "@" списком файлов, перечисленных в $fastqfilenames. Я заменяю "@" на GLOB(0x8ab1dc).
Я делаю это неправильно? Не использовать ли замену, так как этого сделать нельзя, а затем вставить список файлов ($fastqfilenames) в файл template.txt? Могу ли я вместо $fastqfilenames заменить содержимое файла (например, s/A/{r file.txt...). Какие-либо предложения?
Ваше здоровье,
ДжеймсТ
ИЗМЕНИТЬ:
Это сделало все лучше.
foreach (@secontrol_template) {
s/@/$fastqfilenames/g;
push @secontrol, $_;
}
И как оба предложения, $fastqfiles — это дескриптор файла.
заменил это: open (my ($fastqfilenames), "‹", "fastqfilenames.txt") или die "Не удается открыть fastqfilenames.txt: $!\n"; забастовка>
с этим:
my $fastqfilenames = join "\n", @fastqfiles;
сделал все хорошо. Спасибо вам обоим.