我正在尝试检查磁盘或磁盘映像是否为“空”。我假设如果第一个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++;
}
}
}
有更好的方法吗?
答案 0 :(得分:6)
直接检查字节字符串$buffer
是否包含\0
字节以外的任何内容。
if ($buffer =~ /[^\0]/) {
$flag++;
}
答案 1 :(得分: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";
}
}
}
答案 2 :(得分:0)
为什么要自己循环?您可以使用List :: Util的first
函数。它也短路。
use List::Util qw(first);
$flag++ if first { ord($_) > 0 } split(//, $buffer);