Что является хорошим путем в Perl для разделения строки на части переменной длины, когда нет никакого разделителя, я могу использовать. Мои данные организованы длиной столбца, таким образом, первая переменная находится в положениях 1-4, вторая переменная является положениями 5-15 и т.д. Существует много переменных каждый с различными длинами.
Другими словами там некоторый путь состоит в том, чтобы использовать функцию разделения на основе положения в строке, не подобранное выражение?
Спасибо.
Да, есть. Функция 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
для получения более подробной информации и примеров.
Вместо использования split
попробуйте старый метод substr :
my $first = substr($input, 0, 4);
my $second = substr($input, 5, 10);
# etc...
(мне тоже нравится метод распаковки, но метод substr проще писать, не обращаясь к документации, если вы разбираете только несколько полей.)
Вы можете использовать функцию substr()
для извлечения данных по смещению:
$first = substr($line, 0, 4);
$second = substr($line, 4, 11);
Другой вариант - использовать регулярное выражение:
($first, $second) = ($line =~ /(.{4})(.{11})/);