我是 perl 新手,但读过 Schwartz、foy 和 Phoenix 的“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)。
我这样做是错误的吗?我是否应该不使用替代品,因为这无法做到,然后在 template.txt 文件中插入文件列表($fastqfilenames)?我可以用文件内容代替 $fastqfilenames(例如 s/A/{r file.txt ...)吗?有什么建议么?
干杯,
詹姆斯T
编辑:
这让一切变得更好。
foreach (@secontrol_template) {
s/@/$fastqfilenames/g;
push @secontrol, $_;
}
正如这两个建议, $fastqfiles 是一个文件句柄。
替换这个: open (my ($fastqfilenames), "<", "fastqfilenames.txt") or die "Can't open fastqfilenames.txt: $!\n";
有了这个:
my $fastqfilenames = join "\n", @fastqfiles;
一切都很好。谢谢你们俩。