Split von dot mit Perl
Ich verwendet split-Funktion ist in zwei Varianten. Erste Möglichkeit:
my $string="chr1.txt";
my @array1=split(".",$string);
print $array1[0];
Bekomme ich diesen Fehler: Use of uninitialized value in print
Wenn ich durch split der zweite Weg, ich habe keine Fehler.
my @array1=split(/\./,$string);print $array1[0];
Meine erste Art und Weise der Aufteilung funktioniert nicht nur für dot.
Kann jemand erklären mir den Grund dafür?
- split (".") oder split (/\./)
- Das ist die falsche Antwort, weil das argument
split
wird immer interpretiert, als ein Muster. Übergeben eines Arguments von"."
ist die gleiche wie die übergabe eines Arguments von/./
: beide teilen auf einem nicht-newline[^\n]
oder\N
— wennuse re "/m"
im Umfang, in welchem Fall es teilt auf jede einzelne Perl-codepoint, einschließlich nicht-Unicode-codepoints oben 0x1F_FFFF.
Du musst angemeldet sein, um einen Kommentar abzugeben.
"\."
ist nur.
, vorsichtig mit escape-Sequenzen.Wenn Sie möchten, einen umgekehrten Schrägstrich und einem Punkt in einem double-quoted string, müssen Sie
"\\."
. Oder verwenden Sie einfache Anführungszeichen:'\.'
split /\N{FULL STOP}/
wird ein literal. Dies unterscheidet sich von der Verwendung einer Zeichenfolge wiesplit "\N{FULL STOP}
, das ist nur die Metazeichen, , weil die Muster Motor nie sieht, dass es syntaktisch benannte Zeichen. Vergleichen Sie die Ausgabe vonperl5.16.0 -lE 'say for split /\N{FULL STOP}/, "foo.bar.glarch"'
mit derperl5.16.0 -lE 'say for split "\N{FULL STOP}", "foo.bar.glarch"'
zu sehen, was ich meine.wenn Sie nur wollen, um zu analysieren Dateien und Ihre Endungen, die bessere Nutzung
fileparse()
Methode vonFile::Basename
fileparse
ist nicht eine bessere Lösung für dieses problem, da alle es tut, ist ein umständlicher Weg, der Anwendung eines regulären Ausdrucks. Wenn das suffix beginnt immer mit einem Punkt, dann ist der basename aufgeteilt werden soll mitmy ($name, $suffix) = $filename =~ /(.*)(\..*)/
Zusätzliche Informationen zu den Angaben von @Mat:
In
split "\.", ...
dem ersten parametersplit
wird zuerst gedeutet als ein double-quoted string, bevor Sie an die regex-engine. Wie Mat sagte, innerhalb eines Strings mit doppelten Anführungszeichen ein\
ist das escape-Zeichen mit der Bedeutung "nehmen Sie das nächste Zeichen buchstäblich" z.B. für Dinge wie das setzen von doppelten Anführungszeichen innerhalb eines Strings mit doppelten Anführungszeichen:"\""
Damit Ihre
split
übergeben bekommt"."
als das Muster. Ein einzelner Punkt, der heißt "teilen auf ein beliebiges Zeichen". Wie Sie wissen, die split-Muster selbst ist nicht Teil der Ergebnisse. So haben Sie mehrere leere Zeichenketten als Ergebnis.Aber warum ist das erste element undefined, anstatt leer? Die Antwort liegt in der Dokumentation für
split
: wenn Sie nicht zu verhängen eine Obergrenze für die Anzahl der Elemente zurückgegeben, die vonsplit
(das Dritte argument), dann wird es still entfernen Sie leere Ergebnisse aus der Ende der Liste. Alle Dinge sind leer, die Liste ist leer, daher wird das erste element nicht existiert und nicht definiert ist.Sehen Sie den Unterschied mit diesem snippet:
Gibt es
0 6
.Den "richtigen" Weg, um damit umzugehen, allerdings ist das, was @soulSurfer2010 sagte in seiner post.