Обновление: для окончательного ответа см. Ответ Джонатана Леффлера ниже.
Я бы не использовал это только для двух полей (я бы использовал pack / unpack напрямую), но для 20 или 50 или около того полей мне нравится использовать Parse :: FixedLength (но я пристрастен). Например. (для вашего примера) (Обновление: также вы можете использовать $ / и <> в качестве альтернативы чтению ($ fh, $ buf, $ buf_length) ... см. ниже):
use Parse::FixedLength;
my $pfl = Parse::FixedLength->new([qw(
key:5
blank:1
value:3
)]);
# Assuming trailing newline
# (or add newline to format above and remove "+ 1" below)
my $data_length = $pfl->length() + 1;
{
local $/ = \$data_length;
while(<FILE>) {
my $data = $pfl->parse($_);
print "$data->{key}:$data->{value}\n";
# or
print $data->key(), ":", $data->value(), "\n";
}
}
Существуют некоторые похожие модули, которые делают упаковку / распаковку более «дружественной» (см. Раздел «Смотрите также» в Parse :: FixedLength).
Обновление: вау, это должен был быть альтернативный ответ, а не официальный ответ ... ну, так как это то, чем он является, я должен включить некоторые из более прямого кода Джонатана Леффлера, который, вероятно, вам следует обычно делают это (см. pack / unpack docs и узел Джонатана Леффлера ниже):
$_ = "ABCDE 302";
my($key, $blank, $value) = unpack "A5A1A3";