【问题标题】:In Perl, how can I unpack to several variables?在 Perl 中,我如何解压缩到多个变量?
【发布时间】: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)” 所以,要么这不能完成,要么我没有使用正确的模板字符串。

注意:我使用的是大端数据。

有什么提示吗?

【问题讨论】:

    标签: perl unpack


    【解决方案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 返回的足够小的列表,它可能更简单。
    猜你喜欢
    • 2020-05-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 2014-10-28
    相关资源
    最近更新 更多