在 Perl 中,我如何解压缩到多个变量?
Posted
技术标签:
【中文标题】在 Perl 中,我如何解压缩到多个变量?【英文标题】:In Perl, how can I unpack to several variables? 【发布时间】:2009-07-22 13:00:32 【问题描述】:我有一个结构,其中包含:
struct mystruct
int id[10];
char text[40];
unsigned short int len;
;
我试图在一行中解压它,如下所示:
my(@ids,$text,$length) = unpack("N10C40n",$buff) ;
但一切都将进入第一个数组(@ids),我尝试过模板为“N10 C40 n
”和“(N10)(C40)(n)
”
所以,要么这不能完成,要么我没有使用正确的模板字符串。
注意:我使用的是大端数据。
有什么提示吗?
【问题讨论】:
【参考方案1】:在列表分配中,第一个数组或散列会吃掉所有东西(它怎么知道在哪里停止?)。试试这个:
my @unpacked = unpack "N10Z40n", $buff;
my @ids = @unpacked[0 .. 9];
my ($text, $length) = @unpacked[10, 11];
你也可以说
my @ids;
(@ids[0 .. 9], my ($text, $length)) = unpack "N10Z40n", $buff;
【讨论】:
我没有收到 C40 到 $text,而是第一个 C 到 $text,第二个 C 到 $length 嗯,我以为你的解压是正确的,让我快速看一下。 您可能想要A40
而不是C40
。 A40
是一个用空格填充的四十个字符的字符串,C40
是四十个单独的八位字节。您可能还需要Z40
,它更符合text
是C 样式字符串(即空字符终止序列)的想法。
您能否更新您的正确答案:my (@ids,$text,$length); (@ids[0 .. 9], $text, $length) = unpack ("N10Z40n", $buff);【参考方案2】:
如果@ids
的顺序无关紧要:
my ($length, $text, @ids) = reverse unpack("N10C40n",$buff) ;
【讨论】:
有趣的想法,我没有考虑过。 @Chas。它在速度方面可能不如您的解决方案,但对于unpack
返回的足够小的列表,它可能更简单。以上是关于在 Perl 中,我如何解压缩到多个变量?的主要内容,如果未能解决你的问题,请参考以下文章