在 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 而不是C40A40 是一个用空格填充的四十个字符的字符串,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 中,我如何解压缩到多个变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中解压缩双精度值?

如何批量解压缩文件到同一目录下?

如何解压缩传递变量的文件夹?

Python:如何在 for 中解压缩多个值?

如何在 HDFS 中解压缩多个 zip 文件

如何从多个 tar 文件中解压缩特定文件并压缩它们?