首页 > 解决方案 > Perl printf 换行符

问题描述

希望在从 j 打印的 100 个字节中的每 16 个字节后添加一个换行符。目前所有 100 个字节都打印在一行上。

任何帮助都会非常充分,谢谢。

for ($j = 6; $j < 106; $j++)
        {
            printf("%02X ", hex(@bytes[$j]));
        }
        printf("\t");

谢谢大家。我以另一种方式接近它。最后,视觉方面不是问题,因为我最终还是打印了文件。然后将这些数据粘贴到十六进制编辑器中,因此格式化是一种预先考虑而不是需要。下面现在输出我最终寻找的所有数据,而不是预定的长度。

for ($j = 6; $j < @bytes; $j = $j + 1)      
        {
            printf outfile ("%02X ", hex(@bytes[$j]));
        }
        printf("\n");

标签: perl

解决方案


用于splice()一次从数组中抓取 16 个元素。

我也改用say(),join()和.map()sprintf()

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

my @bytes = map { int(rand(255)) } 0..200;

# As splice is destructive, take a copy of the array.
# Also, let's remove those first six elements and any
# after index 106.

my @data = @bytes[6 .. 105];

while (my @row = splice @data, 0, 16) {
  say join ' ', map { sprintf '%02X', $_ } @row;
}

更新:为您提供更多 Perl 技巧。

  • 始终将use strict和添加use warnings到您的 Perl 程序的顶部。并解决他们将向您展示的问题。
  • @bytes[$j]最好写成$bytes[$j](因为它是一个单一的值)。这是use warnings要告诉你的事情之一。
  • for ($j = 6; $j < 106; $j++)可能最好写成for my $j (6 .. 105). “一个接一个”错误的可能性较小。
  • 实际上,由于您只是$j用来从数组中获取元素,您可能只想直接遍历数组的元素 - for my $elem (@bytes[6 .. 105])(然后使用$elem代替$bytes[$j])。

推荐阅读