2010-08-03 36 views
13

Was passiert hinter den Kulissen, wenn ich eine Verkettung an einer Schnur mache?Sind Perl-Strings unveränderlich?

my $short = 'short'; 
$short .= 'cake'; 

Ist Perl effektiv eine neue Zeichenfolge zu schaffen, dann ist es die richtige variable Referenz zuweisen oder sind Perl Strings von Natur aus immer wandelbar?

Die Motivation für diese Frage kam von einer Diskussion, die ich mit einem Kollegen führte, der sagte, dass Skriptsprachen unveränderliche Zeichenfolgen verwenden können.

+0

Alle festen Referenzen in 'perldoc' würden geschätzt werden. – Zaid

+0

Die * soliden Referenzen * könnten für einige zu massiv sein: 'perldoc perlguts 'und nach' SvGROW' suchen. Ansonsten ist die Antwort von @eugene die, nach der Sie suchen. – Dummy00001

+0

Die "perlfunc" -Dokumentation von 'substr' (sowohl als lvalue- als auch als 4-argent-Aufruf) beschreibt das Ändern von Strings selbst: das Vergrößern, Verkleinern und Ersetzen von Teilen. – pilcrow

Antwort

17

Perl-Strings sind veränderbar. Perl erstellt bei Bedarf automatisch neue Puffer.

use Devel::Peek; 
my $short = 'short'; 

Dump($short); 
Dump($short .= 'cake'); 
Dump($short = ""); 

SV = PV(0x28403038) at 0x284766f4 
    REFCNT = 1 
    FLAGS = (PADMY,POK,pPOK) 
    PV = 0x28459078 "short"\0 
    CUR = 5 
    LEN = 8 
SV = PV(0x28403038) at 0x284766f4 
    REFCNT = 1 
    FLAGS = (PADMY,POK,pPOK) 
    PV = 0x28458120 "shortcake"\0 
    CUR = 9 
    LEN = 12 
SV = PV(0x28403038) at 0x284766f4 
    REFCNT = 1 
    FLAGS = (PADMY,POK,pPOK) 
    PV = 0x28458120 ""\0 
    CUR = 0 
    LEN = 12 

Beachten Sie, dass im dritten Fall kein neuer Puffer zugewiesen wird.

+2

Perl verwendet Realloc, das einen ganz neuen Puffer erhalten kann oder nicht – ysth

+0

Beachten Sie, dass Perl Raum für ein abschließendes Null reserviert, obwohl es es nicht verwendet, um Länge zu bestimmen. Beachten Sie auch, dass die Granularität der Malloc-Bibliothek wo immer möglich bekannt ist und die Zuordnungen rundet – ysth

12

Perl-Strings sind definitiv veränderbar. Jeder speichert eine zugewiesene Puffergröße zusätzlich zu der verwendeten Länge und dem Anfangsoffset, und der Puffer wird nach Bedarf erweitert. (Der Anfang Offset ist nützlich consumptive Operationen wie s/^ abc // ermöglichen müssen, um nicht die tatsächlichen Daten verschieben.)

+1

Gibt es in 'perldoc' einen harten Hinweis darauf? – Zaid

+0

@Zaid: nicht, dass ich von offhand wissen – ysth

0
$short = 'short'; 
print \$short; 

$short .= 'cake'; 
print \$short; 

Nach Ausführen dieses Code erhalte ich "SCALAR (0x955f468) SCALAR (0x955f468)" . Meine Antwort wäre "veränderlich".

+7

Perl-Skalare bestehen eigentlich aus zwei separaten Abschnitten; eine von fester Größe und eine optionale Variable (abhängig von der Art der gespeicherten Werte). Die Adresse dort ist von der festen Größenkomponente; es ist durchaus plausibel, dass die variable Komponente gegen eine neue ausgetauscht wird. Aber das ist nicht der Fall. :) – ysth

Verwandte Themen