Авторские статьи Perl с нуля на примере

Discussion in 'Статьи' started by LoFFi, 15 Mar 2006.

  1. LoFFi

    LoFFi Elder - Старейшина

    Joined:
    21 Feb 2006
    Messages:
    194
    Likes Received:
    90
    Reputations:
    85
    Решил написать статью. Опять таки для начинающих в области языка Perl.
    Решил просто подробно описать иногда нужную прогу - парсер, написанный мною.

    Надеюсь статья поможет новичкам

    Эта програмка расчитана на создание словаря для брутуса в виде логин:логин
    используя логины файла /etc/passwd

    Вот собственно код:
    Code:
    #!/usr/bin/perl
    
    $outfilename = 'parced.txt';
      
    if ($ARGV[0] eq '') {print "\nsyntax:\n\tperl parcer.pl [filepath]\nExample: \n\tperl parcer.pl passwd";exit 0;}
    
    $filepath = $ARGV[0];
    open(inptfl,"< $filepath") or die print "\n\nError opening file!";
    open(STDOUT,"> $outfilename") or die print "\n\nError writing file!";
    @inputrow = <inptfl>;
    
    foreach (@inputrow) {
    $u = index $_,':',0;
    $name = substr $_,0,$u;
    $i = substr $name,0,1;
    (print "$name:$name\n") unless (($i eq '#')or($name eq ''));
    }
    
    close(inptfl);
    close(STDOUT);
    

    Ну что ж... преступим к описанию.....
    Итак. Ну я не буду ничего говорить про первую строку - итак все понятно.

    Для удобства объявляем переменную $outfilename, в которой указываем
    имя исходящего файла-словаря.
    Далее мы оператором if проверяем входящий параметр, и если он не указан,
    то выводим сообщение. Еще надо учесть что в перле есть несколько операторов
    сравнения. Одни из них это '==' и 'eq'. Отличие в том, что первый сравнивает
    численные значения переменных, а 'eq' сравнивает строки.
    Мы используем массив ARGV. Это системный массив. В нем указываються все
    входящие данные. И так как нам нужно первое, то пишем $ARGV[0], так как счет
    всегда начинаеться с нуля.

    Далее если ARGV пустой, то 'exit 0;' - выходим из программы, возвращая 0.
    Если же нет, то идем далее. Записываем в переменную $filepath путь к файлу,
    который откываем для парсинга. После этого открываем этот файл.
    Синтаксис такой:

    open ДЕСКРИПТОР, ИМЯ_ФАЙЛА;

    так же в начале имени файла стоит знак '<' обозначающий, что файл открыт только на чтение
    соответсвенно знак '>' - открытие на запись. после оператора OPEN идет OR DIE. Это место
    код которого будет выполняться если не получиться открыть файл.

    Будем использовать немного не стандартный, но более удобный (для меня =) ) метод записи в файл.
    Далее поймете какой. Для начала файлу, куда записываем, присваеваем дескриптор STDOUT. это
    указатель на исходящий буффер. То есть таким образом используя функцию вывода на экран (print)
    мы будем писать в файл =)

    Для удобства работы нужно разбить текст входящего файла по строкам. Для этого пишем:

    @inputrow = <inptfl>;

    Мы вписываем в массив 'inputrow' построчно данные из файла с дескриптором 'inptfl'
    Если кто незнает, что такое дескриптор, то скажу. Дескриптор - это переменная-указатель на
    файл.

    Далее испрользуем оператор 'foreach'.
    Синтаксис:

    foreach $i
    {
    }

    Этот оператор берет переменную или массив, и подставляет все значения поочередно в переменную '$_'
    и повторяет свой блок пока не дойдет до конца массива.
    Очень интересная функция 'index'. Она ищет указанный текст и возвращает его позицию.
    Синтаксис:

    index EXPR,STR,POS

    EXPR - это та переменная, где ищем.
    STR - выражение которое ищем.
    POS - начальная позиция.

    Мы ищем первый в строке элемент ':'. Его позицию записываем в переменную $u.
    Теперь же ж нам нужно прочитать текст. Для этого воспользуемся функцией substr.
    Синтаксис:

    substr EXPR,POS1,POS2

    EXPR - понятно...
    POS1 - начальная позиция (откуда читать).
    POS2 - конеченая позиция.

    После всего этого сделаем проверку на наличие коментариев, или пустой строки.
    Для этого воспользуемся оператором 'unless'. Этот оператор очень похож на if
    но отличаеться тем, что выражение слева от него выполняеться всегда, кроме
    случаев описанных справа.

    Вообщем как я и говорил, с помощью print мы записываем данные в файл
    далее с помощью 'close' закрываем открытые фалы, указывая в аргументе их
    дескрипторы.

    Запускаем и тестируем =))
     
    4 people like this.
  2. w4rd3n

    w4rd3n Banned

    Joined:
    6 Oct 2005
    Messages:
    143
    Likes Received:
    3
    Reputations:
    -4
    Норм статья почему токо этот скрипт взял не поянл +1
     
  3. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    За смайлики в статье, минус бы поставил если мог...
    Орфографических ошибок вроде нет, молодец...
     
  4. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    perldoc perlstyle
    perldoc strict
    Прежде, чем учить, выучись сам!!!
     
  5. TaNkist

    TaNkist Elder - Старейшина

    Joined:
    6 Apr 2006
    Messages:
    147
    Likes Received:
    47
    Reputations:
    19
    Неплохо бы сделать так, чтобы добавлялись пользователи с рабочими шелами.
     
  6. CampeR

    CampeR Elder - Старейшина

    Joined:
    21 Mar 2006
    Messages:
    26
    Likes Received:
    10
    Reputations:
    0
    Неплохая статейка скопировал себе потом опробую, ставлю плюсик...
     
  7. Desr0w

    Desr0w Banned

    Joined:
    1 Feb 2006
    Messages:
    370
    Likes Received:
    166
    Reputations:
    45
    Скорее в виде комбо листа;)
    +
     
  8. Digimortal

    Digimortal Banned

    Joined:
    22 Aug 2006
    Messages:
    471
    Likes Received:
    248
    Reputations:
    189
    Ага, но не с любыми а конкретно из числа рутовых на microsoft.com , pentagon.gov , и nasa.gov.

    А вообще (говорю как новичек в Perl) - читать о написания парсера просто неинтересно. Такое в любом учебнике найти можно. Лучше б эксплойт какой-нить разобрал...