я извлек следующие данные в файл
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
я не понимаю, где проблема. почему хранящиеся данные (..) не работают как диапазон. функция
Вы начинаете с строковых представлений диапазонов, а не фактических диапазонов perl.
Чтобы получить массив perl, вы должны преобразовать свои данные. Вы можете использовать eval
как рекомендовали другие. Тем не менее, это похоже на использование мачете для выполнения стрижки.
Вместо этого я бы посоветовал использовать более точные инструменты для извлечения границ диапазона из строки, а затем построить новую структуру данных. Использование split
или regex может легко вывести значения. Следующее делает так, используя последнее:
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
Данные – это данные. 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>
Если вы хотите, чтобы 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
Попробуйте сохранить значения в массиве:
@arr=((0..5),(8..10),(12..16));