Упатство:Основи на Perl

Од Сподели wiki
Прејди на: содржини, барај

Променливи

Perl има три главни типа променливи: скаларни, низи и хаш

Скаларни

Скаларните променливи означуваат една вредност:

   my $animal = "camel";
   my $answer = 42;

Скаларните вредности може да бидат текст, броеви (целобројни или децимални). Perl сам ќе дознае што вредност му се дава и сам ќе ја изврши потребната комнверзија. Нема потреба од претходно декларирање. Скаларните вредности може да се користат на повеќе начини:

   print $animal;
   print "The animal is $animal\n";
   print "The square of $answer is ", $answer * $answer, "\n";

Има огромен број „магични“ скаларни променливи кои нестандардни имиња и се користат за разни потреби. Тие се документирани во perlvar. Најважно што треба да се знае е $_ која претставува „стандардна променлива“.

    print;  # gi pecati vrednostite vo $_ 

Низи

Низата претставува листа од вредности:

   my @animals = ("camel", "llama", "owl");
   my @numbers = (23, 42, 69);
   my @mixed   = ("camel", 42, 1.23);

Низите се индексни. Почетна вредност за индексите е 0. Еве како се добиваат вредностите од низата:

   print $animals[0];              # pecati "camel"
   print $animals[1];              # pecati "llama"

Специјалната променлива $#niza го дава индексот на последниот елемент од низата.

   print $mixed[$#mixed];       # posledniot element, pecati 1.23

Ако се користи со $#niza + 1 може да дознаете колку елементи има во низата. Но, не мора да се мачете. Кога се користи @array каде што Perl очекува скаларна променлива, ќе го добиете бројот на елементи.

    if (@animals < 5) { ... }

Елементите што ги добивате од низата почнуваат со $ бидејќи добивате само една вредност, исто како да е скаларна променлива.

За да добиете повеќе вредности од низа:

   @animals[0,1];                  # dava ("camel", "llama");
   @animals[0..2];                 # dava ("camel", "llama", "owl");
   @animals[1..$#animals];         # gi dava site osven prviot element

Ова се нарекува “slice”

Може да се прават многу корисни работи со листите (низите):

   my @sorted    = sort @animals;
   my @backwards = reverse @numbers;

Има неколку специјални вида низи, како @ARGV (аргументите од командната линија) и @_ (аргументите пратени подоцна). Исто така, овие се документирани во perlvar.

Хаш

Хаш претставува мапирано множество (клуч => вредност):

   my %fruit_color = ("apple", "red", "banana", "yellow");

Може да користите празни места и => оператор за да ги подредите правилно:

   my %fruit_color = (
       apple  => "red",
       banana => "yellow",
   );

За да добиете елементи од хаш:

   $fruit_color{"apple"};           # dava "red"

Може да ги запишете сите вредности во низи:

   my @fruits = keys %fruit_colors;
   my @colors = values %fruit_colors;

Хаш листите немаат некој дефиниран распоред, но може да се сортираат и да се итерира низ нив.

Исто како специјалните скалари и низи, постојат и специјални хашови. Најпознат е %ENV кој ги содржи променливите кои моментално се користат. Документирано во perlvar. Скаларите, низите и хаш се се документирани подетално во perldata. Покомплицирани типови променливи се прават со користење референци, кои дозволуваат да се вградат листи и хаш во листи и хаш.

Референца е скаларна вредност и може да се однесува на било кој perl тип на податок. Со зачувување на референцата како вредност во низа или хаш елемент може да се направи вгнездување на листи и хаш. Пр.:

    my $variables = {
        scalar  =>  { 
                     description => "single item",
                     sigil => '$',
                    },
        array   =>  {
                     description => "ordered list of items",
                     sigil => '@',
                    },
        hash    =>  {
                     description => "key/value pairs",
                     sigil => '%',
                    },
    };
    print "Scalars begin with a $variables->{'scalar'}->{'sigil'}\n";

Зони на функционирање на променливите

Во претходните примери, вредностите на сите променливи беа доделувани на овој начин:

   my $var = "value";

Зборчето my, всушност и не е потребен. Можете да напишете:

   $var = "value";

Во овој пример, ќе креирате глобални променливи, што често не е добро. my, креира локална променлива што се користи и функционира само во блокот во кој се дефинирани.

   my $a = "foo";
   if ($nekoj_uslov) {
       my $b = "bar";
       print $a;           # pecati "foo"
       print $b;           # pecati "bar"
   }
   print $a;               # pecati "foo"
   print $b;               # ne pecati nisto $b ne e od ovoj domen

Користењето на my во комбинација со use strict; на почетокот од perl скриптите значи дека интерпретерот ќе прифати некои програмски грешки. Во овој пример, последниот print $b ќе даде грешка-за-време-на-компајлирање (compile-time error) и нема да дозволи вклучување на програмата. Користењето на strict е строго препорачано.

Условни команди и скокови

Perl ги има повеќето од стандардните условни команди и скокови, освен switch/case, но ако навистина сакате да го користите, може да го инсталирате како модул за perl 5.8. Услов може да биде кои и да е израз во perl. Погледнете ја листата на оператори во следната секција.

if

    if ( condition ) {
        ...
    } elsif ( other condition ) {
        ...
    } else {
        ...
    }

Има и негативна вредност на истото:

    unless ( condition ) {
        ...
    }

Ова е дадено како полесно читлива верзија на if (!uslov) Заградите се задолжителни во perl, иако се работи само за една команда.

while

while ( condition ) {
        ...
    }    <pre>

Негативната вредност:

 until ( condition ) {
     ...
 }

while исто така може да се користи и како пост-исказ:

    print "LA LA LA\n" while 1;          # se povtoruva zasekogas

=== for === 

Исто како во C:
 for ($i=0; $i <= $max; $i++) {
     ...
 }

=== foreach=== 
Стандардниот for скок како во C, поретко се користи, затоа што постои скокот foreach:
<pre>
    foreach (@niza) {
        print "Ovoj element e $_\n";
    }
    # ne mora da go koristite standardnoto $_...
    foreach my $kluc(keys %hash) {
        print "Vrednosta na $kluc e $hash{$kluc}\n";
    }

Вградени оператори и функции

Аритметички

  • + собирање
  • - одземање
  • * множење
  • / делење

Нумеричка споредба

  • == еднаквост
  • != нееднаквост
  • < помалку од
  • > поголемо од
  • <= помало или еднакво на
  • >= поголемо или еднакво на

Споредба на текст

  • eq еднаквост
  • ne нееднаквост
  • lt помалку од
  • gt поголемо од
  • le помало или еднакво на
  • ge поголемо или еднакво на

Логички

  • && и
  • || или
  •  ! негација

Општи

  • = доделување вредност
  • . надоврзување на текст
  • x помножување текст
  • .. од..до (креира листа на броеви)

Многу оператори може да бидат комбинирани со =

$a += 1;        # исто како $a = $a + 1
$a -= 1;        # исто како $a = $a - 1
$a .= "\n";     # исто како $a = $a . "\n";

Датотеки и влез/излез

Можете да отворите датотека за читање и запишување во неа со open() функцијата:

open(INFILE,  "input.txt")   or die "Ne moze da otvori input.txt: $!";
open(OUTFILE, ">output.txt") or die " Ne moze da otvori output.txt: $!";
open(LOGFILE, ">>my.log")    or die " Ne moze da otvori logfile: $!";

Веќе го видовте стандардниот излез print(). print() може да прими и аргументи за да запишуваат на различни места:

   print STDERR "This is your final warning.\n";
   print OUTFILE $record;
   print LOGFILE $logmessage;

За да се затвори датотеката се користи close().

Споредби

Едноставна споредба:

   if (/foo/)       { ... }  # tocno ako $_ sodrzi "foo"
   if ($a =~ /foo/) { ... }  # tocno ako $a sodrzi "foo"

Операторот за споредба / / , стандардно оперира со $_, но може да се врзе да работи со друга променлива користејќи го =~ операторот.

Едноставна замена:

   s/foo/bar/;               # go zamenuva foo so bar vo $_
   $a =~ s/foo/bar/;         # go zamenuva foo so bar vo $a
   $a =~ s/foo/bar/g;        # gi zamenuva site instanci na foo so bar vo $a

Покомплицирани изрази

Не мора да споредувате само фиксни текстови. Всушност, може да споредувате се што можете да замислите, користејќи покомплицирани изрази. Еве кратка листа:

    .                   еден карактер
    \s                  празно/и места (space, tab, нова линија)
    \S                  карактер што не е празно место
    \d                  број (0-9)
    \D                  карактер што не е број
    \w                  збор (a-z, A-Z, 0-9, _)
    \W                  карактер што не е збор
    [aeiou]             споредува еден карактер во даден сет од карактери
    [^aeiou]            споредува карактер што не е во дадениот сет
    (foo|bar|baz)       споредува една од дадените алтернативи
    ^                   почеток на текстуална променлива
    $                   крај на текстуална променлива

Споредувачи на количина можат да бидат користени за да се специфицира колку „работи“ сакате да споредувате. „Работи“ може да бидат карактери, една од метакарактерите наброени овде или група од карактери и метакарактери во наводници.

    *                   нула или повеќе од претходната
    +                   едно или повеќе од претходната
    ?                   нула или едно од претходната
    {3}                 споредува точно 3 од претходната
    {3,6}               споредува од 3 до 6 од претходната
    {3,}                споредува 3 или повеќе од претходната

Неколку каратки примери:

    /^\d+/              текстот почнува со еден или повеќе броеви
    /^$/                нема ништо во текстуалната променлива
    /(\d\s){3}/         три броја, после секој има празно место (пр. "3 4 5 ")
    # Ovoj skok cita od STDIN I pecani linii koi ne se prazni:
    while (<>) {
        next if /^$/;
        print;
    }
    # lesen nacin da se podeli e-mail na delovi
    if ($email =~ /([^@]+)@(.+)/) {
        print "Username is $1\n";
        print "Hostname is $2\n";
    }

Функции (sub)

 
   sub log {
        my $logmessage = shift;
        print LOGFILE $logmessage;
    }
  

shift се врзува со специјалната низа @_, го влече првиот елемент од неа и го дава на некоја променлива. Пр.:

Со @_ може да се работи на неколку начини:

    my ($logmessage, $priority) = @_;       # standardno
    my $logmessage = $_[0];                 # nestandardno i neubavo  

Функциите може и да враќаат вредност:

   sub square {
        my $num = shift;
        my $result = $num * $num;
        return $result;
    }  

Користење на модули во Perl

Perl модулите нудат голем број на можности за да му помогнат на корисникот, да се избегне повторно „откривање на тркалото“. Голем број модули се вклучени во стандардната инсталација на Perl. Има модули од манипулација на текст, до мрежни протоколи и интегрирање бази и графика.

Корисни врски

Perl FAQ

Работа со Perl модули

Листа на модули со стандардната инсталација на Perl

Како да пишувате Ваши модули

[Категорија:Упатства]