Alle Perl-Datenstrukturen unterstützen Magie, nicht nur SV
s (trotz des Namens) und speziell für Hashes und Arrays dies ist die Grundlage für Dinge wie die tie
Mechanismus oder Dinge wie fieldhash
, die an der ein Analogon von schwachen Referenzen implementiert Ebene der Hash-Einträge. Da die OUTPUT
Direktive angibt, welche Argumente vermutlich durch den C-Body von XSUB geändert werden und eine Variable mit set magic übergeben werden kann, kann das Setzen des Werts gemäß typemap ohne Aufruf des set-Handlers zu Inkonsistenzen führen Verhalten.
use Scalar::Util qw(weaken);
my $foo;
my $ref = \$foo;
weaken($ref);
Als Beispiel für Magie, weaken
dekrementiert den Referenzzähler $foo
und fügt Magie zurück zu $ref
zeigen, so dass sie es gelöscht, wenn $foo
Müll gesammelt wird.
Zusätzlich fügt es auch Magie auf $ref
, diese wieder abzureißen Referenzierung, sonst, wenn $foo
zerstört wird, würde $ref
obwohl es nicht mehr an $foo
zeigt an dieser Stelle gelöscht werden.
Wenn Sie $ ref als Argument verwenden, wird es auf dem Stapel aliased (weshalb $_[0]
is assignable):
modifies_arguments($ref);
sub modifies_arguments {
$_[0] = "blah"; # set magic is invoked to tear down the back referencing
}
Wenn modifies_arguments
ein reines Perl ist es leicht zu sehen, warum dies angemessen ist, aber die Die gleichen Annahmen über die Korrektheit müssen natürlich für XSUBs gelten, weshalb OUTPUT
verwendet wird, um zu markieren, welche Argumente auf den Wert der C-Level-Argumentvariablen am Ende des Funktionskörpers gesetzt werden, und magisch ausgelöst haben.
Dies trifft nicht auf RETVAL
zu, da dies nicht technisch eine Aufgabe ist, sondern ein neues SV auf den Stapel geschoben wird, und jede gesetzte Magie wird behandelt, nachdem die Funktion durch die Zuweisung op (falls vorhanden) zurückkehrt.
Vielen Dank für die Klärung! Was ist mit dem zitierten Text in Klammern: * '" benötigt für Hash- oder Array-Element-Parameter, die erstellt werden müssen, wenn sie nicht existierten "' *? Worauf bezieht sich das? Bedeutet das, dass "set" Magie nicht auf Skalare oder etwas anderes angewendet wird? –
'mein @array; modifies_arguments ($ array [42]) 'würde das Array-Element nur dann erstellen, wenn es tatsächlich geändert wird, vgl. Autovivifizierung. Wenn das Array magisch ist, würde dies eine magische Einstellung für das Array selbst beinhalten. Dies gilt jedoch immer noch für Skalare, wie im obigen $ ref-Beispiel. – nothingmuch