Perl:将字符串转换为数组并打印行号

时间:2015-02-02 10:40:16

标签: arrays perl grep

我有以下字符串Today, the sky is blue.,我想用它做两件事。

首先,我想把它变成以下数组(或哈希,不确定哪一个是正确的数组)。

Today
,

the

sky 

is 

blue
.

我可以使用这个grep grep -Eo '\w+|[^\w ]' input.txt来完成它,但有人可以告诉我如何使用perl来执行此操作(例如,为了将其作为脚本的一部分运行)。

第二件事,我想在我的阵列的每一行添加行号(我知道它在某处,但我想实际看到它),导致以下最终输出:< / p>

Today     1
,         2
          3
the       4
          5
sky       6
          7
is        8
          9
blue      10
.         11

有人可以帮我在perlish上下文中使用grep函数并打印相应的行号吗?非常感谢提前!

2 个答案:

答案 0 :(得分:3)

这是一种完成工作的方法:

my $text = "Today, the sky is blue.";
my @list = split/(\W)/, $text;
my $i = 1;
for (@list) {
    say $_,"\t",$i++ if $_ ne '';
}

<强>输出:

Today   1
,   2
    3
the 4
    5
sky 6
    7
is  8
    9
blue    10
.   11

答案 1 :(得分:1)

为了匹配Perl中的正则表达式,你有匹配的运算符,你会在PerlRegex tutorial找到很多关于它的例子和解释。

所以你会重用这样的正则表达式;在这里我将结果放入一个包含匹配项的数组中。任何后处理都应该应用于此数组。在这里,我只是输出它。

关于你的正则表达式的另一个细节 - 如果我这样做,使用你给的正则表达式

echo "Today, the sky is blue." | grep -Eo '\w+|[^\w ]'

输出结果为:

Today
,
the
sky
is
blue
.

这是因为您的否定字符类[^\w ]不仅排除了字母数字字符,还排除了空格。

但是,根据您的输出,您可能在此处[^\w],因此不属于\w的空格被视为匹配。所以我也在这里使用这个正则表达式。顺便说一下:我想知道,如果你真的希望每个非单词字符都是自己的匹配。

#!/usr/bin/perl
#

use strict;
use warnings;

while (<DATA>)
{
    my (@matches) = $_ =~ m/(\w+|[^\w])/g;

    print join("\n", @matches);
}

__DATA__
Today, the sky is blue.