$a = "aaata";
$b = "aataa";
$count = ($a ^ $b) =~tr/\0//c;
输出2(因为c
标志执行两次未命中匹配)
不使用c
标志输出的是3
(匹配)
\0
tr
中tr
的使用情况。不使用tr
,脚本会给出一些乱码。我不知道这里使用\0
是什么以及使用\0
。除此之外,我们在perl中使用{{1}}。
答案 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") == 0
,ord("a" ^ "t") == 0x15
和ord("t" ^ "a") == 0x15
,因为"a"
的ASCII表示是十六进制0x61
和二进制
0b0110_0001
(尝试printf "%b\n", ord "a"
)和“t”的ASCII值为0x74
或二进制0b0111_0100
。
现在,对0b0110_0001
和0b0111_0100
进行异或,会得到0b0001_0101
或十六进制0x15
。
tr/\0//c
中transliteration operator tr
的目的是计算非零字节的数量
在5个字符长的字符串中。
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);
功能