将字节数组转换为十进制

Converting byte array to decimal

想知道是否有人可以向我深入解释这个片段

(my $bytearray_val_ascii = $in) =~ s/([a-fA-F0-9]{2})/chr(hex )/eg;

s/// 是 left-hand 端变量的正则表达式 substitution operator which the =~ operator binds,因此语句

$var =~ s/pattern/replacement/;

匹配变量 $var 中的 pattern 并用 replacement 字符串替换它,在double-quoted 上下文。可以通过在结束定界符之后的 modifiers 调整操作(也可以嵌入模式中)。

这会更改变量“in-place”——在此语句 $var 更改之后。保留 $var 并将更改后的字符串存储在另一个变量中的习惯用法是将 $var 分配给另一个变量,然后“然后”更改它(通过括号对操作进行排序),所有这些都在一条语句中完成。而常用的成语是在那个语句中也引入一个新的变量

(my $new_var = $original) =~ s/.../.../;

现在$original不变,而改变的字符串在$new_var中(如果模式匹配)。

自从引入了 r (non-destructive) 修饰符 in 5.14

以来,现在不需要这个习语了
my $new_var = $original =~ s/.../.../r;

$original不变,返回修改后的字符串,赋值给$new_var


正则表达式本身匹配并捕获两个连续的字母数字字符,对它们运行 hex,然后对 hex returns 运行 chr,并使用该结果替换他们。它不断遍历字符串,以对它找到的所有此类对执行此操作。

如果这确实是所有要做的事情,那么使用 pack

就更简单了
my $bytearray_val_ascii = pack( "H*", $in );

这里的修饰符是:e,这使得替换端被评估为代码,以便该代码评估的内容用于替换;和 g 这使得它继续搜索和替换整个字符串(不仅仅是找到的 pattern 的第一次出现)。