Вот сценарий Perl только, чтобы показать, как это - возможный Perl использования, поразрядный эксклюзивный или оператор (XOR) (^
).
Я назвал его cmp.pl
.
#!/usr/bin/perl -w
use strict;
use warnings;
# $s1 = "http://unix.stackexchange.com/questions/tagged/linux?page=2&sort=newest&pagesize=15";
# $s2 = "http://unix.stackexchange.com/questions/tagged/linux?page=3&sort=newest&pagesize=15";
# $np = 115
my $s1 = $ARGV[0];
my $s2 = $ARGV[1];
my $np = $ARGV[2];
my $posOfDiff;
my $mask = $s1 ^ $s2;
while ($mask =~ /[^\0]/g) {
$posOfDiff = $-[0];
}
for (my $idx = 1; $idx <= $np; $idx++) {
my $newStr = $s1;
substr($newStr,$posOfDiff,1) = $idx;
print "$newStr\n";
}
Уникальная функция этого сценария является использованием Perl (^
) оператор. Питание этого подхода находится в этом отрывке кода:
my $mask = $s1 ^ $s2;
while ($mask =~ /[^\0]/g) {
$posOfDiff = $-[0];
}
Вышеупомянутое создаст маску ($mask
) использование 2 строк. Маска XOR является вектором, который будет содержать 0 для значений то соответствие между $s1
и $s2
, и 1, где они отличаются. Можно добавить эту строку кода, если Вы хотите убедить себя в этом:
my $mask = $s1 ^ $s2;
printf "[$_] is 0x%02x\n", ord($_) for split //, $mask;
Это printf
произведет вывод как это.Примечание: то, что символы являются непечатными, они - шестнадцатеричные значения. 0x00 является шестнадцатеричным значением для нулевого символа, 0x01 является 1.
...
[] is 0x00
[] is 0x00
[] is 0x00
[] is 0x00
[] is 0x00
[ ] is 0x01
[] is 0x00
[] is 0x00
...
Значение, возвращенное, когда что-либо кроме 0 означает значения, отличается. Другие примеры:
$ perl -we '$a="ab"; $b="ac"; $c=$a ^ $b; printf "[$_] is 0x%02x\n", ord($_) for split //, $c;'
[] is 0x00
[] is 0x01
$ perl -we '$a="ab"; $b="ad"; $c=$a ^ $b; printf "[$_] is 0x%02x\n", ord($_) for split //, $c;'
[] is 0x00
[] is 0x06
$ perl -we '$a="ab"; $b="ae"; $c=$a ^ $b; printf "[$_] is 0x%02x\n", ord($_) for split //, $c;'
[] is 0x00
[] is 0x07
Другая интересная функция while
цикл - то, что это циклично выполняется только через символы $mask
это не пустые указатели (\0
). Таким образом в Вашем примере, мы на самом деле только выполняем время цикла с условием продолжения 1, так как существует только 1 различие между 2 строками. Если бы было 2 различия, то это выполнилось бы 2 раза. Таким образом, это - довольно эффективный способ сделать это.
Если Вам нужно более убедительный, вот некоторые дополнительные строки кода, можно добавить что шоу while
цикл в действии:
while ($mask =~ /[^\0]/g) {
print "in the loop\n";
print "what we're looking for:" . $-[0] . "\n";
Эти строки только отображены одно время:
in the loop
what we're looking for:58
После того как соответствие найдено, тело цикла с условием продолжения выполнится, и положение будет зарегистрировано в переменной $posOfDiff
. Как? Красота здесь является использованием переменной, $ - [0]. Это даст нам смещение положения последнего успешного соответствия.
$ - [0] является смещением запуска последнего успешного соответствия.
Это соответствие - то, что происходит в части управления while
цикл, мы ищем символы в $mask
это не нулевой символ (\0
), следовательно наш символ различия:
$mask =~ /[^\0]/g
Примечание: Запаздывание g
говорит функции соответствия в Perl делать это глобально, таким образом, это будет продолжать находить соответствия, пока это не исчерпает строку, $mask
.
Остальная часть этого сценария является в значительной степени шаблонным Perl, который не стоит обсудить далее.
Другой пример: Если я напечатаю
reboot now
, то просто запущуreboot
.
Создадим функцию:
reboot() {
command reboot
}
Теперь вызов команды reboot
вызовет функцию reboot
, которая проигнорирует все переданные ей параметры.
То есть:
reboot
и
reboot now
выполнит команду reboot
(без каких-либо аргументов).
Это то, чего я действительно хочу: если вы выполнили [113280] перезагрузку сейчас [113281], я хочу, чтобы она действительно выполнила [113282] перезагрузку [113283].
Выясните абсолютный путь [112662] перезагрузки [112663] (например, через [112664], где эта перезагрузка [112665]). Убедитесь, что [112666]/usr/local/bin[112667] находится в $PATH до этого (вероятно, уже находится).[112668]1[112669] Теперь создайте файл [112670]/usr/local/sbin/reboot[112671], который выглядит следующим образом:
Который должен принадлежать root и [112672]chmod 755 /usr/local/bin/reboot[112673]. Отныне по умолчанию
Вы должны просто псевдоним ls
:
alias ls='ls -a'
после этого, если вы сделаете ls -l
, это приведет к ls -la