提取的包含范围功能的数据文件未激活

时间:2014-07-23 16:47:09

标签: perl

我在文件中提取了以下数据

0..5 
8..10 
12..16 

但这些不适用于范围功能。我把它们存储在一个数组中。

@arr=('0..5,8..10,12..16');

打印完阵列后,它会给出

0..5 
8..10 
12..16

但我需要输出

0 1 2 3 4 5
8 9 10
12 13 14 15 16

我没有得到问题所在。为什么存储的数据(..)不能作为范围工作。功能

4 个答案:

答案 0 :(得分:2)

您从范围的字符串表示开始,而不是实际的perl范围。

要获取perl数组,您必须转换数据。您可以像其他人推荐的那样使用eval。然而,这就像使用弯刀进行理发一样。

相反,我建议使用更精确的工具从字符串中提取范围边界,然后构建新的数据结构。使用split或正则表达式可以轻松提取值。以下是使用后者的方法:

use strict;
use warnings;

while (<DATA>) {
    chomp;
    my ($start, $end) = /(\d+)/g;
    my @array = ($start .. $end);
    print "@array\n";
}

__DATA__
0..5
8..10
12..16

输出:

0 1 2 3 4 5
8 9 10
12 13 14 15 16

连续多个条目的附录

以下内容允许多个范围位于单行上。请注意,我在这个版本中使用split是为了多样化,尽管我也可以很容易地使用正则表达式:

use strict;
use warnings;

while (<DATA>) {
    chomp;
    my @array;
    for my $range (split ' ') {
        my ($start, $end) = split /\.{2}/, $range, 2;
        push @array, ($start .. $end);
    }
    print "@array\n";
}

__DATA__
0..5
4..9 14..18
8..10
12..16

输出:

0 1 2 3 4 5
4 5 6 7 8 9 14 15 16 17 18
8 9 10
12 13 14 15 16

答案 1 :(得分:1)

数据是数据。 Perl不会将数据评估为Perl(即展开..范围运算符),除非您明确告诉它eval。以下调试会话应该为您澄清一些事情。

$ perl -de0

Loading DB routines from perl5db.pl version 1.33
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(-e:1):   0
  DB<1> @arr = ('0..5,8..10,12..16')

  DB<2> p @arr
0..5,8..10,12..16
  DB<3> eval "@arr = ('0..5,8..10,12..16')"

  DB<4> p @arr
0..5,8..10,12..16
  DB<5> @arr = ('0..5','8..10','12..16')

  DB<6> p @arr
0..58..1012..16

  DB<7> @arr = eval "(0..5,8..10,12..16);"

  DB<8> x @arr
0  0
1  1
2  2
3  3
4  4
5  5
6  8
7  9
8  10
9  12
10  13
11  14
12  15
13  16
  DB<9>

答案 2 :(得分:0)

如果您希望Perl将字符串范围扩展为Perl范围,则必须eval该数据。

use strict;
use warnings;

use feature qw(say);

my @arr=('0..5','8..10','12..16');
foreach my $range (@arr) {
   say join ' ', eval ($range);
}

__END__
0 1 2 3 4 5
8 9 10
12 13 14 15 16

答案 3 :(得分:-2)

尝试将值存储在数组中:

@arr=((0..5),(8..10),(12..16));