在Perl中\ 0是什么意思?

时间:2016-08-06 09:44:05

标签: perl

$a = "aaata";
$b = "aataa";
$count = ($a ^ $b) =~tr/\0//c;  

输出2(因为c标志执行两次未命中匹配) 不使用c标志输出的是3(匹配)

\0 trtr的使用情况。不使用tr,脚本会给出一些乱码。我不知道这里使用\0是什么以及使用\0。除此之外,我们在perl中使用{{1}}。

2 个答案:

答案 0 :(得分:7)

通常,由最多三个八进制数字组成的转义序列将插入带有该代码点的字符,因此\40\040会生成一个空格字符,而\0会产生一个ASCII NUL

代码正在计算$a$b

之间不同的字符数

它对两个字符串进行按位XOR。任何相同的字符都会异或为零,从而产生NUL字符。 tr/\0//c计算结果字符串中非NUL 的字符数(由于/c修饰符),因此在这种情况下它将返回2,因为这两个字符串是第三和第四个角色不同

转储表达式$a ^ $b的值可以清楚地显示

"\0\0\25\25\0"

tr///计算两个\25字符,忽略所有NUL

答案 1 :(得分:2)

bitwise string operator ^返回其两个xor运算符中每个字节的逐字节bit string。所以

$a = "aaata"; $b = "aataa";
printf "%vX\n", ($a ^ $b);

给出

0.0.15.15.0

因为ord("a" ^ "a") == 0ord("a" ^ "t") == 0x15ord("t" ^ "a") == 0x15,因为"a"的ASCII表示是十六进制0x61和二进制 0b0110_0001(尝试printf "%b\n", ord "a")和“t”的ASCII值为0x74或二进制0b0111_0100

现在,对0b0110_00010b0111_0100进行异或,会得到0b0001_0101或十六进制0x15

tr/\0//ctransliteration operator tr的目的是计算非零字节的数量 在5个字符长的字符串中。

根据documentation

  

tr / SEARCHLIST / REPLACEMENTLIST / cdsr

     

翻译在搜索中找到的所有出现的字符   列表中包含替换列表中的相应字符。它   返回被替换或删除的字符数。

  

如果指定了/c修饰符,则SEARCHLIST字符集为   补充。

  

如果REPLACEMENTLIST为空,则复制SEARCHLIST。这个   后者对于计算类中的字符或压缩是有用的   一个班级中的字符序列。

进一步perlrebackslash记录了\0的含义。这是一个八进制转义序列:

  

八月逃脱

     

有八种形式的八进制逃逸。每个用于指定一个   字符由其八进制表示法指定的代码点。

因此tr/\0//c相当于tr/\001-\377/\001-\377/ 1 ,因此它将计算任何非零字符。

<强>脚注:

1.对于大于\xxx的数字,不鼓励在\077表单上使用八进制转义符,有关详细信息,请参阅perlrebackslash。因此,tr/\001-\377//使用\o{}转义更好地编写tr/\o{1}-\o{377}// $array_1 = array('20','30','30','20'); $array_2 = $array_1; rsort($array_2); $first_keys = array(); foreach($array_1 as $key=>$arr1){ $searchKey = array_search($arr1, $array_2); $first_keys[] = $searchKey; unset($array_2[$searchKey]); } echo "<pre>"; print_r($first_keys); 功能