Perl/Operatory

Z Wikibooks, biblioteki wolnych podręczników.
Poprzedni rozdział: Zmienne
Następny rozdział: Typy danych

Wstęp[edytuj]

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.

Operatory[edytuj]

Arytmetyczne[edytuj]

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.

Przypisywanie[edytuj]

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ównania[edytuj]

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).

Logiczne[edytuj]

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ótowe[edytuj]

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ów[edytuj]

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 Test[edytuj]

Inne[edytuj]

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