Читайте куски данных в Perl - PullRequest
6 голосов
/ 30 июня 2010

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

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

Спасибо.

Ответы [ 3 ]

25 голосов
/ 30 июня 2010

Да, есть. Функция 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 для более подробной информации и примеров.

6 голосов
/ 30 июня 2010

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

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

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

4 голосов
/ 30 июня 2010

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

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

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

($first, $second) = ($line =~ /(.{4})(.{11})/);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...