heh. i didn't realize i sucked this bad =)
On 9/1/05, John W. Krahn <[EMAIL PROTECTED]> wrote: > > Anyway, the issue I have is that I need to determine where there are > > gaps between the first sector and last sector (on the entire disk, not > > on a given partition). > > How do you determine which partitions to skip and which not to skip? Well, my initial thought was to skip partition 2 entirely (which is reserved in Solaris as a means to address the entire disk, and would therefore bork up the calculations). I've since realized that I can't quite do that, I need to at least check if part2 is the only one present first. Either way, it won't be part of the calculations though. Really, I should check all the partitions and see if the difference between start and end sectors is == the total number of sectors ... > > > use strict(); > > You are telling perl to load the 'strict' module and then you are telling the > 'strict' module not to do anything (with the empty parentheses.) Why use the > module if you don't want it to do anything? *doh* . thanks. > > sub get_vtoc($) { > > You really, really, *REALLY* shouldn't use "prototypes". If you want to check > the arguments passed to your subroutine you should do something like this: > > @_ == 1 or die "Wrong number of arguments passed to get_vtoc().\n"; > > > "Far More Than Everything You've Ever Wanted to Know about Prototypes in Perl" > http://library.n0i.net/programming/perl/articles/fm_prototypes/ A very good read, noted and changed. > > > # if this is the bytes/sector line, split it > > # and store the bytes per sector as $BPS > > if($_ =~ /bytes\/sector/) { > > our (undef, $BPS, undef) = split(/\s/, $_, 3); > > our() is lexically scoped just like my() and the only reason that this > actually works is because strict is turned off and $BPS is a package variable. > To make this work correctly with strict you have to declare $BPS outside of > the while loop. > > If you use split correctly that could be written as: > > $BPS = ( split )[ 1 ]; > > Then you wouldn't need the substitutions at the beginning of the loop. > > However *I* would write it like this: > > if ( /(\d+)\s+bytes\/sector/ ) { > $BPS = $1; > } I think this is the best example of regexp backreferencing I've seen. At last, they make sense to me =) I've changed this in the real script, and a few other places elsewhere to boot! > > } > > > > # skip the the line if it starts with an * or is partition 2 > > next if(/^[\*|2]/); > > Your comment is incorrect, it should read "if it starts with an * or a | or is > partition 2". Regular expression meta-characters are not special in a > character class so you probably meant /^[*2]/. I did indeed mean that. And now that you've got it working the right way I realize it's totally not what I wanted. I need to leave the 2 out of it, because if partition 2 is the only one defined, I need to return it. Many thanks for helping me catch this. > > > # put the pieces into the slices hash > > $slices{$part} = { > > bps => "$BPS", > > tag => "$tag", > > flag => "$flag", > > part => "$part", > > fsector => "$fsector", > > lsector => "$lsector", > > sectcount => "$sectcount", > > mount => "$mount" > > perldoc -q quoting > > Found in /usr/lib/perl5/5.8.6/pod/perlfaq4.pod > What's wrong with always quoting "$vars"? Read ... I don't quite get it, but I understood enough to realize that I needed to unquote them or potentially suffer difficult to trace errors later on. Done. > This appears to do what you want (although there may be a module that does > this better): > > my @sec_range; > for my $sectors ( map [ @{ $_ }{ 'fsector', 'lsector' } ], > sort { $a->{ fsector } <=> $b->{ fsector } } > values %$slices ) { > > if ( @sec_range && $sec_range[ -1 ][ 1 ] == $sectors->[ 0 ] - 1 ) { > $sec_range[ -1 ][ 1 ] = $sectors->[ 1 ]; > } > else { > push @sec_range, $sectors; > } > } > > print "Available sectors:\n"; > print "\t0 - ", $sec_range[0][0]-1, "\n" if $sec_range[0][0]; > print "\t", $sec_range[$_-1][1]+1, ' - ', $sec_range[$_][0]-1, "\n" > for 1 .. $#sec_range; This does indeed do the right thing on the sample data. I'm working through it slowly, and I kinda get it. I gotta admit, I'm lost in the crypticism, but it looks like it throws the firstsectors and lastsectors into a hash, sorts the keys and values independantly, then compares ? I'm trying it on a second drive however, and am getting results that don't look right ... That drive has the following partitions defined: * First Sector Last * Partition Tag Flags Sector Count Sector Mount Directory 0 2 00 1048707 68030172 69078878 / 1 3 01 0 1048707 1048706 2 5 00 0 71127180 71127179 7 8 00 69078879 2048301 71127179 /export/home I would expect the script to return no available sectors, but am getting this instead: Available sectors: 1048707 - -1 71127180 - 1048706 Still looking into why, not sure, since I'm just trying to figure out which end is up =0) Thanks for the input and guidance. I'll keep hacking away on this and see if I can't get it to work, now that I've got an idea on how to start. - jason -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>