如何在 Perl 中扩展像 n-m 这样的范围?

  • 本文关键字:范围 n-m Perl 扩展 perl
  • 更新时间 :
  • 英文 :


作为一名C开发人员,我对Perl相当陌生。我的要求是我需要转换这样的值

3-6,9

自:

3,4,5,6,9

另外,如果值为

3-6,9-18

自:

3,4,5,6,9,10,11,12,13,14,15,16,17,18"    

需要拆分两次才能检测3,9-123-6,9中缺失的范围端

use warnings;
use strict;
use feature 'say';
foreach my $string (q(3-6,9), q(3-6,9-12), q(3,9-12))
{
my @ranges = split /,/, $string;   #/
my @result;
for (@ranges) {
my ($beg, $end) = split /-/;
push @result, ($end ? $beg .. $end : $beg);
}
my $res = join ',', @result;
say $res;
}

打印

3,4,5,6,9 3,4,5,6,9,10,11,12 3,9,10,11,12

这适用于字符串中的更多范围1-3,8,10-12,...等。查看范围运算符 (..(

处理可能缺失的范围末端的另一种方法是

push @result, $beg .. $end // $beg;

其中//是定义的 or 运算符


三元运算符中$end的检验是针对"真值"的,对于undef''(空字符串(、0(数字零(和"0"(字符串(中的任何一个,它都失败。 在这个问题中,$end应该严格是一个正整数,这是隐式使用的。但是,undef意料之中的,通常最好是具体的

push @result, (defined $end ? $beg .. $end : $beg);

另一方面,对所有真相案例的测试也可能发现意想不到的情况(如''(。

请注意,Perl 中的"真相"有几个更有趣的案例。 感谢西尔瓦的评论。

扩展范围的一种方法:

use strict;
use warnings;
my @newvals = ();
my @retrns = qw(3-6 9 89-99);
findRanges(@retrns);
sub findRanges
{
my @vals = @_;
@newvals = map { if($_=~m/(d+)-(d+)/) { ($1 .. $2); } else { $_; }  } @vals;
}
print join "n", @newvals;

最新更新