如何在Perl中将多组(动态输入)的每个笛卡尔积打印到新的分离文件?

时间:2014-02-05 14:54:14

标签: arrays perl element combinations auto-generate

我打算制作生成新文件的程序,其中包含来自多个数组的元素组合。

首先,程序提示用户输入文件名 每个文件每行包含一个单词 每个文件都将被视为一个数组,每行的内容是数组元素。

程序然后获得那些数组元素(文件内容)的所有可能组合,
并将每个组合打印到新文件 因此,创建的新文件将与可能的组合一样多。

例:
FILE1.TXT
F1A
f1b

FILE2.TXT
F2A
F2B
f2c

插图:

  

'> perl combine.pl
  '>要合并的文件名:file1.txt file2.txt
  的结果
  '> file1.txt = 2个元素。
    file2.txt = 3个元素     组合成功生成6个文件。

在同一目录下,程序生成6个文件组合结果 的结果-1.txt的
F1A
f2a

结果-2.txt
F1A
f2b

结果-3.txt
F1A
f2c

结果-4.txt
F1B
f2a

结果-5.txt
F1B
f2b

结果-6.txt
F1B
f2c

这是我的一些代码:

combine.pl

#!/usr/bin/perl 
use Data::Dumper;

print "Filename(s) to be combined: ";
$userinput =  <STDIN>; 
chomp $userinput;

my @filenames = split /\s+/, $userinput;

my @arr;
my $i = 0;

foreach (@filenames){
    # open file
    open (my $fn, "<", $_) or die ("can't open file");
    {
        local $/;
        @arr[$i] = <$fn>;
    }
    close ($fn);
    $i++;
}
print "\n".Dumper(@arr);

# get array size
my $arrSize =  scalar @arr;
print "\nSets of array from input: " . $arrSize . "\n";

#die;

这就是我到目前为止所做的,
动态获取文件输入的内容,
并将每个文件内容放入一个数组(我希望它更容易组合)。

我已经更新了问题并稍微清理了一下代码 所以问题;如何将这些输入中的每个cartesian-crossProduct打印到新的分隔文件,如上图所示。

1 个答案:

答案 0 :(得分:2)

我将解密作为OP的练习,直到他们澄清是否是作业。在命令行中将文件名作为参数传递给以下脚本:

use strict;
use warnings;
use File::Slurp qw< read_file write_file >;
use List::Gen   qw< cartesian >;

my $counter;
my @slurped_files   = map { my @file = read_file($_); [ @file ] } @ARGV;
my @resultant_files = cartesian { [ @_ ] } @slurped_files;

$counter++, write_file( @$_, "result-$counter.txt" ) for @resultant_files;

Grunt工作分三行完成。得爱CPAN:)