我打算制作生成新文件的程序,其中包含来自多个数组的元素组合。
首先,程序提示用户输入文件名 每个文件每行包含一个单词 每个文件都将被视为一个数组,每行的内容是数组元素。
程序然后获得那些数组元素(文件内容)的所有可能组合,
并将每个组合打印到新文件
因此,创建的新文件将与可能的组合一样多。
例:
的 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打印到新的分隔文件,如上图所示。
答案 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:)