【问题标题】:Print keys and values from hash in a proper format?以正确的格式从哈希中打印键和值?
【发布时间】:2016-01-31 20:15:05
【问题描述】:

您好,我正在尝试使用每行一个键/值打印散列的值和键,如下所示:

键:值

这是我用来打印哈希的代码:

foreach (sort keys %hash) { print "$_:$hash{$_}\n"; }

这是我得到的输出:

key
:value

为什么我的脚本会在新行上打印值,我可以做些什么来修复它?

【问题讨论】:

  • 键中是否有换行符?
  • use Data::Dumper; print Dumper \%hash 更容易。
  • 你确定吗?显示填充哈希的代码。
  • $Data::Dumper::Useqq = 1; 使 Dumper 转义特殊字符,因此换行符将显示为 \n
  • @NinjaAnte — 尝试编辑问题以包含 a proper test case。不要将代码转储到难以阅读的 cmets 中。

标签: perl hash


【解决方案1】:

光标正在移动到下一行,因为您的键包含换行符。解决方案是从键中删除换行符。

更具体地说,您肯定希望首先避免使用换行符创建键,因此应在创建哈希元素之前将其从键中删除。

您可能正在从文件句柄中读取密钥。通常使用chomp(删除任何尾随换行符)或s/\s+/z//(删除任何尾随空格,包括换行符)。

my @keys;
while (<>) {
   chomp;         # Or: s/\s+\z//;
   push @keys, $_;
}

my %hash; @hash{@keys} = @values;

【讨论】:

    【解决方案2】:

    试试这个版本的打印循环:

    foreach (sort keys %hash) {
       my $v = $hash{$_};
       s/\s+$//;
       print "$_:$v\n";
    }
    

    %hash 中的键肯定有一些不需要的尾随字符,因此最好在填充 %hash 时将它们过滤掉。例如,而不是这个:

    @hash{@keys} = @vals;
    

    这样写:

    @hash{map { s/\s+$//; $_ } @keys} = @vals;
    

    或者这个:

    chmop(@keys);
    @hash{@keys} = @vals;
    

    但是chomp 对多个字符没有帮助。

    【讨论】:

    • 更好的是,在将它们放入散列之前,从键字符串中删除空格。
    • 这不是一个很好的解决方案。如果 OP 尝试对散列做任何其他事情(检查键是否存在、设置值等),他会被奇怪的错误弄糊涂(“你是什么意思键 foo 不存在,我在我的print 输出中看到了它!”)。正确的答案是在创建哈希之前删除源中的尾随空格。
    • 包含哈希键的数组由包含各种名称的文本文件填充,每行一个名称,其中没有空格,我到处检查过。
    • 你在阅读它时是chomping 吗?因为这很可能是您问题的根源。
    • @NinjaAnte,再次检查,因为有空格。具体来说,有一个换行符。
    猜你喜欢
    • 2015-11-15
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多