2016-08-06 2 views
4
$a = "aaata"; 
$b = "aataa"; 
$count = ($a^$b) =~tr/\0//c; 

выход 2 (из-за двух промахов матчей выполнить с помощью c флага) без использования вывода c флаг 3 (спички)В чем смысл 0 в perl?

Вот то, что является использование \0 в tr. Без использования tr, скрипт дает некоторый тарабарщический характер. Я не знаю, что это такое и как использовать tr здесь и использовать \0. Кроме того, мы используем \0 в perl.

ответ

6

В общем, последовательности выхода состоящая из до трех восьмеричных цифр будет вставить символ с этой точкой коды, так \40 или \040 производит пробел, и \0 производит ASCII NUL

код подсчета количества символов, которые различное между $a и $b

Он выполняет побитовое XOR по двум строкам. Любые символы, которые идентичны, будут XOR вместе с нолем, создавая символ NUL. В tr/\0//c подсчитывает количество символов в результирующую строку, кроме NULs (из-за модификатора /c), поэтому он будет возвращать 2 в этом случае, поскольку две строки различны в третьем и четвертом позициях символов

сбросами значение выражения $a^$b показывает это ясно

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

The tr/// подсчетов два \25 символов, игнорируя все NULs

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, так как представление 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}//

Смежные вопросы