Perl/Operatory
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.