这是我的程序
#!/usr/bin/perl -w
use strict;
use warnings;
my $pattern = 'a .. f';
我正在寻找一种从这种模式中获取数组的方法。我认为使用的一种方法是将其拆分为三个并获得如下数组。但似乎这不是一个可行的解决方案,因为未来的模式将会发生变化。它可能类似于'a..f1..9',因此拆分可能无法在那里工作或者我必须为它编写更多的通用代码。 因此,寻找一种基于提供的输入模式生成数组的方法。
答案 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将字符串转换为数组。