3

我有一个包含列表的脚本

@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)。

我在这里做错了什么?

最好的祝福。

4

2 回答 2

10

你的问题是这一行:

print @ind . "\n";

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

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

print @ind , "\n";

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

say @ind;

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

say "@ind";

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

say for @ind;

在上述所有内容中say,当然可以print在末尾用换行符替换。

于 2013-07-13T10:58:40.127 回答
0

您应该使用散列数组将数据存储为一个单元。在您填充@x@names. (假设 x 值在 in$x并且名称在$name.)

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

要在 index 处检索名称$i$data[$i]{name}

要在 index 处检索 x 值$i$data[$i]{x}

遍历数组:

for my $item_ref ( @data ){
    my $name = $item_ref->{name};
    my $x    = $item_ref->{x};
    # do something
}
于 2013-07-13T12:26:27.700 回答