首页 > 解决方案 > 在 perl 中,如何生成文件中包含的所有可能的数字组合?

问题描述

我在本地找到了以下 perl 代码,它计算字符或数字的所有可能组合,但您需要使用 qw 函数提供它们my @strings = [qw(1 2 3 4 5 6 7 8 9 10 11 12 13)];,我需要从一个文件并将它们传递给@strings数组或通过 Perl 行命令参数将数字传递给提到的@strings数组。

我已经阅读了有关的所有信息,qw()但是在阅读 Perl 行命令参数文件时没有找到使用它的方法,所以你能给出一些建议来解决这个问题吗?

现在提供的输出是:

1 2 3 4 5
1 2 3 4 6
1 2 3 4 7 ...

代码:

use strict;
use warnings;

#my $strings = [qw(AAA BBB CCC DDD EEE)];
#my $strings = [qw(1 2 3 4 5 6 7 8 9 10 11 12 13)];
my @strings = [qw(1 2 3 4 5 6 7 8 9 10 11 12 13)];

sub combine;

print "@$_\n" for combine @strings, 5;

sub combine {

  my ($list, $n) = @_;
  die "Insufficient list members" if $n > @$list;

  return map [$_], @$list if $n <= 1;

  my @comb;

  for (my $i = 0; $i+$n <= @$list; ++$i) {
    my $val  = $list->[$i];
    my @rest = @$list[$i+1..$#$list];
    push @comb, [$val, @$_] for combine \@rest, $n-1;
  }

  return @comb;
}

标签: fileperlcombinationsargs

解决方案


这段代码@numbers从一个文件中初始化一个数字数组 ( ):

use strict;
use warnings;

my $filename = "data.txt";
my @numbers; 

open my $fh, "<", $filename or die "Cannot open $filename";

# Read each line into $line
while( my $line = <$fh> ) {
    # Extract each number present at $line
    while( $line =~ /(\d+)/g ) {
        # If found, add the number to @numbers
        push @numbers, $1;
    }
}

close $fh;

“data.txt”的内容可能是这样的:

1 2 3
4
5
6 7 8
9
10 11
12

如果每行中有多个数字,则无关紧要。如果事实上它们可以在带有分隔符的单行中(不是数字,例如空格)


推荐阅读