为什么我的Perl地图没有返回任何内容?

时间:2008-08-15 09:38:31

标签: perl map

当我运行以下声明时:

@filtered = map {s/ //g} @outdata;

它返回一个空列表而不是我期望的过滤列表。我想要做的是从字符串数组(这是一个XML文件)中删除 的每一次出现。

显然,我不理解某些事情。任何人都可以告诉我这样做的正确方法,以及为什么这对我不起作用?

7 个答案:

答案 0 :(得分:15)

请注意,map也会修改您的源数组。所以你可以这样做:

map {s/ //g} @outdata;

并完全跳过@filtered变量,或者如果你需要保留原件,

@filtered = @outdata;
map {s/ //g} @filtered;

虽然在这种情况下,使用foreach可能更具可读性:

s/ //g foreach @filtered;

答案 1 :(得分:10)

试试这个:

@filtered = map {s/ //g; $_} @outdata;

问题是perl中的s运算符修改了$ _但实际上返回了它所做的更改次数。因此,最后的额外$ _会导致perl为@outdata的每个元素返回修改后的字符串。

答案 2 :(得分:9)

Greg的答案有一个问题,它会修改原始数组,因为$ _被传递别名。你需要:

@filtered = map { (my $new = $_) =~ s/ //g; $new} @outdata;

答案 3 :(得分:6)

为了跟进Tithonium的观点,这也可以解决问题:

@filtered = map {local $_=$_; s/ //g; $_} @outdata;

“本地”确保您正在处理副本,而不是原件。

答案 4 :(得分:5)

在perl 5.14中,您可以使用 / r 正则表达式修饰符make non-destructive substitution

@filtered = map {s/ //gr} @outdata;

答案 5 :(得分:4)

use Algorithm::Loops "Filter";
@filtered = Filter { s/ //g } @outdata;

答案 6 :(得分:3)

作为Greg答案的对照,你可能会误用grep:

@filtered = grep {s/ //g; 1} @outdata;

不要这样做。