Считайте блоки данных в Perl

Что является хорошим путем в Perl для разделения строки на части переменной длины, когда нет никакого разделителя, я могу использовать. Мои данные организованы длиной столбца, таким образом, первая переменная находится в положениях 1-4, вторая переменная является положениями 5-15 и т.д. Существует много переменных каждый с различными длинами.

Другими словами там некоторый путь состоит в том, чтобы использовать функцию разделения на основе положения в строке, не подобранное выражение?

Спасибо.

6
задан itzy 29 June 2010 в 20:22
поделиться

3 ответа

Да, есть. Функция unpack хорошо подходит для работы с записями фиксированной ширины.

Пример

my $record = "1234ABCDEFGHIJK";
my @fields = unpack 'A4A11', $record;  # 1st field is 4 chars long, 2nd is 11

print "@fields";                       # Prints '1234 ABCDEFGHIJK'

Первый аргумент - это шаблон, который сообщает unpack , где поля начинаются и заканчиваются. Второй аргумент сообщает ему, какую строку нужно распаковать.

unpack также можно указать игнорировать позиции символов в строке, указав нулевые байты, x . Шаблон 'A4x2A9' можно использовать для игнорирования «AB» в примере выше.

См. perldoc -f pack и perldoc perlpacktut для получения более подробной информации и примеров.

25
ответ дан 8 December 2019 в 02:34
поделиться

Вместо использования split попробуйте старый метод substr :

my $first = substr($input, 0, 4);
my $second = substr($input, 5, 10);
# etc...

(мне тоже нравится метод распаковки, но метод substr проще писать, не обращаясь к документации, если вы разбираете только несколько полей.)

6
ответ дан 8 December 2019 в 02:34
поделиться

Вы можете использовать функцию substr() для извлечения данных по смещению:

$first = substr($line, 0, 4);
$second = substr($line, 4, 11);

Другой вариант - использовать регулярное выражение:

($first, $second) = ($line =~ /(.{4})(.{11})/);
4
ответ дан 8 December 2019 в 02:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: