使用Perl只获取字符串中每一行的FIRST WORD?

时间:2016-03-20 17:05:59

标签: arrays list perl

假设我有my $LIST,如下所示:

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

现在我想要列出的内容基本上是awk {'print $1'}的等价物。我想从以下列表中获取:

Caterpillar1
Caterpillar2
Caterpillar3

如何在不使用任何外部系统命令的情况下在perl中完成此操作?

3 个答案:

答案 0 :(得分:3)

鉴于:

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

您可以对输入执行逐行正则表达式:

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

或者,与评论一样,$ echo "$txt" | perl -nle 'print /^(\w+)/'

您还可以使用逐行自动拆分模式(类似于空格上的awk拆分):

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

如果该多行字符串是单个字符串,只需使用全局正则表达式:

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

或者,如评论中那样,

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

答案 1 :(得分:2)

你可以这样做: @list = map { /^(\S+)/ } split /\n/, $str获取字符串中每一行的第一个单词列表。

或更优雅: @list = $str =~ /^(\S+)/mg

答案 2 :(得分:1)

使用split将该字符串转换为行,然后再次使用它将行转换为单词:

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