2012-03-02 2 views
1

Я пытаюсь проверить, не является ли образ диска или диска «пустым». Я собираюсь предположить, что это верно, если первые 1mb и последние 1mb являются нулями. Я начал, пытаясь воссоздать hexdump, но, похоже, он немного сокрушен в этот момент.Исходный perl 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++; 
     } 
    } 
} 

Есть ли лучший способ сделать это?

ответ

6

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

if ($buffer =~ /[^\0]/) { 
    $flag++; 
} 
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"; 
     } 
    } 
} 
+0

Часто, когда вы оказываетесь команды '' раскол // для получения списка персонажей, есть некоторые лучший способ сделать это в Perl, не прибегая к рубить ваши строки на маленькие крошечные - и отдельные - символы. Подход регулярных выражений, данный @mob, будет на пару величин быстрее, чем метод slice-n-dice, который вы используете. – tchrist

+0

Конечно, я смотрел на слишком сфокусированный вид, пытаясь исправить шаг, а не переписывать весь алгоритм. – zigdon

0

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

use List::Util qw(first); 
$flag++ if first { ord($_) > 0 } split(//, $buffer); 
Смежные вопросы