2010-07-07 29 views
7

Ich habe ein Array, das eine Zeichenfolge enthält, die Leerzeichen enthalten kann, die an das Ende angehängt werden. Ich muss diese Räume mit Perl-Skript entfernen. meine Array wird so aussehenWie kann ich führende und nachfolgende Leerzeichen aus Array-Elementen entfernen?

@array = ("shayam "," Ram  "," 24.0  "); 

ich brauche die Ausgabe als

@array = ("shayam","Ram","24.0"); 

ich mit chomp (@array) versucht. Es funktioniert nicht mit den Strings.

+1

Duplizieren: http://stackoverflow.com/questions/184590/is-there-a-perl-compatible-regular-expression-to-trim-whitespace- Von beiden Seiten http://StackOverflow.com/Questions/2025658/How-do-i-Remove-white-Space-in-Aperl-String – Zaid

+0

In gegebenen Array, jeder Index enthält nur einzelne Zeichenfolge oder mehrere Strings auch wie @array = ("shayam nice", "Ram", "24.0"); ? –

+0

@Zaid: das sind keine genauen Duplikate davon. Hier geht es um eine Liste von Werten. –

Antwort

1
 
#!/usr/local/bin/perl -w 

use strict; 
use Data::Dumper; 

my @array=('a ', 'b', ' c'); 

my @newarray = grep(s/\s*$//g, @array); 

print Dumper \@newarray; 

Die Schlüsselfunktion ist hier grep(), alles andere ist nur Demo-Soße.

+5

Wäre 'map' nicht passender? –

+0

Karte ist komplexer als hier benötigt wird. Da Sie wissen, dass der Regex immer wahr zurückgibt und gleichzeitig $ _ modifiziert, ist Grep die beste Wahl. Alle diese Leute, die mit diesen albernen foreach Schleifen fortfahren, haben offenbar die ersten paar Kapitel irgendeines grundlegenden Perl Buches nicht gelesen. Grep ist Brot und Butter für Perl :) –

+2

(Antwort auf Alan Horn) IMO 'Grep' schlägt vor, nach etwas in einer Liste zu suchen, 'Karte' schlägt vor, dass die ganze Liste verwendet wird, daher 'Grep' wo eine 'Karte' ist besser geeignet macht den Code weniger sofort lesbar – plusplus

-1
my @res =(); 
my $el; 

foreach $el (@array) { 
    $el =~ /^\s*(.*?)\s*$/; 
    push @res, $1; 
} 

Danach enthält @res Ihre gewünschten Elemente.

+4

Dies ist unidiomatische Perl. – daxim

+2

@daxim: Sie meinen, weil Sie es lesen können? Ich dachte, bei Perl ging es nur um die Wahlfreiheit. – Borealid

+2

Lächerlich. Es ist nur eine Zeile mit 'map' oder [' foreach' (wie Zaid zeigt)] (http://stackoverflow.com/questions/3192649#3192716) und daher besser lesbar. 'mein $ el; foreach $ el ... 'ist der Stil eines ungeübten Anfängers, alle anderen schreiben' foreach my $ el ... '. Auch [Bikarbonat] (http://en.wikipedia.org/wiki/There_more_than_one_way_to_do_it). Entschuldigung, ich glaube nicht, dass deine Antwort so gut ist und es ihren Mangel an Upvotes verdient. – daxim

32

Die zugrundeliegende Frage dreht sich um das Entfernen führenden und Leerzeichen von Strings nachlauf, und hat in mehrere Fäden in die eine oder andere der folgenden regex Substitution (oder dessen Äquivalent) beantwortet:

s{^\s+|\s+$}{}g foreach @array; 

chomp Wenn Sie das Array entfernen, werden nur nachgestellte Eingabe-Trennzeichen (standardmäßig "\n") entfernt. Es wurde nicht entwickelt, um nachfolgende Leerzeichen zu entfernen.

Von perldoc -f chomp:

Es wird oft verwendet, um die Neue-Zeile vom Ende eines Eingabesatzes zu entfernen, wenn Sie befürchten, dass der letzte Datensatz seine Newline fehlen. Im Absatzmodus ($/ = "") werden alle nachfolgenden Zeilenumbrüche aus der Zeichenfolge entfernt.

...

Wenn Sie eine Liste chomp wird jedes Element chomped, und die Gesamtzahl der Zeichen entfernt wird zurückgegeben.

+1

Dies ist die richtige Antwort. Das OP fordert, dass die Elemente des Arrays an Stelle geändert werden, anstatt ein neues Array zu erstellen. Auch die Lösungen mit Capture, obwohl nicht falsch, sind verpflichtet, langsamer zu sein. Siehe auch perlfaq: http://perldoc.perl.org/perlfaq4.html#How-do-I-strip-blank-space-from-the-beginning%2fend-of-a-string%3f –

+0

Die Verwendung der '{}' als Trennzeichen ist fast snobistisch :-) Aber um ehrlich zu sein, ich wusste nicht, dass es akzeptiert wurde .. machen [diese Antwort] (http://stackoverflow.com/questions/5770590/which-characters-can -be-used-as-regulary-expression-delimiters) unvollständig .. –

+0

Könntest du oder irgendjemand mir bitte sagen, wo diese Syntax mit einem 'Block' (oder was es ist) vor dem 'foreach' Schlüsselwort dokumentiert ist. Die Perlsyn-Seite erwähnt diese Syntax nicht, aber es funktioniert. – user907860

-2

denke ich Borealid Vorbild sein sollte:

my @array = ("shayam "," Ram "," 24.0 "); 
foreach my $el (@array) { 
    $el =~ s/^\s*(.*?)\s*$/\1/; 
} 
+0

"Es kann einige Überraschungen auslösen, wenn innerhalb jeder Zeichenfolge Leerzeichen vorhanden sind". Was sind dann die Überraschungen? – bohica

+1

Vermeiden Sie '\ 1' auf der RHS der Substitution. Außerdem müssen Sie hier nicht erfassen. Siehe perlfaq: http://perldoc.perl.org/perlfaq4.html#How-do-I-strip-blank-space-from-the-beginning%2fend-of-a-string%3f und perlre: http://perldoc.perl.org/perlre.html#Warning-on-%5c1-Instead-of-%241 –

1

Wie wäre: @array = map {join(' ', split(' '))} @array;

+0

Auch wenn nicht darum gebeten, werden auch mehrere interne Leerzeichen komprimiert und führende und nachfolgende Leerzeichen abgeschnitten. Dies ist der effizienteste Weg tun Sie das, nach Rezept 1.19, Perl Cookbook, 2. Ausgabe – lkench

1

hier sah gut aus der höchsten bewerteten Antwort aber ist, meiner Meinung nach, nicht so einfach zu lesen, wie es sein könnte . Ich habe eine Zeichenfolge mit internen Leerzeichen hinzugefügt, um anzuzeigen, dass diese nicht entfernt werden.

#!/usr/bin/perl 

use strict; 
use warnings; 

my @array = ("shayam "," Ram  "," 24.0  ", " foo bar garply "); 

map { s/^\s+|\s+$//g; } @array; 

for my $element (@array) { 
    print ">$element<\n"; 
} 

Der Ausgang:

>shayam< 
>Ram< 
>24.0< 
>foo bar garply< 
Verwandte Themen