Perl脚本将两个数组配对

时间:2019-06-30 03:33:12

标签: perl

我想配对两个数组并在它们之间添加char'/'。假设两个数组如下所示

@array1 = (FileA .. FileZ);
@array2 = (FileA.txt .. FileZ.txt);

我想要的输出如下所示

../../../experiment/fileA/fileA.txt
.
.
../../../experiment/fileZ/fileZ.txt

这是我的代码

my @input_name = input();
my $dirname = "../../../experiment/";

# CREATE FOLDER PATH
my @fileDir;
   foreach my $input_name (@input_name){
   chomp $input_name;
   $_ = $dirname . $input_name;
   push @fileDir, $_;
  }

# CREATE FILE NAME
my @filename;
my $extension = '.txt';
foreach my $input_name (@input_name){
      chomp $input_name;
   $_ = $input_name . $extension;
   push @filename, $_;
}

我要尝试的代码如下。但这似乎不起作用

#CREATE FULL PATH
foreach my $test_path (@test_path){
    foreach my $testname (@testname){
       my $test = map "$test_path[$_]/$testname[$_]", 0..$#test_path;
       push @file, $test;
   }
}


print @file;

2 个答案:

答案 0 :(得分:3)

我假设input()返回的内容类似于('fileA', 'fileB')

您的代码的问题是这里的嵌套循环:

foreach my $test_path (@test_path){
    foreach my $testname (@testname){

这将每个$test_path与每个可能的$testname结合在一起。你不要那样另外,将map的结果分配给一个标量也没有多大意义:您所得到的只是map创建的列表中元素的数量。

(此外,您的代码中随机散布着chomp个调用。这些都不应该存在。)

您只需要一个数组和一个循环:

use strict;
use warnings;

sub input {
    return ('fileA', 'fileB');
}

my @input = input();
my $dirname = '../../../experiment';

my @files = map "$dirname/$_/$_.txt", @input;

for my $file (@files) {
    print "got $file\n";
}

此处,循环被隐藏在map ..., @input调用中。如果您想将其编写为for循环,它将看起来像这样:

my @files;
for my $input (@input) {
    push @files, "$dirname/$input/$input.txt";
}

答案 1 :(得分:0)

问题在于您的算法。您要同时迭代所有文件名和所有目录名。 我的意思是,您的代码显示为“对于每个目录,创建每个文件”。

尝试类似的方法,您会没事的:

{{1}}