Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 Languages
 С
 GNU С Library 
 Qt 
 STL 
 Threads 
 C++ 
 Samples 
 stanford.edu 
 ANSI C
 Libs
 LD
 Socket
 Pusher
 Pipes
 Encryption
 Plugin
 Inter-Process
 Errors
 Deep C Secrets
 C + UNIX
 Linked Lists / Trees
 Asm
 Perl
 Python
 Shell
 Erlang
 Go
 Rust
 Алгоритмы
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 MINIX...3058 
 Solaris...2934 
 LD...2908 
 Linux Kernel 2.6...2488 
 William Gropp...2187 
 Rodriguez 6...2018 
 C++ Templates 3...1948 
 Trees...1941 
 Kamran Husain...1868 
 Secure Programming for Li...1795 
 Максвелл 5...1712 
 DevFS...1696 
 Part 3...1686 
 Stein-MacEachern-> Час...1635 
 Go Web ...1630 
 Ethreal 4...1620 
 Стивенс 9...1609 
 Arrays...1609 
 Максвелл 1...1598 
 FAQ...1540 
 
  01.01.2024 : 3621733 посещений 

iakovlev.org

Comand Line Perl

Использование опции perl -e позволяет вам установить права скрипта при его выполнении в командной строке. Перловые опции для командной строки позволяют использовать его в качестве таких утилит , как sed, awk, vi.

Опция -p делает Perl потоковым редактором , похожим на sed и awk.

При редактировании больших файлов часто бывает выгоднее выполнить команду perl -pe, чем вызывать для них какой-то редактор. Редактирование гигабайтных файлов обычным редактором - нонсенс , в то время как команда perl -p может оказаться для вас сюрпризом.

Опция p выполняет в таких случаях следующее : берет строку со стандартного входа (STDIN), присваивает ей имя переменной $_ и выполняет скрипт над ней. $_ - это специальная переменная , которая при каждой итерации инициализируется по-новой. По завершению работы скрипт выводит значение $_ на стандартный вывод (STDOUT). Опция -n работает аналогично опции -p , за исключением того , что не выводит на стандартный вывод.

Например , если у вас есть 2 текстовых файла - 123 и 456 , то команда
perl -pe '' 123 456
выведет их друг за другом на экран, т.е. сделает то же самое , что и команда
cat 123 456.

Если в файле 123 нужно заменить кусок , можно выполнить команду
perl -pe 's/искомый текст/заменяемый текст/g' < 123 > 12345

Параметр g говорит перлу заменять все вхождения подстроки,без нее замена произойдет 1 раз.

Порядок использования двойных и одинарных кавычек таков : вместо одинарных кавычек можно использовать формат
q/Hello world/
вместо двойных
qq/Hello world/

Сравните результат выполнения 2-х команд :
perl -e "$a = qq/Hello World/; print $a" # ошибка
perl -e '$a = qq/Hello World/; print $a' # напечатает "Hello World"

В случае с perl -pe для потоковых операций типа perl -pe 's/here is a typi/here is a typo/g' < inputfile > outputfile, Perl позволяет редактировать файл и делать откат.

Опция -i такой откат делать не позволит - в этом случае лучше иметь где-то копию оригинального файла. Можно использовать вместо нее опцию -i.bak для файла , который например называется foo, при этом старая сохранится как foo.bak

Например :
perl -p -i.old -e 's/oldstring/newstring/g' file

Или так
perl -p -i.old -e 's/oldstring/newstring/g' file*

Рекурсивная замена всех строк :
find . | xargs perl -p -i.old -e 's/oldstring/newstring/g'

Опция -a и -F позволяет разбивать строки на слова и копировать их в массив @F .

В следующем примере будут печататься первые 4 слова из каждой строки , при этом будут игнорироваться комментарии - строки , начинающиеся с диеза :
perl -naF 'next if /^#/; print "$F[3]\n"'

Следующий пример извлекает всех пользователей из /etc/passwd.
perl -na -F: -e 'print "$F[0]\n"' < /etc/passwd

Пусть у вас есть несколько HTTP log-файлов , которые называются по шаблону типа access_log.2005-1-1 ...... access_log.2005-12-31 и вам нужно скопировать их в access_log.old.2005-1-1 ..... access_log.old.2005-12-31:
perl -e 'for(<access_log.*>){$a = $_; s/log/log.old/; `cp $a $_`}'

В этом скрипте конструкция <access_log.*> используется для создания цикла. В каждом цикле присваивается переменная $_. В переменной $a сначала сохраняется старый файл , затем он копируется в новую переменную $_ .

В следующем примере копируется на машины B,C,D скрипт command.pl и выполняется там :
perl -e 'for("B","C","D"){`scp command.pl $_:`; `ssh $_ command.pl`; }'

Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье