Magyarázatot kérek egy rövid szubrutinhoz

sziasztok,

van egy működő példa, amit nem értek.
Próbáltam volna debuggerrel követni a változókat, az szokott segíteni felfogni a kódot, de most "Szegmentálási hiba"-val elszáll a padre debuggere.

Már a 3. sorral gondjaim vannak :)
Továbblépni nem szeretnék, amíg ezt meg nem értem.

Minden segítő szándékot előre köszönök!

Hozzászólások

Perl sigsegv??? Látatlanba perl bug/hibás telepítés lenne a tippem. Vagy annyira rég volt, ogy rosszul emlékszem a működésére. (a debugger elszállás már belefér)

Nagyon túlbonyolítva (mintha a nyelv lehetséges poénjait akarná felvonultatni) megvalósítja a halmazok metszetét (intersection, innen az inter szubrutinnév).
A @one és @two rendezett listák közös elemeit adja vissza.

Valószínűleg én fogalmaztam pontatlanul, tudom, hogy mit csinál a szubrutin, csináltam már metszetet más nyelvben, csak ennek a működése nem volt tiszta.
Szeretem nézni, hogy más hogyan oldja meg a feladatot, abból sokat lehet tanulni, de ez a pár sor a fejlődésemben többet ártott, mint használt :)

Amióta a padre-ra rászoktam, nem debuggoltam parancssorban, ez egy újabb hibapont nekem :)
Egy hétvégi hobbyprogramozó ne legyen lusta :)

Aki azt a harmadik sort leírta, az valószínűleg más aljasságra is képes.

my @first = splice(@_,0,shift);

Ezzel az a probléma, hogy a shift a @_ tömb első elemét eltávolítja és azt adja vissza értékül. Normál függvényhívás esetén a @_ az argumentum listában már kiértékelésre kerülne a shift hívás végrehajtásának idejére és az argumentum listába belekerülne a később a shift által eltávolítandó első elem is, amit itt az első tömb hossza lenne.

Azonban a splice nem normál függvényhívás, hanem C kódban megvalósított beépített függvény. Ő valójában nem @_ elemeit kapja meg az első paraméterben, hanem a @_ tömbre való belső (C kódbeli) hivatkozást. Emiatt viszont a harmadik paraméterben levő shift hívás a splice lefutása elött már eltávolítja az első elemet, megváltoztatva a @_ változót, így a splice valóban csak első tömb elemeit távolítja el a @_ listából és adja vissza őket.

Általánosságban is kifejezetten rossz ötlet az argumentum listában változó értékét módosítani, külön nagyon rossz ötlet a argumentum listában egyébként másik paraméter pozícióban is használt változó értékét módosítani, de a normál függvény és a beépített függvény paraméter átadása közötti különbség miatt hatványozottan félrevezető és a lehető legrosszabb fenti példa.

Hálás köszönet a részletes magyarázatért, éppen erre voltam kíváncsi.

és ezt nem jó kezeli

Ezt (a padre beépített debuggerére nézve) inkább jó vagy rossz tulajdonságnak szántad?
Azaz jó, ha egy debugger elszáll egy nyelvtanilag ugyan helyes, de egyébként messziről kerülendő szerkezettől?

szerk.: ..mert számomra ez a debugger fejlett intelligenciájára utal :)

Valóban nem szerencsés ez a trükközés, főleg, hogy két tömb metszetének az előállításra a perlfaq4 tartalmazza a kanonikus megoldást.

Jó lenne tudni, hogy a kérdező melyik perl verzióval tapasztalta a segfault, lehet, hogy talált egy bugot az interpreterben (amit lehet, hogy azóta már javítottak is). A p5p levlistán "stack is not refcounted" kulcsszóval időnként előkerülnek hasonló hibák.