2017-09-11 3 views
1

Ich verstehe nicht, warum Perl chomp die Leerzeichen um meine Zeichenfolge nicht entfernt. Ich habe sogar versucht, chomp zweimal zu nennen, zum Beispiel bash mit:Warum löscht chomp nicht Leerzeichen um meine Saite?

$ perl -e 'use 5.22.4; chomp(my $extra=" lol "); chomp($extra); say "<$extra>"' 
<lol> 

ich wirklich erwartet

<lol> 
+5

Warum erwarten Sie das? Bitte lesen Sie die Dokumentation für diese Funktion. – Mat

+0

Versuchen Sie hier, Whitespaces zu trimmen: http://www.perlmonks.org/?node_id=522531 – AntonH

+2

* Warum entfernt chomp nicht Leerzeichen um meine Zeichenfolge? * Weil das ist nicht was 'chomp()' tut :-) –

Antwort

7

Chomp nur entfernt die Linie bekommen Endung (kann mit $/ variabel eingestellt werden) vom Ende der Schnur. Es schneidet die Saite nicht ab. Perl hat keine eingebaute Trimmfunktion. Ich buchstabieren in der Regel zwei Substitutionen statt:

s/^\s+//, s/\s+$// for $string; 

Weiterführende Literatur:

+1

global switch könnte hier nützlicher sein "$ extra = ~ s/^ \ s + | \ s + $ // g" – hoffmeister

+0

[implementiert in perl5i] (https://metacpan.org/pod/distribution/perl5i/lib/perl5ifaq.pod # How-do-I-strip-whitespace-aus-einer-string?) – daxim

6

Um alle Leerzeichen zu entfernen:

$string =~ s/\s+//g; 

Linke trim:

$string =~ s/^\s+//; 

Rechts Trim:

$string =~ s/\s+$//; 

links und rechts trim:

$string =~ s/^\s+|\s+$//g 

Wir können dann auch Trimmen fucntions bauen. Dies hilft bei viel größeren Skripts, bei denen Sie nicht jedes Mal die vollständigen Ersetzungszeichenfolgen schreiben möchten, wir schreiben sie einmal und verwenden dann die Funktion, um die Arbeit zu erledigen.

Diese einfache Funktion kann in jedem Skript als trim($string);

sub trim { 
    $_[0] =~ s/^\s+|\s+$//g; 
} 

ähnlich ist es mit einem vollen Streifen von Leerzeichen verwendet werden.

sub full_strip { 
    $_[0] =~ s/\s+//g; 
} 

in einem Skript:

use strict; 
use warnings; 
my $string = " this is line with leading and trailing whitespaces "; 
my $string2 = "   another one of those lines "; 

trim($string); 
trim($string2); 

print "$string\n"; 
print "$string2\n"; 

full_strip($string); 
full_strip($string2); 

print "$string\n"; 
print "$string2\n"; 


sub trim { 
    $_[0] =~ s/^\s+|\s+$//g; 
    } 

sub full_strip { 
    $_[0] =~ s/\s+//g; 
    } 
0
$string=~s/^\s+|\s+$//g; 

Diese für jede generische String gut funktionieren würde, wo man Anfang und Ende Leerzeichen entfernen möchten.

Verwandte Themen