Portál AbcLinuxu, 1. května 2025 15:53
*
a nakonec o topic proměnné $_
a jejím nepsání.
-> $a, @b, :$x, :$y, *@positional, *%named { dd $a, $b, $x, $y, @positional, %named }kde
$a, @b
jsou poziční parametry a @positional
je slurp pole ostatních pozičních parametrů a podobně $x, $y
jsou jmenné parametry a %named
je slurp hash ostatních jmených parametrů.
Tento blok můžeme definovat, ale i pomocí zástupných proměnných
{ dd $^a, @^b, $:x, $:y, @_, %_ } #u pozičních parametrů záleží na lexikografickém uspořádání. Ukažme několik příkladů:
{ dd ($^a, @^b, $:x, $:y, @_, %_) }( 1, (2, 3), 4, :32x, :12z, :1y ); #(1, (2, 3), 32, 1, [4], {:z(12)}) say (^5)».&{ $^a + 1 }; #(1 2 3 4 5) — voláme podpogram jako metodu, pamatujete první kapitolu say (^5).map: { $^a + 1 }; #(1 2 3 4 5) — přibližně totéž co výše for (^6) { #0 2 1 say "$^a $^c $^b"; #3 5 4 }; for (<a b c> Z ^3+1).flat { #(1 a) say ($^number, $^letter) #(2 b) — number je lexikograficky větší než letter }; #(3 c)Všimněte si jak
for
předá počet hodnot, podle toho kolik je v bloku zástupných (pozičních) parametrů.
*
*
.
Příklady:
say ( *.chars + * )("ahoj", 2); #6 my &multiply_three_numbers = * * * * *; #1. 3. a 5. * jsou parametry say multiply_three_numbers 2, 3, 2; #12 #2. a 4. * je binární operátor násobení say (^5)».&( * + 1 ); #(1 2 3 4 5) — kulaté závorky místo hranatých say (^5).map: * + 1 ; #(1 2 3 4 5) — zápis map bez závorek say (^5).&( ** + 1 ); #(1 2 3 4 5) — ** je tzv. hyperwhateverHvězdičku můžeme použít jako zástupný znak i v jiných případech, většinou když chceme něco bez omezení nebo ve významu co možná nejvíc. Některé příklady využití whatever:
my @matrix = ( (1, 2, 3), ('a', 'b', 'c'), ('x', 'y', 'z') ); say @matrix[*]; #((1 2 3) (a b c) (x y z)) say @matrix[*-1;*]; #(x y z) — poslední řádek say @matrix[*;2]; #(3 c z) — druhý sloupec my @e=@matrix[*;*]; say @e[*]; #(1 2 3 a b c x y z) say @e[2 .. *]; #(3 a b c x y z) say @e[0 .. *-4]; #(1 2 3 a b c) say @e.pick(*); #(3 x c y a z 1 b 2) — náhodné pořadí for 21 .. * Z~ '×' xx * Z~ @e { #27×x say $^a if $^a ~~ '27×x' ff *; #28×y } #29×z
$_
$_
. Topic proměnná je zapisovatelná. Používají ji různé příkazy a často není potřeba ani psát. Především pro každou metodu jde zapsat .metoda
jako zkrácený zápis pro $_.metoda
, for
a given
nastavují $_
. Topic proměnnou lze použít jako zástupnou proměnou v bloku. when
porovnává s touto proměnou, s///
resp. m//
implicitně nahrazuje resp. hledá v této proměnné atd. Raději místo dalšího vypisování uvedu pár příkladů:
$_="ahoj"; say .chars; say ( $OUTER::_, $_ for ^2 ); #((ahoj 0) (ahoj 1)) — tady nelze použít $^a před for není blok s/aho/čau /; .say; #čau j my ( $a, $b, $c ) = 0, 1, 2; for $a, $b, $c { #0 say .++; #1 }; #2 say "$a $b $c"; #1 2 3 my @a = < abba kolo oko vede >; say grep { True when .flip }, @a; #(abba oko) for 21 .. * Z~ '×' xx * Z~ @e { #27×x — srovnejte s předešlou kapitolou .say if '27×x' ff *; #28×y } #29×z my @b = < ahoj jak se vede >; say @b.first({ .=chop; .chars > 2 }); #s say @b; #[aho ja s vede]
Tiskni
Sdílej:
vyjádřili přímo v tomto vlákněTo by platilo tak pred rokmi, dnes musíš ľudí dokopať, aby mali jednoduchú možnosť voľby :) Je pravda, že aj ja som migroval kvôli jednoduchosti na PHP, pretože to fungovalo Out of the box a ostatné jazyky mali úplne kulové, teda jediné naozaj použiteľné boli len Perl, PHP a mne ostatné jazyky prídu aj dnes viac náročné na spojazdnenie a správnu konfiguráciu.
my &multiply_three_numbers = * * * * *;
dava uplne nove moznosti pro opravdu poradne obfuscovany kod. Nechapu, kdo mohl neco takoveho vymyslet. Funkcionalita to je zajimava, ale mohli pouzit aspon nejaky jiny znak.
*
opatrně, &multiply_three_numbers
jsem uvedl jako zajímavost. Někde mi, především u jednoduchých map, grep, …
, připadá ten zápis přirozený .grep: * > 3;
, .sort: *.chars;
atd. A nebál bych se ani čitelnosti u něčeho takového .map: * * 1.328;
.
for 21 .. * Z~ '×' xx * Z~ @e { #27×x say $^a if $^a ~~ '27×x' ff *; #28×y }
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.