【问题标题】:Native perl hexdump -- just checking for zero values本机 perl hexdump -- 只检查零值
【发布时间】:2012-03-02 22:03:56
【问题描述】:

我正在尝试检查磁盘或磁盘映像是否为“空”。如果前 1mb 和最后 1mb 为零,我将假设这是真的。我首先尝试重新创建 hexdump,但此时似乎有点困惑。

这大概是我的代码:

open DISK, $disk or die $!;
for( 1 .. 1024 ) {
    $buffer = undef;
    sysread(DISK, $buffer, 1024, 0) or last;
    for ( split //, $buffer ) {
        if( ord($_) =~ /[^0]/ ) {
            $flag++;
        }
    }
}

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: perl hexdump


    【解决方案1】:

    直接检查字节字符串$buffer是否包含\0字节以外的任何内容。

    if ($buffer =~ /[^\0]/) {
        $flag++;
    }
    

    【讨论】:

      【解决方案2】:

      为什么要在那里使用 RE?可以ord($_) > 0,不是吗?此外,如果您只关心在找到非零字节后进行标记,则在找到后中止,并且不要费心扫描磁盘的其余部分:

      open DISK, $disk or die $!;
      for( 1 .. 1024 ) {
          my $buffer = undef;
          sysread(DISK, $buffer, 1024, 0) or last;
          for ( split //, $buffer ) {
              if( ord($_) > 0 ) {
                  die "Non-zero byte found";
              }
          }
      }
      

      【讨论】:

      • 通常当你发现自己运行split // 来生成一个字符列表时,在 Perl 中有一些更好的方法可以做到这一点,而无需将你的字符串切成小而独立的字符。 @mob 提供的正则表达式方法比您使用的 slice-n-dice 方法快几个数量级。
      • 当然,我在那里查看的视图过于集中,试图修复一个步骤而不是重写整个算法。
      【解决方案3】:

      为什么要循环自己?您可以只使用 List::Util 的 first 函数。它也会短路。

      use List::Util qw(first);
      $flag++ if first { ord($_) > 0 } split(//, $buffer);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-26
        • 2014-12-02
        相关资源
        最近更新 更多