Native perl hexdump - 只检查零值

时间:2012-03-02 22:03:57

标签: perl hexdump

我正在尝试检查磁盘或磁盘映像是否为“空”。我假设如果第一个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++;
        }
    }
}

有更好的方法吗?

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

为什么在那里使用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";
        }
    }
}

答案 2 :(得分:0)

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

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