2012-03-02 13 views
1

我試圖檢查磁盤或磁盤映像是否爲'空'。如果第一個1mb和最後一個1mb是零,我會假設這是真的。我開始試圖重新創建hexdump,但在這一點上似乎有點conv ded。本地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 2012-03-03 16:53:06

+0

當然,我一直在關注那個視圖,試圖修復一個步驟而不是重寫整個算法。 – zigdon 2012-03-03 21:11:53

0

爲什麼要循環自己?你可以使用List :: Util的first函數。它也是短路。

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