извлеченный файл данных, содержащий функцию диапазона, не активен

Вопрос:

я извлек следующие данные в файл

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

я не понимаю, где проблема. почему хранящиеся данные (..) не работают как диапазон. функция

Ответ №1

Вы начинаете с строковых представлений диапазонов, а не фактических диапазонов 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

Ответ №2

Данные — это данные. 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>

Ответ №3

Если вы хотите, чтобы 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

Ответ №4

Попробуйте сохранить значения в массиве:

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

Оцените статью
TechArks.Ru
Добавить комментарий