2010-11-19 17 views
-2

WieUmwandlung multline String Array

mehrzeiligen String Array konvertieren
my $text= " ads da 
sda 
s 
da 
d 
as 

das 
d a as dasd 
\n 

"; 

Anmerkung: Ich möchte nicht Newline entfernen oder löschen?

+1

Dies ist eine schlechte Frage. Definieren Sie Ihren Umfang klarer. Was enthält die Zeichenfolge? Ist das ein wörtliches "\ n"? Möchten Sie Leerzeilen ignorieren? – Zaid

+0

ich möchte nicht neue Zeile und leere Zeilen entfernen ... – Tree

+1

also was willst du aufteilen? – Ether

Antwort

11

Sie auf die Anfänge der Linien unter Verwendung des ^ metacharacter gespalten könnte und der m Regexp-Modifikator (lassen Sie ^ den Anfang der Zeile statt nur den Anfang übereinstimmen der string):

split /^/m, $text 

Eigentlich kann man die m seit split bringt es auf für Sie in diesem Fall auslassen. Von perldoc -f split: "Ein Muster von"/^/"wird behandelt, als ob es"/^/m "wäre, da es sonst nicht viel verwendet wird."

Arbeiten mit dem Wert für $text, diesen Code:

use Data::Dumper; 
$Data::Dumper::Useqq=1; 
print Data::Dumper->Dump([[split /^/, $text]], ["*text"]); 

Drucke diese:

@text = (
      " ads da\n", 
      "sda\n", 
      "s \n", 
      "da\n", 
      "d\n", 
      "as\n", 
      "\n", 
      "das\n", 
      "d a as dasd\n", 
      "\n", 
      "\n", 
      "\n" 
     ); 
18

So wie es aussieht, könnte die Frage klarer formuliert werden.

my @text = split "\n", $text; 
+5

Downvoter (s): Möchten Sie erklären, was mit dieser Antwort nicht stimmt? – Zaid

+2

Ich kümmerte mich darum, indem ich eine Upvote hinzufügte. – Axeman

+0

Dies ist die beste Lösung für eine Liste von Zeichenfolgen mit Textfeldern fester Breite –

2

Wenn man bedenkt, dass das erste Argument split ein Muster ist:

#!/usr/bin/perl 

use strict; use warnings; 
use YAML; 

my $text = " ads da 
sda 
s 
da 
d 
as 

das 
d a as dasd 
\n 

"; 

print Dump [ split /(\n)/, $text ]; 

Ausgang:

--- 
- ' ads da' 
- "\n" 
- sda 
- "\n" 
- s 
- "\n" 
- da 
- "\n" 
- d 
- "\n" 
- as 
- "\n" 
- '' 
- "\n" 
- das 
- "\n" 
- d a as dasd 
- "\n" 
- '' 
- "\n" 
- '' 
- "\n" 
- '' 
- "\n"
1

Mein Gefühl ist man auf dem falschen Problem konzentrieren.

Anstatt zu versuchen, eine skalare mehrzeilige String-Konstante in eine Liste zu konvertieren, sollte Ihre Frage vielleicht lauten: "Wie kann ich eine mehrzeilige Zeichenkette in eine Perl-Liste oder ein Array initiieren?"

Betrachten Sie Perls List value constructors in Perldata.

Von besonderer Anwendbarkeit auf Ihre Frage ist, wie man eine heredoc verwenden, um ein Array mit einem mehrzeiligen Zeichenfolge zu initiieren:

#!/usr/bin/perl 
use strict; use warnings; 
use YAML; 

my @text= <<END =~ m/(^.*\n)/mg; 
ads da 
sda 
s 
da 
d 
as 

das 
d a as dasd 
\n 

END 

print Dump \@text; 

Drucke:

--- 
- " ads da\n" 
- "sda\n" 
- "s \n" 
- "da\n" 
- "d\n" 
- "as\n" 
- "\n" 
- "das\n" 
- "d a as dasd\n" 
- "\n" 
- "\n" 
- "\n" 

Mit den Idiomen Luke!

1

Ich hatte Spaß beim Zusammensetzen: Voila! Ihre Saite ist jetzt auch ein Array ohne split -ting es:

use strict qw<subs vars>; 
use warnings; 

@{" ads da 
sda 
s 
da 
d 
as 

das 
d a as dasd 
\n 
"} = 1..3 
;