2012-03-02 8 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によって与えられる正規表現のアプローチは、あなたが使っているスライス・アンド・ダイスの方法よりも2倍の速さになります。 – tchrist

+0

確かに、アルゴリズム全体を書き直すのではなく、ステップを修正しようと考えていたのです。 – zigdon

0

なぜあなた自身がループしますか? List :: Utilのfirst関数を使うことができます。それはまた短絡する。別の - - 文字

use List::Util qw(first); 
$flag++ if first { ord($_) > 0 } split(//, $buffer); 
関連する問題