gpt4 book ai didi

perl - 关于 perl 解包

转载 作者:行者123 更新时间:2023-12-01 09:34:12 25 4
gpt4 key购买 nike

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

#!/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";

}

最佳答案

pack/unpack 中的这个小金 block 文档很容易被遗漏:

The "a", "A", and "Z" types gobble just one value, but pack it as a string of length count, padding with nulls or spaces as necessary. When unpacking, "A" strips trailing whitespace and nulls, "Z" strips everything after the first null, and "a" returns data verbatim.

作为解决方法,您可以在模板中使用 aZ 而不是 A:

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

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

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

关于perl - 关于 perl 解包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11303571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com