[英]Trimming carriage return (\r) in Perl
我在这里有一段简单的代码:
foreach my $key (keys %$structure)
{
$key =~ s/\r?$//;
$structure->{$key} =~ s/\r?$//;
}
这是我修剪 function 的一部分,它引用了 object。 这个 object(在我们的例子中是 hash)之前是从键盘初始化的。
问题是每个类型化的参数最后都有一个 \r,这对于输出结构不是很酷。 .即使我试图用正则表达式替换 \r,。 这是为什么?
使用 chomp 键盘输入然后将该值用作键而不是稍后修改 hash 的键更容易。 如果您在同一脚本中使用 STDIN,则将 STDIN 保存到变量中并将其包装在 chomp 中。
chomp($variable = <STDIN>);
然后使用变量作为键。
你有一些语法错误,你也没有删除旧的$key
。
像这样的东西应该工作:
foreach my $key (keys %structure) {
my $value = $structure{$key};
delete $structure{$key};
$key =~ s/\r$//;
$structure{$key} = $value;
}
或者:
%structure = map { $a = $structure{$_}; s/\r$//; $_ => $a } keys %structure;
正如其他答案所说, chomp
删除了尾随的换行符。 它也适用于哈希,即chomp(%some_hash)
删除 hash 的每个值的换行符。 它不会更改键。
编辑:它还 chomps 数组的每个元素。 所以你可以这样做:
perl -MData::Dumper -e 'my %hey = ("a\n" => "b\n", "c\n" => "d");
chomp(my @a = %hey); %hey = (@a); print Dumper(\%hey)'
$VAR1 = {
'c' => 'd',
'a' => 'b'
};
如果 hash 很大,这可能会占用大量资源。 并且"\r"
并非在所有系统上都被chomp
。 我建议遍历chop
并使用s
(如果每个键和值都以"\r"
结尾,则使用截断)作为更好的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.