当我运行以下声明:

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

这是返回的一个空的列表,而不是过滤后的列表,我的预期。我试图要做的是删除的每一个发生的   从一系列的串(这是一种XML文件)。

显然,我并不了解的东西。任何人都可以告诉我是正确的方式做到这一可能,并为什么这不是为我工作为的是?

有帮助吗?

解决方案

试试这个:

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

问题是s员在perl修改$_但实际上返回的数量改变它。因此,额外$_在结束导致perl返回的修改串的每个元素的@outdata.

其他提示

注意到那张地图是要修改源阵列。所以你可以做到:

map {s/ //g} @outdata;

和跳过@过滤的变量完全,或者如果你需要保留原稿,

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

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

s/ //g foreach @filtered;

格雷格的答案的问题,它将修改原来的阵美元_都过去了别名。你需要:

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

跟进Tithonium点,这也会做的把戏:

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

"本地"确保你的工作副本的,不是原来的。

在perl5.14你可以使用 /r regex修改 使非破坏性替代.

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

作为对格雷格的答案,你可能滥用查询:

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

不要这样做。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top