2016-03-20 7 views
1

Angenommen, ich habe my $LIST, die etwa wie folgt lautet:Verwenden von Perl, um nur das erste Wort jeder Zeile in einer Zeichenfolge zu erhalten?

Caterpillar1 is red and hairy 
Caterpillar2 is green and schwifty 
Caterpillar3 is yellow and schwifty 

Nun, was will ich Liste zu tun ist im Wesentlichen die equivilant von awk {'print $1'}. Ich möchte aus dieser die folgende Liste ziehen:

Caterpillar1 
Caterpillar2 
Caterpillar3 

Wie dies in Perl erreicht werden kann, ohne außerhalb Systembefehle verwendet?

Antwort

3

Gegeben:

$ echo "$txt" 
Caterpillar1 is red and hairy 
Caterpillar2 is green and schwifty 
Caterpillar3 is yellow and schwifty 

Sie einen regulären Ausdruck des Eingangs line-by-line tun können:

$ echo "$txt" | perl -nle 'print $1 if /^(\w+)/' 
Caterpillar1 
Caterpillar2 
Caterpillar3 

Oder, wie es in den Kommentaren, $ echo "$txt" | perl -nle 'print /^(\w+)/'

Sie können auch die Verwendung Zeile für Zeile Auto Split-Modus (ähnlich wie awk Split auf Leerzeichen):

$ echo "$txt" | perl -lane 'print $F[0]' 
Caterpillar1 
Caterpillar2 
Caterpillar3 

Wenn der Multi-Line-String eine einzelne Zeichenfolge ist, benutzen Sie einfach eine globale Regex:

print "$1\n" while $txt=~/^(\w+)/gm; 

Oder, wie es in den Kommentaren,

print join "\n", $txt =~ /^(\w+)/mg, ''; 
+0

Oder 'Druck beitreten "\ n", $ txt = ~/^ (\ w +)/mg, '';' – ysth

+0

Nur ein weiterer Weg, ja – ysth

+0

'drucken 1 $ if/^ (\ w +) /; 'ist ein langer Weg, um' print/^ (\ w +) /; 'zu schreiben. Ich bin mir nicht sicher, warum Sie auch den Platz hinzugefügt haben. Es sollte einfach '/^(\ w +) /' oder '/^(\ S +) /' sein. '/^(\ w +) /' macht keinen Sinn. – ikegami

1

Verwenden split diese Zeichenfolge in den Leitungen zu drehen, dann wieder verwenden es Linien in Worte zu verwandeln:

foreach my $line (split /\n/, $LIST) 
{ 
    print ((split//, $line)[0]); 
    print "\n"; 
} 
+0

Das funktioniert! Danke Freund – driedupsharpie

+0

'split//' teilt sich auf * ein * Leerzeichen (bedeutet zwei aufeinander folgende Leerzeichen macht ein leeres Element). Wahrscheinlich möchtest du "split", das sich auf einen oder mehrere Leerzeichen aufteilt. – TLP

2

Sie können einfach tun: @list = map { /^(\S+)/ } split /\n/, $str, um eine Liste der ersten Wörter jeder Zeile in Ihrer Zeichenfolge zu erhalten.

Oder eleganter: @list = $str =~ /^(\S+)/mg

Verwandte Themen