首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于perl解包

关于perl解包
EN

Stack Overflow用户
提问于 2012-07-03 10:03:36
回答 2查看 1.4K关注 0票数 3

我计划在文件中使用解包。首先,我使用字符串进行测试。当我在字符串中嵌入一个空格时,下面的脚本将它显示为null。当我测试一个文件时,空间是否被正确读取。当我处理字符串时,我不确定为什么它要将它改为null。是否可以在读取定长文件时使用解包?我是否需要考虑尾随空格或其他任何内容?

代码语言:javascript
复制
#!/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之间的第一个字段中嵌入了一个空格。标签变量打印为"A D3“。但是当我有一个变量$str="A D3“并按照下面的方式解包时,它在A之后有一个null,当从文件和变量中读取时,它的工作方式有什么不同?

代码语言:javascript
复制
foreach(unpack("(A1)*", $str)) {
    print sprintf("%x", ord), " ";
}

它显示为十六进制输出41 0 44 33

代码语言:javascript
复制
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";

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-03 10:12:38

pack/unpack文档中的这个小金块很容易被忽略:

"a“、"A”和"Z“类型仅吞噬一个值,但将其打包为长度计数的字符串,并根据需要填充空值或空格。解包时,"A“剥离尾随空格并将设为空,"Z”剥离第一个null之后的所有内容,"a“原封不动地返回数据。

作为一种解决方法,您可以在模板中使用aZ来代替A

代码语言:javascript
复制
$ perl -e 'print ord unpack("A", " ")'
0

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

$ perl -e 'print ord unpack("Z", " ")'
32
票数 9
EN

Stack Overflow用户

发布于 2012-07-03 11:03:25

pack 'A'用空格填充,因此unpack 'A'删除尾随空格。(实际上是空格和NULs。)

代码语言:javascript
复制
>perl -E"say(($ARGV[0] eq unpack('A20', pack('A20', $ARGV[0]))) ? 1 : 0)" abc
1

你想要"a“。

代码语言:javascript
复制
unpack("(a1)*", $str)

也就是说,"1“是多余的。

代码语言:javascript
复制
unpack("(a)*", $str)

最后,split更常用于此目的。

代码语言:javascript
复制
split(//, $str)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11303571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档