当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么我的Perl地图没有返回任何内容?》经验,为你挑选了5个好方法。

当我运行以下语句时:

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

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

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



1> 小智..:

请注意,map也将修改源数组.所以你可以这样做:

map {s/ //g} @outdata;

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

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

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

s/ //g foreach @filtered;



2> Greg Hewgill..:

试试这个:

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

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


我没有足够的意思来投票,但这是一个坏主意.http://stackoverflow.com/questions/12103/why-doesnt-my-perl-map-return-anything/21792#21792是一个更好的答案.
此代码会破坏@outdata中的值.

3> Shlomi Fish..:

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

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



4> Michael Cram..:

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

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

"本地"确保您正在处理副本,而不是原件.



5> pasja..:

在perl 5.14中,您可以使用/ r regex修饰符进行非破坏性替换.

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

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有