我正在尝试做类似
的事情my %my_map = map { chomp($_) => 1 } @my_arr;
这并不能达到我的预期,所以我需要:
my @chomped_arr = @my_arr;
chomp @chomped_arr;
my %my_map = map { $_ => 1 } @chomped_arr;
这样做的简短方法是什么?
答案 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 }