在 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
...

https://www.geeksforgeeks.org/perl-chomp-function/

使用 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)作为更好的解决方案。