Perl grep总是返回列表上下文中的匹配数

时间:2013-07-13 10:53:51

标签: perl list grep

我有一个带有列表的脚本

@names = ();
@x = ();

两个列表都与数据并行填充,因此,最后我有两个列表,其中包含同一索引处每个元素的名称和x值。注意,有多个元素具有相同的x值。

我希望所有元素都具有特定的x值,代码为

foreach my $x (0..4) {      
    my @ind = grep { $x[$_] == $x } 0..$#names;
    print @ind . "\n";
}

然而,输出是

17
17
8
4

这正是x = 0,x = 1,...

的元素数量

我想知道因为列表上下文中的grep应该返回一个匹配列表(这里是匹配元素的indizes)。

我在这里做错了什么?

最好的问候。

2 个答案:

答案 0 :(得分:10)

你的问题就在这一行:

print @ind . "\n";

当您使用连接运算符.时,将两个参数都放入标量上下文中,并在标量上下文中,数组返回其大小,而不是其内容。

您想要的是使用逗号运算符:

print @ind , "\n";

或者更好的是,使用功能say

say @ind;

如果你真正想要的是在一行中打印数字,用空格分隔:

say "@ind";

或者如果您想要用换行符分隔打印它们:

say for @ind;

在上述所有情况中,say当然可以由print替换为最后一行换行符。

答案 1 :(得分:0)

您应该使用哈希数组将数据存储为一个单元。在填充@x@names的位置执行此操作。 (假设x值在$x中且名称在$name中。)

push @data, {
    name => $name,
    x    => $x,
};

要检索索引$i的名称:$data[$i]{name}

要检索索引为$i的x值:$data[$i]{x}

迭代数组:

for my $item_ref ( @data ){
    my $name = $item_ref->{name};
    my $x    = $item_ref->{x};
    # do something
}