题
当我运行以下声明:
@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;
不要这样做。
不隶属于 StackOverflow