我有一个相对简单的问题要问各位专家。我在一个目录中有300个文件,我想用perl脚本处理这些文件(如下所示)。我想知道是否有一种方法可以在perl中的一批文件中使用变量和进程。如果有帮助的话,我有一个包含文件名列表的文件。我们将感谢您的反馈。
========================================
#!/usr/bin/perl
use strict;
use warnings;
open (FILE1, "001.txt") or die ("Can't open file $!");
while(<FILE1>){
my $line = $_;
chomp $line;
if ( $line =~ m/^chr/ ) {
open OUT, '>>', '001_tmp.txt';
print OUT "$linen";
}
}
close(OUT);
close(FILE1);
====================================
澄清:基本上,我想要的perl脚本相当于下面的shell脚本,在那里我可以使用变量容纳所有文件。
#!/bin/bash
if [[ $# != 1 ]]
then
echo "Usage: error <input>"
else
echo $# $1
export input=$1
grep "^chr" $1 > ${input}_tmp.vcf
因此,您希望while
循环读取某个给定目录中的每个文件。。
我会这样做:
使用opendir
和readdir
,这样您就可以获得要操作的文件名。
我也会使用grep
来过滤掉你不关心的文件,在我的例子中,我过滤掉了目录。。。
opendir(my $dh, $dir) or die "$dir: $!";
my @files = grep { !-d $_ } readdir $dh;
closedir $dh;
现在你将有一个文件列表要做的工作…
for my $file (@files) {
open my $fh, "<", $file or die "$!";
while( my $line = <$fh> ) {
#TODO: stuff
}
close $fh;
}
编辑:您的标记表示批处理文件,即Windows批处理文件。如果你不是这个意思,那就忽略这个。:-)
也许是这样的:
从批处理文件:
for /f %%x in (listoffilenames.txt) do (
perl myperlscript.pl %%x
)
然后您的Perl脚本可以这样修改:
#!/usr/bin/perl
use strict;
use warnings;
# You may want to add a little more error handling
# around getting the filename, etc.
my $filename = shift or die "No filename specified.";
open (FILE1, "<", $filename) or die ("Can't open file $!");
while(<FILE1>){
my $line = $_;
chomp $line;
if ( $line =~ m/^chr/ ) {
open OUT, '>>', "temp-$filename";
print OUT "$linen";
}
}
close(OUT);
close(FILE1);