Perl-скрипт для сопряжения двух массивов - PullRequest
0 голосов
/ 30 июня 2019

Я хочу соединить два массива и добавить символ '/' между ними. Допустим, два массива похожи ниже

@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 ]

3 голосов
/ 30 июня 2019

Я полагаю, 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";
}
0 голосов
/ 30 июня 2019

Проблема в вашем алгоритме. Вы перебираете все имена файлов и имена одновременно. Я имею в виду, ваш код говорит: «Для каждого каталога создайте каждый файл».

Попробуйте что-нибудь подобное, и все будет в порядке:

# WRITE TESTFILE
    foreach my $filename (@filename){
        chomp $filename;
        if ( -e "$filename/$filename" and -d "$filename/$filename" ){
            print "File already exists\n";
        }
        else {
            open ( TXT_FILE, ">$filename/$filename" );

            print TXT_FILE "Hello World";

            close TXT_FILE;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...