我打算在文件中使用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”解压缩时工作正常。第一行我在A和D之间的第一个字段中有一个嵌入空格.LABEL变量打印为“A D3”。但是当我有一个变量$ str =“A D3”并以下面的方式解压缩时它在A之后有一个空值。从文件和变量读取时它的工作方式有何不同?
foreach(unpack("(A1)*", $str)) {
print sprintf("%x", ord), " ";
}
它显示为十六进制输出 41 0 44 33
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";
}
答案 0 :(得分:7)
pack/unpack
文档中的这个小块很容易错过:
“a”,“A”和“Z”类型只有一个值,但是 将其打包为长度计数字符串,填充空值 或必要时的空间。 打开包装时,“A”条带 尾随空格和空值,“Z”删除所有内容 在第一个null之后,“a”逐字返回数据。
作为解决方法,您可以在模板中使用a
或Z
而不是A
:
$ perl -e 'print ord unpack("A", " ")'
0
$ perl -e 'print ord unpack("a", " ")'
32
$ perl -e 'print ord unpack("Z", " ")'
32
答案 1 :(得分:1)
pack 'A'
个填充,因此unpack 'A'
会删除尾随空格。 (实际上,空白和NULs。)
>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)