2009-03-15 10 views
3

Wenn ich habe:Wie kann ich Text in eine Zeichenfolge in Perl einfügen?

$foo= "12."bar bar bar"|three"; 

wie würde ich in dem Text einfügen ".." nach dem Text 12 in den Variablen?

+0

Die Frage ist, ist nicht wirklich klar. Ich bin mir nicht sicher, was du zu tun versuchst. –

+0

Was genau denkst du jetzt in deiner Variablen $ foo? Haben Sie versucht, das mit aktivierten Warnungen auszuführen? – Telemachus

Antwort

17

Mit Perl können Sie Ihre eigenen Anführungszeichen auswählen. Wenn Sie innerhalb einer interpolierenden Zeichenfolge (z. B. "") ein Anführungszeichen oder innerhalb einer nicht interpolierenden Zeichenfolge (z. B. '') ein Anführungszeichen verwenden müssen, können Sie mit einem quote operator ein anderes Zeichen angeben, das als Trennzeichen für die Zeichenfolge dient Zeichenfolge. Trennzeichen gibt es in zwei Formen: geklammert und nicht geklammert. In Klammern gesetzte Trennzeichen haben unterschiedliche Anfangs- und Endzeichen: [], {}, (), [] und <>. Alle anderen Zeichen * sind als nicht unterbrochene Trennzeichen verfügbar.

So könnte Ihr Beispiel als

$foo = qq(12."bar bar bar"|three); 

Einfügen von Text nach dem "12." geschrieben werden kann auf viele Arten gemacht werden (TIMTOWDI). Eine gebräuchliche Lösung ist die Verwendung eines substitution, um den Text zu ersetzen, den Sie ersetzen möchten.

$foo =~ s/^(12[.])/$1../; 

das^bedeutet Spiel zu Beginn des Stachels, die () Mittel erfassen diesen Text auf die Variable $1, die 12 entspricht nur den String "12" und die [] entsprechen bedeutet eine der Zeichen innerhalb der Klammern . Die Klammern werden verwendet, da . in Regexes im Allgemeinen eine besondere Bedeutung hat, aber nicht innerhalb einer Zeichenklasse ([]). Eine andere Option für die Zeichenklasse besteht darin, der speziellen Bedeutung von . mit \ zu entgehen, aber viele Leute finden, dass diese hässlicher ist als die Zeichenklasse.

$foo =~ s/^(12\.)/$1../; 

Eine andere Möglichkeit, Text in eine Kette eingefügt ist, um den Wert zu einem Aufruf von substr zuzuweisen. Dies hebt eine von Perls ziemlich einzigartigen Eigenschaften hervor: viele seiner Funktionen können als lvalues ​​fungieren. Das heißt, sie können wie Variablen behandelt werden.

substr($foo, 3, 0) = ".."; 

Wenn Sie nicht bereits wissen, wo "12." in der Zeichenfolge vorhanden Sie index verwenden könnten zu finden, wo es beginnt, length, um herauszufinden, wie lange „12.“ ist, und dann verwenden Sie diese Informationen mit substr.

Hier ist ein voll funktionsfähiges Perl-Skript, das den obigen Code enthält.

#!/usr/bin/perl 

use strict; 
use warnings; 

my $foo = my $bar = qq(12."bar bar bar"|three); 

$foo =~ s/(12[.])/$1../; 

my $i = index($bar, "12.") + length "12."; 
substr($bar, $i, 0) = ".."; 

print "foo is $foo\nbar is $bar\n"; 

* alle Zeichen außer Leerzeichen (Leerzeichen, Tabulator, Wagenrücklauf, Zeilenvorschub, vertikale Register und Seitenvorschub), die

+0

Wenn Sie weiter so detaillierte Antworten schreiben (und angeben, wie beschäftigt Sie bereits auf der Perl-Einsteigerliste sind), bezweifle ich, dass Sie überhaupt etwas erledigen können. Glücklicherweise hat SO keine großen Mengen an Perl-Fragen ... – Telemachus

+1

Heh, vielleicht bemerken Sie, dass die Teilnahme an PB zunimmt und abnimmt. Ich tendiere dazu, zu PB zu gehen, wenn ich entweder wenig zu tun habe, oder ich bin so frustriert, dass ich sowieso keine wirkliche Arbeit machen kann. All dies ist Teil meiner Ausbildung als Trainer (weshalb ich mich für die hyper-detaillierten Antworten entscheide). –

+0

Das ist eine Antwort. – SquareCog

0

Wenn Sie doppelte Anführungszeichen in einer Zeichenfolge in Perl verwenden möchten, müssen Sie zwei Möglichkeiten:

$foo = "12.\"bar bar bar\"|three"; 

oder:

$foo = '12."bar bar bar"|three'; 

Die erste Option, die Anführungszeichen in der Zeichenfolge mit Backslash entkommt.

Die zweite Option verwendet einfache Anführungszeichen. Dies bedeutet, dass die doppelten Anführungszeichen als Teil der Zeichenfolge behandelt werden. In einfachen Anführungszeichen ist jedoch alles literal, so dass $var oder @array nicht als Variable behandelt wird. Zum Beispiel:

$myvar = 123; 
$mystring = '"$myvar"'; 
print $mystring; 
> "$myvar" 

Aber:

$myvar = 123; 
$mystring = "\"$myvar\""; 
print $mystring; 
> "123" 

Es gibt auch eine große Anzahl anderer Quote-like Operators könnten Sie stattdessen verwenden.

0

$foo = "12.\"bar bar bar\"|three"; 
$foo =~s/12\./12\.\.\./; 
print $foo; # results in 12...\"bar bar bar\"|three" 
Verwandte Themen