Родной perl hexdump - просто проверка на нулевые значения - PullRequest
1 голос
/ 03 марта 2012

Я пытаюсь проверить, является ли диск или образ диска «пустым». Я собираюсь предположить, что это верно, если первые 1 МБ и последние 1 МБ являются нулями. Я начал с попытки воссоздать 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 ]

6 голосов
/ 03 марта 2012

Проверьте непосредственно, содержит ли строка байтов $buffer что-либо кроме \0 байтов.

if ($buffer =~ /[^\0]/) {
    $flag++;
}
1 голос
/ 03 марта 2012

Зачем использовать 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";
        }
    }
}
0 голосов
/ 03 марта 2012

Зачем себя зацикливать? Вы можете просто использовать функцию List :: Util's first. Это также короткие замыкания.

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