3

ファイルでunpackを使用することを計画しています。最初に文字列でテストしました。文字列にスペースが埋め込まれている場合、以下のスクリプトはそれをnullとして表示します。ファイルスペースでテストすると、正しく読み取られます。文字列を使用するときにnullに変更される理由がわかりません。固定長ファイルの読み取り中にアンパックを使用できますか?トレーリングスペースなどを考慮する必要がありますか?

#!/usr/local/bin/perl

use strict;
use warnings;
my $str="hek kaaa";
print "<$str>\n";
foreach(unpack("(A1)*", $str)) {
    print sprintf("%x", ord), " ";
}

Output:
<hek kaaa>
68 65 6b 0 6b 61 61 61

返信ありがとうございます。以下に私のクエリを貼り付けました

perlプログラムがテキストファイルから読み取り、フォーマット「A」を使用して解凍すると、正しく機能します。最初の行iには、AとDの間の最初のフィールドにスペースが埋め込まれています。LABEL変数は「AD3」として出力されます。しかし、変数$ str = "A D3"があり、以下の方法で解凍すると、Aの後にnullがあります。ファイルと変数から読み取る場合、どのように動作が異なりますか?

foreach(unpack("(A1)*", $str)) {
    print sprintf("%x", ord), " ";
}

これは、16進出力として41 04433として表示されます。

cat test.txt
A D37845566974923342XYZ24023984
QRW49327408234028434ERD24448009

 my $file = 'test.txt';

open(my $data, '<', $file) or die "Could not open '$file'\n";
while (my $line = <$data>) {
    print $line;
    chomp $line;
    my ($label, $source, $dest, $type, $value) = unpack ("A4 A8 A8 A4 A8", $line);
    print "LABEL: $label SOURCE: $source DEST: $dest TYPE: $type VALUE: $value\n";
    print "length of a string:" . length($line) . "\n";
    foreach(unpack("(a1)*", $label)) {
       print sprintf("%x", ord), " ";
    }
    print "\n";

}
4

2 に答える 2

9

ドキュメント内のこの小さなナゲットはpack/unpack見逃しがちです。

「a」、「A」、および「Z」タイプは1つの値だけをむさぼり食いますが、必要に応じてnullまたはスペースを埋めて、長さカウントの文字列としてパックします。 解凍すると、「A」は末尾の空白とnullを削除し、「Z」は最初のnull以降のすべてを削除し、「a」はデータをそのまま返します。

回避策として、テンプレートで:の代わりにaまたはを使用できます。ZA

$ perl -e 'print ord unpack("A", " ")'
0

$ perl -e 'print ord unpack("a", " ")'
32

$ perl -e 'print ord unpack("Z", " ")'
32
于 2012-07-03T02:12:37.767 に答える
2

pack 'A'スペースのあるパッドなので、unpack 'A'末尾のスペースを削除します。(実際には、空白とNULです。)

>perl -E"say(($ARGV[0] eq unpack('A20', pack('A20', $ARGV[0]))) ? 1 : 0)" abc
1

あなたは" a"が欲しい。

unpack("(a1)*", $str)

とはいえ、「1」は不要です。

unpack("(a)*", $str)

最後に、これにsplitはより一般的に使用されます。

split(//, $str)
于 2012-07-03T03:03:24.863 に答える