如何通过Perl处理来自多个目录的文件名?

如何通过Perl处理来自多个目录的文件名?,perl,Perl,我正在使用Perl对来自不同多个目录的多个.txt文件进行分阶段处理 我有文件夹:A_1,A_2,A_3。。。 _1文件夹中的文件列表为: V_3_C_1.txt、V_3_C_2.txt、…、V_3_C_38.txt和 V_1_C_1.txt,V_1_C_2.txt,…,V_1_C_38.txt。 由于某些原因,A_1文件夹中的文件可以分为V_3和V_1 _2文件夹中的文件列表为: V_4_C_1.txt、V_4_C_2.txt、…、V_4_C_38.txt和 V_1_C_1.txt,V_1_C

我正在使用Perl对来自不同多个目录的多个.txt文件进行分阶段处理

我有文件夹:A_1,A_2,A_3。。。 _1文件夹中的文件列表为: V_3_C_1.txt、V_3_C_2.txt、…、V_3_C_38.txt和 V_1_C_1.txt,V_1_C_2.txt,…,V_1_C_38.txt。 由于某些原因,A_1文件夹中的文件可以分为V_3和V_1

_2文件夹中的文件列表为: V_4_C_1.txt、V_4_C_2.txt、…、V_4_C_38.txt和 V_1_C_1.txt,V_1_C_2.txt,…,V_1_C_38.txt。 A_2文件夹中的文件可以分为V_4和V_1

我将用Perl运行一个系统java程序。首先,我要提取文件名的一部分。 我的代码在这里:

my % seen;
my @dups;
my @unqie;

my $file_list = '/home/V/Documents/A_1';
opendir (DIR, $file_list) or die "Could not open $file_list\n";  
my @vcf_files = grep (/\.txt$/, readdir DIR);  

for my $line (@vcf_files) {
    my @vcf_index = split ('_' , $line);
    my @dups = grep ++$seen{$_} ==2, $vcf_index[1]; #get the unique values, for example in `A_1` folder, I try to extract 3 and 1 from `V_3` and `V_1  `  
    push @unqie, @dups; #push into array for next steps. 

    for (my $i=1; $i <=38; $i++) {
        my @external_command = (
            "java",
            "-jar",
            "/home/V/Documents/beagle.03Jul19.b33.jar",
            "gt=/home/V/Documents/A_1/V_".$unqie[0]."_C_".$i."\.txt",
            "out = .............."
        );
        my @external_command_1 = (
            "java",
            "-jar",
            "/home/V/Documents/beagle.03Jul19.b33.jar",
            "gt=/home/V/Documents/A_1/V_".$unqie[1]."_C_".$i."\.txt",  
            "out = .............. "
        );

        my $out = system(@external_command);
        my $out_1 = system(@external_command_1);
        # ....
    }
}
我不能得到我想要的结果。我正在用打印检查。我想我知道文件名部分有问题,但我无法解决


有人能帮我弄清楚吗?谢谢

一个很好的调试方法是不运行程序,而是打印命令行以查看将要运行的内容

也就是说,替换这些行:

my $out = system(@external_command);
my $out_1 = system(@external_command_1);
有了这些:

print "@external_command\n";
print "@external_command_1\n";
顺便说一下,您的原始代码中似乎存在误解—系统返回进程退出代码,而不是输出

运行该命令后,您的第一个代码将向我提供如下输出:

java -jar /home/V/Documents/beagle.03Jul19.b33.jar gt=/home/V/Documents/A_1/V__C_1.txt out = ..............
java -jar /home/V/Documents/beagle.03Jul19.b33.jar gt=/home/V/Documents/A_1/V__C_1.txt out = ..............
java -jar /home/V/Documents/beagle.03Jul19.b33.jar gt=/home/V/Documents/A_1/V__C_2.txt out = ..............
java -jar /home/V/Documents/beagle.03Jul19.b33.jar gt=/home/V/Documents/A_1/V__C_2.txt out = ..............
java -jar /home/V/Documents/beagle.03Jul19.b33.jar gt=/home/V/Documents/A_.1/V__C_1.txt out = ..............
java -jar /home/victor/Documents/beagle.03Jul19.b33.jar gt=/home/V/Documents/A_.1/V__C_1.txt out = ..............
我觉得那不合适。看你有像V_uc_1.txt这样的东西。看起来两个下划线之间缺少一个值。它来自以下代码:

"gt=/home/V/Documents/A_.$j/V_".$unqie[0]."_C_".$i."\.txt"
"gt=/home/V/Documents/A_.$j/V_".$unqie[1]."_C_".$i."\.txt"
"gt=/home/V/Documents/A_.$j/V_" . $unqie[0] . "_C_".$i."\.txt",
该代码:

"gt=/home/V/Documents/A_.$j/V_".$unqie[0]."_C_".$i."\.txt"
"gt=/home/V/Documents/A_.$j/V_".$unqie[1]."_C_".$i."\.txt"
"gt=/home/V/Documents/A_.$j/V_" . $unqie[0] . "_C_".$i."\.txt",
所以看起来@unqie从未在其中获取任何数据。这意味着@dup也不会从中获取任何数据

运行第二个程序会产生如下输出:

java -jar /home/V/Documents/beagle.03Jul19.b33.jar gt=/home/V/Documents/A_1/V__C_1.txt out = ..............
java -jar /home/V/Documents/beagle.03Jul19.b33.jar gt=/home/V/Documents/A_1/V__C_1.txt out = ..............
java -jar /home/V/Documents/beagle.03Jul19.b33.jar gt=/home/V/Documents/A_1/V__C_2.txt out = ..............
java -jar /home/V/Documents/beagle.03Jul19.b33.jar gt=/home/V/Documents/A_1/V__C_2.txt out = ..............
java -jar /home/V/Documents/beagle.03Jul19.b33.jar gt=/home/V/Documents/A_.1/V__C_1.txt out = ..............
java -jar /home/victor/Documents/beagle.03Jul19.b33.jar gt=/home/V/Documents/A_.1/V__C_1.txt out = ..............
这与第一个版本的问题相同,可能是由相同的事情引起的,但它也有一个问题-A_.1。这源于以下代码:

"gt=/home/V/Documents/A_.$j/V_".$unqie[0]."_C_".$i."\.txt"
"gt=/home/V/Documents/A_.$j/V_".$unqie[1]."_C_".$i."\.txt"
"gt=/home/V/Documents/A_.$j/V_" . $unqie[0] . "_C_".$i."\.txt",
具体来说,从A_uu.$j。我想你的意思是把点作为连接操作符,但是因为它在一个带引号的字符串中,所以它被解释为一个点。只要去掉这个点就很容易修复

很难提供更多帮助,因为我不太清楚你想做什么,像%seen和@unqie这样的变量在没有解释的情况下突然出现。但这里有一些其他的提示

添加“使用严格”和“使用警告”。并解决他们将暴露的问题。
对于我的$j=1$jEven此处突出显示的语法显示了未闭合的单引号字符串。对不起,我仍然不知道如何修复。@Victor.H:在您的问题下面有一个编辑链接。在这里,请同时修复缩进。您在哪里声明哈希%seen和数组@unqie?另外,我认为你有一个太多的循环。去掉两个最里面的一个。谢谢你的建议。我可以得到$unqie[0]和$unqie[1]的值。对于第一个循环,值为3和1。但是当我运行第二个循环时,理想的结果应该是4和1。我检查@unqie,值是3、1和4。我不知道如何在$unqie[0]和$unqie[1]中得到4和1,或者如何在第二个循环中替换。@Victor.H:我可以得到$unqie[0]和$unqie[1]的值,我不知道这是什么意思。您的代码没有设置这些值。如果您在该数组中获取值,那么您的代码或环境不是您告诉我们的。