为啥我的 Perl 映射不返回任何内容?

Posted

技术标签:

【中文标题】为啥我的 Perl 映射不返回任何内容?【英文标题】:Why doesn't my Perl map return anything?为什么我的 Perl 映射不返回任何内容? 【发布时间】:2010-09-05 22:35:33 【问题描述】:

当我运行以下语句时:

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

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

显然,我不明白一些事情。谁能告诉我这样做的正确方法可能是什么,为什么这对我不起作用?

【问题讨论】:

这个和***.com/questions/1458454/…有关,答案是一样的。 【参考方案1】:

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

map s/ //g @outdata;

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

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

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

s/ //g foreach @filtered;

【讨论】:

map 在 void 上下文中通常被认为是糟糕的形式,并且不会超过 for @filtered ... 【参考方案2】:

试试这个:

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

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

【讨论】:

我觉得不够卑鄙,无法投反对票,但这是个坏主意。 ***.com/questions/12103/… 是一个更好的答案。 使用Perl 5.14's non-destructive substitution,您可以像@filtered = map s/ //gr @outdata 一样执行此操作,而不会影响@outdata【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:
use Algorithm::Loops "Filter";
@filtered = Filter  s/ //g  @outdata;

【讨论】:

【参考方案7】:

与 Greg 的回答相反,您可能会误用 grep:

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

不要这样做。

【讨论】:

以上是关于为啥我的 Perl 映射不返回任何内容?的主要内容,如果未能解决你的问题,请参考以下文章

尽管表上存在行,但休眠查询不返回任何内容

为啥 getLastRequest 不返回任何内容?

为啥 Firestore 有时不返回任何内容,没有错误,啥也没有?

main 函数不返回任何内容。为啥? [复制]

为啥替换在空字符串上不返回任何内容

为啥 java.sql.ResultSet 的“getFloat(column)”方法不返回任何内容,而其他方法则返回?