繁体   English   中英

在 Perl 中修整回车 (\r)

[英]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 function 回答了你的问题

chomp $key
...

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

正如其他答案所说, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM