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
, так как представление ASCII для "a"
шестнадцатеричное 0x61
и двоичный 0b0110_0001
(попробуйте printf "%b\n", ord "a"
) и значение ASCII "Т" является 0x74
или двоичный код 0b0111_0100
.
Теперь, принимая XOR 0b0110_0001
и 0b0111_0100
, выдает 0b0001_0101
или шестнадцатеричный 0x15
.
Цель transliteration operator tr
в tr/\0//c
теперь подсчитать количество ненулевых байтов в строке длиной 5 символов.
Согласно documentation:
тр/спискупоиска/REPLACEMENTLIST/CDSR
Транслитерирует все вхождения символов, найденных в списке поиска с соответствующим символом в списке замены. Он возвращает количество замененных или удаленных символов.
и
Если задан модификатор /c
, набор SEARCHLIST
характер дополняется.
и
Если REPLACEMENTLIST
пуст, SEARCHLIST
тиражируется. Этот последний полезен для подсчета символов в классе или для раздачи символов символов в классе.
Далее perlrebackslash документирует значение \0
.Это восьмеричное последовательность выхода:
восьмиштырьковый ускользает
Есть две формы восьмеричных побегах. Каждый используется для указания символа по его кодовой точке, указанной в восьмеричной нотации.
Так tr/\0//c
эквивалентно tr/\001-\377/\001-\377/
и, следовательно, он будет считать ненулевых символов.
Сноска:
1. Использование восьмеричного ускользает от формы \xxx
обескураживает для чисел больше, чем \077
см perlrebackslash для получения дополнительной информации. Следовательно, tr/\001-\377//
лучше написано с использованием \o{}
побега в tr/\o{1}-\o{377}//