ich es eigene Inhalte eine variable Referenz machen wollte $$x
ist das gleiche wie $x
. Was ich erwartet habe ist, dass $$x
die ursprüngliche Zeichenfolge wird. Warum ist das und wie sollte ich es richtig schreiben, ohne eine Kopie der Zeichenfolge in $x
? Denn in manchen Fällen kann $x
eine riesige Zeichenfolge sein.variable Referenz Stellen seinen eigenen String Inhalt
Antwort
Was Sie fragen, ist unmöglich. Eine Variable kann weder eine Referenz noch eine Zeichenfolge enthalten. Sie müssen zwei Variablen verwenden. Damit haben Sie zwei Möglichkeiten.
Speichern Sie die Referenz in eine neue Variable
$ perl -e'
use feature qw(say);
my $x = "abc";
my $y = \$x;
say $y;
say $$y;
'
SCALAR(0x232a398)
abc
Schön und einfach, effizient und keine Verwirrung, was die Variable zu welchem Zeitpunkt enthält.
Der Nachteil dieses Ansatzes ist, dass Verweise auf das Original $x
die Änderung nicht sehen. Es ist schwer vorstellbar, dass dies jedoch eine Rolle spielen würde.
Beachten Sie, dass die neue Var könnte auch den gleichen Namen wie der alte haben. Ich empfehle das nicht, da es unnötig verwirrend und fehleranfällig ist.
$ perl -e'
use feature qw(say);
my $x = "abc";
my $x = \$x;
say $x;
say $$x;
'
SCALAR(0x232a398)
abc
Speichern Sie den Wert in einer neuen Variablen
$ perl -e'
use feature qw(say);
my $x = "abc";
$x = \(my $container = $x);
say $x;
say $$x;
'
SCALAR(0x175cbe0)
abc
Der Nachteil dieses Ansatzes ist es beinhaltet die Zeichenfolge zu kopieren. Dies ist jedoch nur bis 5.20 Uhr der Fall. 5.20 führte einen Copy-on-Write-Mechanismus für Strings ein. Das bedeutet, dass das obige nicht die Zeichenfolge in 5.20+ kopiert; Es wird stattdessen nur ein Zeiger kopiert. Beachten Sie, dass beiden Skalare den gleichen Zeichenfolge-Puffer (0x2ac53d0
) im folgende Beispiel teilen:
$ perl -MDevel::Peek -e'my $x = "abc"; my $y = $x; Dump($_) for $x, $y;' 2>&1 \
| grep -P '^(?:SV| FLAGS| PV)\b'
SV = PV(0x2a9f0c0) at 0x2abcdc8
FLAGS = (POK,IsCOW,pPOK)
PV = 0x2ac53d0 "abc"\0
SV = PV(0x2a9f150) at 0x2abcde0
FLAGS = (POK,IsCOW,pPOK)
PV = 0x2ac53d0 "abc"\0
Während $x = \"$x"
wurde als kürzere Version $x = \(my $container = $x);
vorgeschlagen, zwingt es stringification und kopiert es die gesamte Zeichenfolge, auch in Versionen von Perl, die COW unterstützen.
einen Verweis auf den Wert zuweisen, nicht auf die Variable:
my $string = 'abcefgh';
$string = \ "$string";
print $$string, "\n";
- 1. Zugriff Variable über seinen String-Namen C#
- 2. PHP-Array-Wert mit String ersetzen und seinen eigenen Schlüssel
- 3. Gridlayout macht seinen eigenen Rand
- 4. Meine Listenansicht wird seinen Inhalt
- 5. Referenz ein börsennotiertes Element durch seinen Gegenwert
- 6. Hat jeder Thread seinen eigenen Stack?
- 7. Benötigt jeder Thread seinen eigenen Autorelease-Pool?
- 8. Wie man seinen eigenen .net Obfuscator schreibt
- 9. div und seinen Inhalt Toggle
- 10. Einen Div seinen Inhalt anpassen
- 11. Aggregate Vektor durch seinen Inhalt
- 12. Referenz auf Variable
- 13. Warum evaluiert observeEvent seinen Inhalt nicht?
- 14. ASP.NET MVC nur Attribut auf Benutzer bearbeiten ihren/seinen eigenen Inhalt
- 15. Einfache Variable Referenz
- 16. Variable wird durch seinen Wert
- 17. Zip mehrere Ordner und seinen Inhalt VBA
- 18. Object Model Erhalten Sie seinen Inhalt
- 19. imshow() aktualisiert seinen Inhalt nicht C++
- 20. Netbeans GUI-Editor generiert seinen eigenen unverständlichen Code
- 21. Variable Referenz für PostgreSQL
- 22. ASH Variable indirekte Referenz
- 23. unaufgelöste Referenz kotlin Variable
- 24. Jest.mock äußere variable Referenz
- 25. Javascript, Variable Referenz
- 26. Js Variable Referenz Quickie
- 27. Golang dynamische Variable Referenz
- 28. Referenz String-Ressource von Code
- 29. der Inhalt einer Variable in eine Textdatei ist jedes Mal Speichern seinen Wert ändert
- 30. eine Textdatei Aufgeteilt basierend auf seinen Inhalt
Selbst wenn Sie das tun könnten, was Sie versuchen wollten, wäre der ursprüngliche Inhalt wegen der Referenzzählung weg. Verwenden Sie einfach eine andere Variable als Referenz. – AKHolland
@AKHolland oh, richtig ... ich habe nicht an die Referenzzählung gedacht ... – soger
@AKHolland, Nonsense. Es kann nicht weg sein, wenn es noch zugänglich ist. Wenn das OP das tun könnte, was es versucht (Zugriff auf den ursprünglichen Wert als '$$ x'), dann wäre es ein großer Fehler in Perl, wenn seine Referenzzahl Null erreicht hätte. – ikegami