Chomp地图的所有键(使用较少的代码)

时间:2015-12-16 08:20:41

标签: perl

我正在尝试做类似

的事情
my %my_map = map { chomp($_) => 1 } @my_arr;

这并不能达到我的预期,所以我需要:

my @chomped_arr = @my_arr;
chomp @chomped_arr;
my %my_map = map { $_ => 1 } @chomped_arr;

这样做的简短方法是什么?

4 个答案:

答案 0 :(得分:5)

这里的问题是chomp修改变量,但不会返回它。所以它不会在地图上工作。

我喜欢的解决方法是使用r正则表达式修饰符 -

my %my_map = map { s|\n||gr => 1 } @my_arr;

返回修改后的结果,但没有更改原始文件(这将更改@arr)。

注意 - 上面的内容并不完全 - 它会删除任何换行符。 (当然,您可以在正则表达式中添加$。例如s|\n$||r

r正则表达式标志是一个较新的功能( new)。无法回想起OTOH引入的perl版本。

也可以使用文件句柄输入执行此操作:

my %stuff = map { s|\n||gr => 1 } <$fh>;

严格来说,chomp会从行末删除$/,因此您可能需要

s|\Q$/\E\z||r

我认为严格复制chomp - 但这可能是可读性的权衡。

答案 1 :(得分:4)

map的问题在于modifies its argument, and returns some unrelated and usually useless value内的chomp。解决方案是创建临时变量,保存$_chomp的副本,然后将其用作密钥:

my %my_map = map { my $k = $_; chomp $k; $k => 1 } @my_arr;

答案 2 :(得分:3)

我建议您的文件内容不应该首先被读入数组

这是一种更好的方法

my %my_map;
while ( <> ) {
    chomp;
    $my_map{$_} = 1;
}

或者,如果必须在数组中包含文件内容,那么

my %my_map = do {
    chomp(my @temp = @my_arr);
    map { $_ => 1 } @temp;
};

答案 3 :(得分:0)

这个问题是php bin/console doctrine:cache:clear-metadata 没有返回一个改变的值,它会改变它的参数。我经常想要解决的一种方法是创建一个新函数chomp,它可以作为一个纯函数。

chomped

然后您可以在地图中使用它

sub chomped { my $v = shift; chomp $v; return $v }