Werden Elemente von @_ für einen neuen Unterprogrammaufruf wiederverwendet oder wird ein neues @_ erstellt?

8

Ich nehme an, es hängt vom Kontext ab.

  1. Es wird wiederverwendet, wenn &func call gemacht wird
  2. Es wird für alle anderen Anrufe erstellt

Ich habe diesen Code wo ich habe unerwarteten eval call in Zeile 1004:

erhalten %Vor%

Und dieser Stacktrace:

%Vor%

Aus meiner Log-Datei kann ich sehen, dass DBIx::Class::DESTROY sub heißt:

%Vor%

Warum wird die Objektzerstörung verschoben? Ich nehme an, das hängt irgendwie mit @_ zusammen

Irgendwelche Vorschläge dazu, was hier die Objektzerstörung auslösen könnte

    
Eugen Konkov 05.01.2017, 19:09
quelle

2 Antworten

5

In einem &func -Aufruf ohne eine Argumentliste werden nicht nur die Elemente von @_ wiederverwendet, sondern das ganze @_ wird wiederverwendet.

%Vor%

Typische Ausgabe:

%Vor%

Ausgehend von main in den &func -Aufruf wird @_ nicht lokalisiert, kopiert oder in irgendeiner Weise geändert. Das Ändern von @_ in func von &func -Aufruf wirkt sich auf @_ im Aufrufer aus, aber das Ändern von func() in% nicht.

    
mob 05.01.2017, 19:55
quelle
2

Ich habe gefunden, warum DESTROY beim Zuweisen von:

aufgerufen wird
  1. Die alten @DB::context -Elemente sind zerstört
  2. Der erste Eintrag ist ARRAYREF für Unterroutinenargumente LIST
  3. Wenn dieses Objekt zerstört wird, gibt es keine Links mehr zu Argumenten, sie sind zerstört

Wegen dieser Links werden Argumente nicht zerstört, wenn sie normalerweise sollten. Beispiel:

%Vor%
  1. Hier ist ein Bereich
  2. $handle sollte am Ende des Bereichs
  3. gelöscht werden
  4. Wenn dieser Aufruf unter Debugger erfolgt, wird der Link zu @_ in @DB::context gespeichert.
  5. Das Ende des Umfangs. $handle wird nicht zerstört, weil immer noch auf
  6. verwiesen wird
  7. Ein weiterer Unterprogrammaufruf. Alte Werte von @DB::context werden freigegeben. Also $handle destrucion wird bis zu diesem
  8. verschoben

Also @_ ist nicht schuldig. Danke @mob für deine Erklärung

    
Eugen Konkov 05.01.2017 22:48
quelle

Tags und Links