Perl/Operatory

Poprzedni rozdział: Zmienne
Następny rozdział: Typy danych

WstępEdytuj

Wiele z operatorów Perla zostało zapożyczone z języka C, niektóre jako niemożliwe do realizacji ominięto, część zaczerpnięto z innych języków, resztę wymyślono specjalnie dla Perla.

OperatoryEdytuj

ArytmetyczneEdytuj

Wiele arytmetycznych operatorów jest binarnymi. Mają one dwa argumenty. Unarne operatory potrzebują tylko jednego argumentu.

Podstawowe operacje to: dodawanie (+), odejmowanie (-), mnożenie (*) i dzielenie (/).

Operator % (mod) oznacza resztę z dzielenia.

print 4 % 3;   # wynik 1 -- 3 mieści się 1 raz w 4, reszta to 1.
print 4 % 2;   # wynik 0 --  4 / 2 = 2, czyli zero jest wynikiem - nie ma reszty.

Operatorem podnoszącym do potęgi jest **. Jeśli podnosimy do ułamka, dostajemy pierwiastek liczby. W poniższym przykładzie, jeśli drugi wynik podniesiemy do potęgi drugiej, powinniśmy zobaczyć wynik 2

( 2 ** (1/2) ) ** 2 = 2

print 4 ** 2;      # wynik 16              -- 4 do potęgi 2.
print 2 ** (1/2);  # wynik 1.4142135623731 -- pierwiastek z 2.

Operator auto-dekrementacji (--) jest operatorem unarnym. Zmniejsza on wartość liczby o jeden. Są dwa sposoby używania tego operatora.

$foo = 1;
print $foo--;  # post-dekrementacji -- $foo jest pokazywany, a
               #                   następnie jego wartość jest zmniejszana o 1.
print --$foo; # pre-dekrementacji -- $foo jest zmniejszany o 1, a potem # pokazywany.

Operator auto-inkrementacji (++) jest operatorem unarnym. Inkrementuje (zwiększa) on wartość liczbową lub wartość łańcucha znaków. Są dwa sposoby używania tego operatora.

$foo = 1;
print $foo++;  # post inkrementacja -- $foo jest pokazywany, a
               #                   następnie jego wartość jest zwiększana o 1.
print ++$foo; # pre inkrementacja -- $foo jest inkrementowany, a potem # pokazywany.
$foo = 'a09';
print $foo++;  # post inkrementacja -- $foo jest pokazywany, a
               #                   następnie jego wartość jest zwiększana do 'a10'.
print ++$foo; # pre inkrementacja -- $foo jest inkrementowany do 'a11', a potem # pokazywany.
$foo = 'a';
print $foo++;  # post inkrementacja -- $foo jest pokazywany, a
               #                   następnie jego wartość jest zwiększana do 'b'.
print ++$foo; # pre inkrementacja -- $foo jest inkrementowany do 'c', a potem # pokazywany.
Gdy inkrementujesz łańcuchy znaków (litery i cyfry) możesz użyć operatora zakresu (print 'a' .. 'ac';). Prowadzi to czasem do nieoczekiwanych rezultatów.

PrzypisywanieEdytuj

Podstawowym operatorem przypisywania jest "=", który ustawia wartość po lewej stronie, aby była równa wartości po prawej. Zwraca także tę wartość. Tak więc może napisać $a = 5 + ($b = 6), który przypisze $b na wartość 6, a $a wartość 11 (5 + 6). Dlaczego potrzebowałbyś tak robić, jest innym zagadnieniem.

Perl obsługuje też operatory przypisania zapożyczone z C ("+=", "-=" itp.), ale ma także własne, niespotykane w C.

  • "+=" (przypisanie dodające)
$a += $b;

Powyższy kod jest tym samym co "$a = $a + $b;". Reszta operatorów przypisania postępuje podobnie.

  • "-=" (przypisanie odejmujące)
  • "*=" (przypisanie mnożące)
  • "/=" (przypisanie dzielące)
  • "%=" (przypisanie modulo (reszta z dzielenia))
  • "**=" (przypisanie potęgujące)
  • ".=" (przypisanie dodające ciąg znaków)
  • "x=" (przypisanie powtarzania)
  • "&&=" (logiczne przypisanie AND)
  • "||=" (logiczne przypisanie OR)
  • "&=" (przypisanie bitowe AND)
  • "|=" (przypisanie bitowe OR)
  • "^=" (przypisanie bitowe XOR)
  • "~=" (przypisanie bitowe NOT)
  • "<<=" (przypisanie przesuwające bit w lewo)
  • ">>=" (przypisanie przesuwające bit w prawo)

PorównaniaEdytuj

W perlu rozróżnia się porównywanie cyfr i znaków. Między innymi dlatego, iż w większości przypadków perl zamienia liczby na cyfry i odwrotnie, najczęściej jest to przydatne. Jednak niekoniecznie przy porównaniach.

Numery porównuje się:

  • "==" (równa się)
  • "!=" (nie równe)
  • "<" (mniejsze)
  • ">" (większe)
  • "<=" (mniejsze, bądź równe)
  • ">=" (większe, bądź równe)
  • "<=>" (porównanie)

Operator "<=>" (porównanie), czasami nazywany "spaceship operator" (z powodu filmu "Gwiezdne wojny"), zwraca 0 jeśli obie wartości są równe, 1 jeśli lewa strona jest większa lub -1 jeśli prawa jest większa.

Łańcuchy znaków porównuje się:

  • "eq" (równa się)
  • "ne" (nie równa się)
  • "lt" (mniejsze)
  • "gt" (większe)
  • "le" (mniejsze bądź równe)
  • "ge" (większe bądź równe)
  • "cmp" (porównanie).

LogiczneEdytuj

Operatory logiczne są używane w porównaniach. Zwracają one wartości logiczne (tj. prawdę lub fałsz). Wyglądają one następująco:

"&&" (logiczne AND, zwraca prawdę gdy lewa i prawa strona jest prawdą)

 # prawda jeżeli 1 jest równe 1 i zmienna $a jest większa od trzech
 $a = 4;
 print 1 == 1 && $a > 3, "\n"; # wyświetli 1

"||" (logiczne OR, zwraca prawdę gdy lewa lub prawa strona jest prawdą)

 # prawda jeżeli 2 jest większe od 1 lub jeżeli 4 jest większe od 10
 print 2 > 1 || 4 > 10, "\n"; # wyświetli 1

"!" (logiczne NOT, zwraca prawdę gdy wyrażenie jest fałszywe)

 # prawda jeżeli 2 == 3 jest fałszem
 print !(2 == 3), "\n"; # wyświetli 1

Operator "!" ma wyższy priorytet, niż operator porównania dlatego konieczne było użycie nawiasów.

Można także używać operatorów łatwiejszych w czytaniu takich jak "and" (odpowiada &&), "or" (odpowiada ||) oraz "not" (odpowiada !). Trzeba tylko pamiętać, że mają one niższy priorytet.

 print 1 == 1 and 2 > 3, "\n"; # program wyświetli 1 i nie przejdzie do nowej linii...

Stało się tak dlatego, że porównanie miało inną postać:

 print (1 == 1) and 2 > 3, "\n";

Poprawiona wersja wygląda następująco:

 print (1 == 1 and 2 > 3, "\n");

Ocenianie skrótoweEdytuj

Perl używa oceniania skrótowego zwanego także "ocenianiem leniwym". Gdy dasz do porównania perlowi:

 1 > 2 && 3 == 3;

to po ocenieniu, że pierwsza część nie ma sensu ("1 > 2" zwróci fałsz) nie będzie on sprawdzał następnego warunku, ponieważ i tak całe wyrażenie ma już wartość 0.

Łańcuchy znakówEdytuj

Operatorem łączącym łańcuchy znaków jest ".", a nie "+" używany w niektórych innych językach programowania. Mamy także operator powtarzający dany łańcuch znaków. Tym operatorem jest "x", wymaga on podania liczby określającej ile razy ma być to zrobione. Tak więc "xy" x 2 produkuje "xyxy".

File TestEdytuj

InneEdytuj

Operator zakresu (..) zwraca listę elementów pomiędzy dwoma wartościami, które mogą być znakami lub liczbami. Rodzaj zakresu oznaczony jest przez pierwszy argument. Na przykład dla kodu:

print ('A'..'Z');
print ('a'..'z');
print ('A'..'z');
print (1..'a');
print (1..20);
print ('&'..'!');
print (10..-10);
print "$_\n" foreach (1..10);

Wynikiem jest: (Nowe linie dodane dla czytelności):

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ

1234567891011121314151617181920
&

1
2
3
4
5
6
7
8
9
10

Zauważ, że wielkość liter określona jest przez pierwszy argument, a zakresy 1..'a' i (10..-10) nie zwracają niczego.

Poprzedni rozdział: Zmienne
Następny rozdział: Typy danych