Vlastne by se ta funkce print_tree
mela volat takto:
print_tree($out, $cur_elem, $recursion_lvl, $enum_label);
(Nejsem moc velkym priznivcem volani fci bez zavorek.) Nicmene dalo by se to upravit tak, aby bylo mozno ji zavolat s nebo bez toho $out
a sice ze bychom testovali zda prvni argument je reference na IO nebo ne. Mne to prislo pro tento priklad zbytecne.
Zbytecne to bude mozna i celkove, jelikoz pokud bych chtel tisknout na STDOUT, tak si tam tu referenci predam. Na druhou stranu kdybych chtel naznacit, ze nektere argumenty jsou volitelne, udelal bych funkci tak abychom ji mohli volat pomoci pojmenovanych parametru a pak bychom mohli vynechat i "inicializacni hodnoty", tj. print_tree(out => $neco)
nebo print_tree()
.
Co se tyce vynechane carky po $out
a zejmena moznost ze to tam muze a nemusi bejt (ala print
), tak pokud mi neco neuniklo tak to nejak jednoduse zaridit nejde (ci snad vubec). Maximalne muzeme pomoci prototypovani dosahnout funkce ktera se chova podobne jako preddefinovane map
nebo grep
, cili ve stylu moje_f { neconeco } argumenty
. Pokud se mylim, tak me prosim nekdo opravte.
neni to uplne presne.
$out->print("ahoj")
je syntakticky cukr pro IO::neco::print($out, "ahoj")
, pricemz IO::neco
je potomek tridy IO::Handle
, napriklad IO::File
. navic to $out
musi byt vytvoreno pomoci toho modulu a ne klasickeho open
. je to jakoby "objektovy" pristup k I/O.
zabudovanej print
s tim nema nic spolecneho, navic ta absence carky za filehandle je tak trochu syntakticky hack.
Zdravím,
narazil jsem na chování Perlu, kterému nerozumím. Použít IO referenci tak, jak je ukázáno v článku, se mi daří. Ukazuje to subrutina tisk2
níže.
Nevím ale, proč přímé použití reference (ukazuje zapoznámkovaná s. tisk1
) jako prvku pole @_ působí syntaktickou chybu při překladu (v novějších verzích Perlu; ve starších překlad prošel, ale konstrukce nedělala to, co tisk2
).
Uměl by to někdo vysvětlit?
#sub tisk1 { # print $_[0] "ahoj\n" #} sub tisk2 { my$fd=$_[0]; print $fd "ahoj\n" } open(my$f,'>','/tmp/file.pok'); tisk2($f);