perl基于输入模式生成数组

时间:2011-02-22 07:51:29

标签: arrays perl

这是我的程序

#!/usr/bin/perl -w
use strict;
use warnings;

my $pattern = 'a .. f';

我正在寻找一种从这种模式中获取数组的方法。我认为使用的一种方法是将其拆分为三个并获得如下数组。但似乎这不是一个可行的解决方案,因为未来的模式将会发生变化。它可能类似于'a..f1..9',因此拆分可能无法在那里工作或者我必须为它编写更多的通用代码。 因此,寻找一种基于提供的输入模式生成数组的方法。

6 个答案:

答案 0 :(得分:2)

也许Parse::Range模块可以帮助您。

答案 1 :(得分:1)

试试这个,通过正则表达式捕获锚点字符:

my $pattern = 'a .. f';
my @ar;

if($pattern =~ /([a-f])\s*\.\.\s*([a-f])/) {
    @ar = ($1..$2);
}

答案 2 :(得分:1)

这需要输入验证,因为它可能会很容易地破坏无效模式,但它符合您的基本规范:

#!/usr/bin/env perl

use strict;
use warnings;

my $pattern = 'a .. f';
print join(' ', make_arr($pattern)), "\n";

$pattern = 'a..f1..9';
print join(' ', make_arr($pattern)), "\n";

sub make_arr {
    my $pat = shift;
    my @arr;

    while ($pat =~ s/(\w)\s*\.\.\s*(\w)//) {
        push @arr, $1 .. $2;
    }

    return @arr;
}   

输出:

a b c d e f
a b c d e f 1 2 3 4 5 6 7 8 9

答案 3 :(得分:1)

单行正则表达式双重评估:

$pattern =~ s/(\w)\s*\.\.\s*(\w)/"\"\@{['$1'..'$2']} \""/gee;

结果:

a b c d e f

这甚至适用于:

my $pattern = 'a .. f1 .. 8';

结果:

a b c d e f 1 2 3 4 5 6 7 8

要将此字符串转换为列表,请留给读者:)

此致

RBO

答案 4 :(得分:0)

您可以使用eval并更改您的模式:

#!/usr/bin/perl
use strict;
use warnings;
use 5.10.1;
use Data::Dumper;

my $pattern = '"a" .. "f", 2 .. 4';
my @array = eval $pattern;
if ($@) {
    say "eval failed: $@";
} else {
    say Dumper \@array;
}

<强>输出:

$VAR1 = [
          'a',
          'b',
          'c',
          'd',
          'e',
          'f',
          2,
          3,
          4
        ];

答案 5 :(得分:0)

您是否意识到perl已经支持这种语法?即1..5给你阵列(1,2,3,4,5)。 a..f为你提供数组(a,b,c,d,e,f)。

print join (", ", a..f), "\n" # a, b, c, d, e, f
print join (", ", a..f, 1..3), "\n" # a, b, c, d, e, f, 1, 2, 3

实际上这基本上是M42的建议,但他没有明确指出perl支持的语法与此不同。他正在使用eval将字符串转换为数组。