在 Perl 中修剪回车 return (\r)
Trimming carriage return (\r) in Perl
我这里有一段简单的代码:
foreach my $key (keys %$structure)
{
$key =~ s/\r?$//;
$structure->{$key} =~ s/\r?$//;
}
这是我的修剪函数的一部分,它接收对对象的引用。这个对象(在我们的例子中是一个散列)之前是从键盘初始化的。
问题是每个类型化参数的末尾都有一个 \r ,这对于输出结构来说不是很酷。即使我试图用正则表达式替换 \r,它也行不通。这是为什么?
你有一些语法错误,你也没有删除旧的 $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 $key
...
使用 chomp 键盘输入然后将该值用作键比稍后修改散列键更容易。
如果您在同一脚本中使用 STDIN,则将 STDIN 保存到变量并将其包装在 chomp 中。
chomp($variable = <STDIN>);
然后使用变量作为键。
正如其他答案所述,chomp
删除尾随的换行符。它也适用于散列,即 chomp(%some_hash)
删除该散列的每个值的换行符。它不会更改密钥。
编辑:
它还会压缩数组的每个元素。所以你可以这样做:
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'
};
如果散列很大,这可能会占用大量资源。 "\r"
并非在所有系统上都被 chomp
编辑。我建议迭代散列并使用 s
(如果每个键和值都以 "\r"
结尾,则使用 chop
)作为更好的解决方案。
我这里有一段简单的代码:
foreach my $key (keys %$structure)
{
$key =~ s/\r?$//;
$structure->{$key} =~ s/\r?$//;
}
这是我的修剪函数的一部分,它接收对对象的引用。这个对象(在我们的例子中是一个散列)之前是从键盘初始化的。
问题是每个类型化参数的末尾都有一个 \r ,这对于输出结构来说不是很酷。即使我试图用正则表达式替换 \r,它也行不通。这是为什么?
你有一些语法错误,你也没有删除旧的 $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 $key
...
使用 chomp 键盘输入然后将该值用作键比稍后修改散列键更容易。 如果您在同一脚本中使用 STDIN,则将 STDIN 保存到变量并将其包装在 chomp 中。
chomp($variable = <STDIN>);
然后使用变量作为键。
正如其他答案所述,chomp
删除尾随的换行符。它也适用于散列,即 chomp(%some_hash)
删除该散列的每个值的换行符。它不会更改密钥。
编辑: 它还会压缩数组的每个元素。所以你可以这样做:
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'
};
如果散列很大,这可能会占用大量资源。 "\r"
并非在所有系统上都被 chomp
编辑。我建议迭代散列并使用 s
(如果每个键和值都以 "\r"
结尾,则使用 chop
)作为更好的解决方案。