繁体   English   中英

perl 等效于 python array.array(typecode, ..)

[英]perl equivalent of python array.array(typecode, ..)

我正在尝试将 python 脚本翻译为 perl 但目前停留在几个代码片段中。

例如如何在 perl 中编写以下 python 代码? (不使用任何 perl 阵列相关包)

# packet here is a binary string
data = array.array( 'h', ( ord( packet[i] ) for i in range( start, end ) ) )
FILE.write(data);

我的(失败的)尝试:

my @data;
foreach $i ( $start .. $end ) {
   $data[$i] = ord( substr( $packet, $i, 1) );  # Assuming that perl's ord = python's ord
}

print FILE @data;

@ysth ,实际输入是一个大的二进制文件,很高兴在这里发布我的第一个问题,我忘记生成示例输入和输出,对此感到抱歉。 为了完整起见,请在示例输入和 output 下方找到。

input: ['a', 'b', 'c', 'd'] #认为这是数据包内容, start=0, end=4

python 中的输出:

> cat py.out | xxd
0000000: 6100 6200 6300 6400                      a.b.c.d.

perl 中的 output:

> cat pl.out | xxd
0000000: 3937 3938 3939 3130 30                   979899100

@Pedro Silva ,据我所知,在您的建议的第一行中,您只需用 map 功能替换 for 循环,效果是一样的。 解包“W*”返回错误,因为 W 不是有效类型(perl 5.8.8)。

编辑

你需要澄清你在说什么。 在我的 python (2.7.2) 上,这是错误的:

FILE.write(data)

因为data需要是一个字符串。 我认为您的意思是:

data.tofile(FILE)

无论如何,这是你想要的吗?

print pack("s*", unpack("C*", "abcd"))
# piped through xxd => 0000000: 6100 6200 6300 6400     a.b.c.d.

查看perldoc -f pack以了解要使用的正确模板字符串。 由于您无权访问W (无符号 wchar),因此我使用的是C (无符号字符)。 s是一个有符号的short(对应于python的h 。)

/编辑

Perl 中没有类型化的 arrays。 ord返回其参数的第一个字符的数值。

假设这是您想要的,只需 map 将每个字符上的$packet拆分为@data产生的列表,用ord转换每个元素(隐式给出参数$_ 。)

my @data = map { ord } split //, $packet; # or
my @data = unpack 'W*', $packet;          

或者,使用与$packet的实际下限和上限不同的范围:

(split //, $packet)[$start .. $end];    # or
 split //, substr $packet, $start, $end # ysth's version

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM