Update: Für die endgültige Antwort, Antwort unter Jonathan Leffler sehen.
Ich würde dies nicht nur für zwei Felder verwenden (I pack/unpack direkt verwenden würde), aber für 20 oder 50 oder so Felder Ich mag Parse::FixedLength zu verwenden (aber ich bin voreingenommen). Z.B. (Für Beispiel) (Update: auch, können Sie $/und <> als Alternative zu lesen ($ fh, $ buf, $ buf_length) ... siehe unten):
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";
}
}
Es gibt einige, ähnliche Module, die packen/entpacken "freundlicher" machen (Siehe den "Siehe auch" -Abschnitt von Parse :: FixedLength).
Update: Wow, das sollte eine alternative Antwort sein, nicht die offizielle Antwort ... nun, da es das ist, was es ist, sollte ich einige von Jonathan Lefflers geradlinigeren Code einbeziehen, der wahrscheinlich so ist sollte in der Regel tun es (pack/unpack docs und Jonathan Leffler Knoten siehe unten):
$_ = "ABCDE 302";
my($key, $blank, $value) = unpack "A5A1A3";
Wenn alle Feldwerte sind kleiner als die feste Breite (obwohl Dies ist in seinem Beispiel nicht der Fall), wird die Zeichenfolge Auch für die nachgestellten Leerzeichen wird das getrennt, was falsch ist.Wenn die Feldwertlängen alle identisch sind, dann sind Sie richtig, es gibt keinen Unterschied zwischen –
und der festen Breite. Es ist keine Frage der Feldlänge. Wenn Felder einen signifikanten Leerraum haben können, können Sie nicht auf Whitespaces aufgeteilt werden. Das ist einer der Punkte von Feldern mit fester Länge. :) –