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

时间:2020-03-05 18:39:51  来源:igfitidea点击:

当我运行以下语句时:

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

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

显然,我不了解某些内容。谁能告诉我这样做的正确方法,为什么这对我不起作用?

解决方案

回答

试试这个:

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

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

回答

与Greg的回答相反,我们可以滥用grep:

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

不要这样

回答

请注意,地图还将修改源数组。因此,我们可以执行以下操作:

map {s/ //g} @outdata;

并完全跳过@filtered变量,或者如果我们需要保留原始文档,

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

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

s/ //g foreach @filtered;

回答

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

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

"本地"可确保我们正在处理副本,而不是原始副本。

回答

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

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

回答

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