【问题标题】:Perl hash key only prints when immediately followed by newlinePerl 哈希键仅在紧跟换行符时打印
【发布时间】:2012-03-09 04:42:09
【问题描述】:

也许我是愚蠢的,但这对我来说没有意义......我有一个通过从众多文件中读取唯一代码和错误代码构建的哈希值。当我尝试打印出 key=value 对时,除非紧跟换行符,否则不会出现键。

代码如下:

foreach my $key (keys %codehash){
    print "Key: $key\tValue: $codehash{$key}\n";
    print "Key: $key\n";
    print "Value: $codehash{$key}\n";
    print "\n\n";
}

这是输出:

         Value: NoParamSpecified
    Key: 016C
    Value: NoParamSpecified


        Value: billingAddress.firstName.lengthLong
    Key: 003M
    Value: billingAddress.firstName.lengthLong


         Value: billingAddress.address1.lengthLong
    Key: 0041
    Value: billingAddress.address1.lengthLong

请注意,它甚至没有打印第一条语句中的“Key:”纯文本,只是制表符及其他内容。我以前从未遇到过这种情况。

【问题讨论】:

  • 请发布输出的十六进制转储。

标签: perl printing hash key


【解决方案1】:

该行为与末尾包含"\r" 的所有键一致。十六进制转储将确认这一点。

确认这一点的另一种方法是在打印出来之前对键运行合适的正则表达式替换:

$key =~ s/\s+$//;

【讨论】:

  • 您是否正在读取在 Windows 上生成的文件?您使用的是chop 而不是chomps/\s+$//
  • 原来数据文件是基于 DOS 和基于 Unix 的组合。在添加到哈希之前,我将正则表达式应用于键/值变量,现在一切正常。正如我在帖子开头所说的那样,是我很愚蠢。谢谢大家!
  • \z 应该是 \s? (真正解决问题而不是确认问题)
【解决方案2】:

我敢打赌,因为您正在读取的数据中某处数据包含格式化字符,并且您将它们包含在关键数据中(如果格式化字符正在执行诸如“返回到行首”等)。

要解决这个问题,请尝试以 base64 或十六进制打印密钥,我敢打赌,您会发现它比您想象的要长得多。

use MIME::Base64;
# ...
print "Key: " . encode_base64($key) . "\tValue: $codehash{$key}\n";

【讨论】:

  • 嗯,键只有 4 个字母数字字符,所以我怀疑我遇到了格式化字符。这是您的建议的输出:Key: MDA0MQ0= Value: billingAddress.address1.lengthLong Key: 0041 Value: billingAddress.address1.lengthLong
  • @MarkHKrause,该输出表明第一个键以 "\r" 字符结尾,这会导致光标返回到第一列,然后剩余的输出会覆盖该键。 (如果 Wes 建议使用 unpack('H*', $key) 而不是 Base64,这会更明显。)
【解决方案3】:

这是终端 I/O 的一部分。它只打印在一行的末尾。设置输出自动刷新以使其在每个打印语句后打印:

foreach my $key (keys %codehash){
    local $| = 1;
    print "Key: $key\tValue: $codehash{$key}\n";
    print "Key: $key\n";
    print "Value: $codehash{$key}\n";
    print "\n\n";
}

查看 perldoc perlvar 并搜索 /OUTPUT_AUTOFLUSH/。

【讨论】:

  • 是的。我试过了,虽然我没有使用“本地”。仍然得到与以前相同的输出。
猜你喜欢
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2015-01-09
  • 2017-09-30
  • 2016-12-18
相关资源
最近更新 更多