我在文件中提取了以下数据
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
我没有得到问题所在。为什么存储的数据(..)不能作为范围工作。功能
答案 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));