1

ディスクまたはディスクイメージが「空」であるかどうかを確認しようとしています。最初の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++;
        }
    }
}

これを行うためのより良い方法はありますか?

4

3 に答える 3

6

$bufferバイト文字列にバイト以外のものが含まれていないかどうかを直接確認してください\0

if ($buffer =~ /[^\0]/) {
    $flag++;
}
于 2012-03-02T22:07:37.617 に答える
1

なぜ自分をループさせるのですか?firstList::Utilの関数を使用するだけです。また、短絡します。

use List::Util qw(first);
$flag++ if first { ord($_) > 0 } split(//, $buffer);
于 2012-03-02T22:44:34.903 に答える
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";
        }
    }
}
于 2012-03-02T22:06:30.107 に答える