Sziasztok,
van egy ilyen feladat, hogy
"Készítsünk alprogramot, amely tömbökre mutató hivatkozásokat fogad tetszőleges számban, megfordítja a tömbök tartalmát, majd ugyanolyan sorrendben adja vissza azokat, amilyenben kapta. Ellenőrizzük, hogy a hivatkozások valóban tömbre mutatnak-e?"
A megoldás az "alprogram" nevű alprogram
A kérdés pedig annyi, hogy az alprogram által visszaadott @_-ból hogyan nyerhetem vissza a benne lévő elemek valamelyikét?
$ref->[0][1] próbálkoztam, de sikertelenül (Not an ARRAY reference)
Azért van az a sok print a kiir-ben, hogy nagyjából lássam merre járok, de nagyon eltévedtem :)
Minden segítő szándékú hozzászólást előre köszönök!
- 1685 megtekintés
Hozzászólások
Szögletes zárójellel nem tömbváltozót, hanem tömbre mutató referenciát definiálsz.
Vagyis itt a változó és az érték ellentmond egymásnak:
@tomb=[
['a',...]...
];
Ezt az ellentmondást úgy oldja fel a perl, hogy megtartja a listaváltozót és azt feltételezi, hogy az annak adott érték egy lista nulladik eleme, vagyis fejben erre egészíti ki a kódot:
@tomb=([
['a',...]...
]);
Vagy úgy hangszereled át, hogy mindenhol tömbreferencia legyen, vagy a tömbváltozónak tömbértéket adsz:
@tomb=(
['a',...]...
);
- A hozzászóláshoz be kell jelentkezni
Nagyon köszönöm :)
Ezért volt az, hogy nem a tömbelemeket fordította meg, hanem a memóriacímeket, amivel aztán nem lehetett tovább dolgozni.
Ha azt is elárulnád, hogy vetted észre: azonnal ránézésből, futtatás után vagy debuggerrel?
- A hozzászóláshoz be kell jelentkezni
Szerencsém volt, mert ezzel kezdődik a kódod: ezt első blikkre kiszúrtam, de azt nem felételezhettem, hogy ez nem szándékos*, és az általam át nem nézett kódban nincs-e kikorrigálva, ezért inkább volt sejtés, hogy itt a hiba, mint biztos állítás.
*UI. akár szándékos is lehetett volna, hiszen a perl az a nyelv, amit azért szokás utálni, mert annyi mindent szabad benne, mintha nem is volnának szabályok.
Nos, vannak, csak Larry Wall nem tudta legyűrni magában a nyelvészt, aki úgy van vele, hogy minden helyes, ami egyértelmű, és ami nem egyértelmű, azt is lehet valahogy értelmezni.
Ragaszkodni kell ahhoz, hogy
@v = () : lista/tömb,
$v = [] : list-/tömbref,
%v = () : hash,
$v = {} : hashref
nem élni a számtalan implicit lehetőséggel, és határozottan tudni, hogy melyik mi: úgy lehet egy perl kód is könnyen írható és olvasható is.
- A hozzászóláshoz be kell jelentkezni
"Ragaszkodni kell ahhoz, hogy..." - hogyúgyvan!
- A hozzászóláshoz be kell jelentkezni
Én ezt pl tovább szűkítem, és sima tömb/hash változókat nem használok, csak pointereseket: $v = [] meg $v = {} van, @v meg %v nincs.
Illetve a @_ néha elkerülhetetlen.
- A hozzászóláshoz be kell jelentkezni
Nálam is volt ilyen elgondolás, de mivel ilyen (egyébként szerintem ésszerű) egyszerűsítés nincs sem a beépített, sem a CPAN libekben, inkább nem kárhoztattam magam arra, hogy szaporítsam paraméterezéskor ill. visszatérési érték tárolásakor az egyébként sem kisszámú refelést/feloldást.
- A hozzászóláshoz be kell jelentkezni
Köszönöm,
ma is bölcsebb lettem :)
- A hozzászóláshoz be kell jelentkezni