在 Perl 中,如何解压为多个变量?

发布于 2024-07-27 18:16:35 字数 474 浏览 9 评论 0原文

我有一个包含以下内容的结构:

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)” 因此,要么这无法完成,要么我没有使用正确的模板字符串。

注意:我正在使用大端数据。

有任何提示吗?

I have a struct wich contains:

struct mystruct{
  int                id[10];
  char               text[40];
  unsigned short int len;
};

And I'm trying to unpack it in a single line, something like this:

  my(@ids,$text,$length) = unpack("N10C40n",$buff) ;

But everything is going to the first array(@ids), i've tried templates as "N10 C40 n" and "(N10)(C40)(n)"
So, either this can't be done or I'm not using the proper template string.

Note: I'm using big endian data.

Any hints?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

Saygoodbye 2024-08-03 18:16:35

在列表分配中,第一个数组或散列将吃掉所有内容(它如何知道在哪里停止?)。 试试这个:

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;

In list assignment the first array or hash will eat everything (how would it know where to stop?). Try this instead:

my @unpacked        = unpack "N10Z40n", $buff;
my @ids             = @unpacked[0 .. 9];
my ($text, $length) = @unpacked[10, 11];

you could also say

my @ids;
(@ids[0 .. 9], my ($text, $length)) = unpack "N10Z40n", $buff;
梦幻之岛 2024-08-03 18:16:35

如果 @ids 的顺序无关紧要:

my ($length, $text, @ids) = reverse unpack("N10C40n",$buff) ;

If the order of the @ids does not matter:

my ($length, $text, @ids) = reverse unpack("N10C40n",$buff) ;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文