Portál AbcLinuxu, 9. července 2025 20:08


Dotaz: Perl a konverze kontextu pole->seznam

29.5.2007 19:27 amnesiac
Perl a konverze kontextu pole->seznam
Přečteno: 194×
Odpovědět | Admin
Zdravim.

Sorry za zacatecnicky dotaz, ale nemuzu prijit na to jak primo vytisknout hodnotu prvku pole vraceneho podprogramem. Nasledujici kod by mel vytisknout 4.

perl -wle 'print ${&mysub}[1][1];sub mysub { my @x = [[1,2],[3,4]]; return @x;}'
Use of uninitialized value in print at -e line 1.

Pritom pokud to pole vratim primo, nejak dojde ke konverzi na seznam a hodnota se vypise spravne:

perl -wle 'print ${&mysub}[1][1];sub mysub { return [[1,2],[3,4]];}'
4
Mohl by to nekdo logicky vysvelit ?

Dik.

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

29.5.2007 20:13 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Perl a konverze kontextu pole->seznam
Odpovědět | | Sbalit | Link | Blokovat | Admin
perl -wle 'print ${&mysub}[1][1];sub mysub { print "want scalar\n" unless wantarray; return [[1,2],[3,4]];}'
want scalar
4
v skalárnom kontexte sa @x vyhodnotí ako 1
29.5.2007 23:26 amnesiac
Rozbalit Rozbalit vše Re: Perl a konverze kontextu pole->seznam
Ok, dik. Jak ale vynutit, aby se v print volalo mysub v seznamovem kontextu ? Jinymi slovy jak prevest nasledujici konstrukci do jedineho volani print bez nutnosti ukladat do pomocneho pole ?

@array = &mysub;
print $pole[1][1];

sub mysub () {
  @x = ( [1, 2], [3, 4] );
  
  return @x;
}
Povedlo se mi to pres vraceni skalaru - reference na pole, ale to asi nebude to prave orechove :(

print ${mysub}[1][1];

sub mysub () {
  @x = ( [1, 2], [3, 4] );
  
  return \@x;
}
30.5.2007 08:22 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Perl a konverze kontextu pole->seznam
print [ &mysub ]->[0][1][1];
print ((&mysub)[0]->[1][1]);
30.5.2007 10:41 amnesiac
Rozbalit Rozbalit vše Re: Perl a konverze kontextu pole->seznam
Jj, diky.

Ta prvni konstrukce pres anonymni pole me mela napadnout. Je tam kvuli tomu nejaka rezie navic (vytv. pole) ?

Tu druhou jsem priznavam zatim nepochopil :-( Vnitrni zavorky kolem &mysub zrejme navozuji seznamovy kontext, ale pritomnost tech vnejsich mi stale unika.

30.5.2007 11:03 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Perl a konverze kontextu pole->seznam
nie ste sám, v kom ten druhý príklad vzbudzuje nezodpovedané otázky :-) (mňa osobne trápi, prečo tam musí byť operátor ->)
30.5.2007 13:30 amnesiac
Rozbalit Rozbalit vše Re: Perl a konverze kontextu pole->seznam
Ten operator -> tam IMHO ma logiku, protoze mysub vraci pole odkazu na pole. Ekvivalentni zapis pro dereferenci by pak byl:

print (${(&mysub)[1]}[1]);

versus puvodni

print ((&mysub)[1]->[1]);

Vrta mi hlavou, jak jste mi mohl spravne odpovedet a pritom tomu sam nerozumite ;-)

30.5.2007 14:04 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Perl a konverze kontextu pole->seznam
logiku tam samozrejme má, ale je tu jedno ale: -> sa môže medzi zátvorkami vynechávať.
$x->[0][0]; vs. $x->[0]->[0];
evidentne som niektorú kapitolu preskočil :-)

ako? jednoducho, zapísal som ako by som si to predstavoval a potom ošetroval syntax error :-D

30.5.2007 14:30 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Perl a konverze kontextu pole->seznam
Je to jedna z perlových syntaktických ne konzistencí. V tom výrazu musí být to -> uvedeno nejméně jednou a ty další se mohou vynechat, protože jinak než odkazem to být nemůže. Proč? Zeptej se Larryho :-(
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
30.5.2007 14:44 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Perl a konverze kontextu pole->seznam
aha, takto povedané mi to dáva zmysel. dík.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.