Hi james28909 , yes, I'm that guy, you know what I'm going to say :) don't nest loops, write subroutines, small subroutines, easy to debug ... naturally this code is untested but looks easier to read doesn't it :) instead of bunches of comments, subroutine names #!/usr/bin/perl --
##
##
## perltidy -olq -csc -csci=3 -cscl="sub : BEGIN END " -otr -opr -ce
+-nibc -i=4 -pt=0 "-nsak=*"
## perltidy -olq -csc -csci=10 -cscl="sub : BEGIN END if " -otr -opr
+-ce -nibc -i=4 -pt=0 "-nsak=*"
## perltidy -olq -csc -csci=10 -cscl="sub : BEGIN END if while " -otr
+ -opr -ce -nibc -i=4 -pt=0 "-nsak=*"
#!/usr/bin/perl --
use strict;
use warnings;
use Data::Dump qw/ dd /;
use autodie qw/ open close /;
use Path::Tiny qw/ path /;
Main( @ARGV );
exit( 0 );
sub Main {
my( $dirname ) = @_;
my @files = getFiles( $dirname );
my @pointers;
for my $file ( @files ) {
SolveThisProblem( $file, \@pointers );
}
SpewPointers( 'temp', \@pointers );
} ## end sub Main
sub SpewPointers {
my( $outfile, $pointers ) = @_;
my $tempfh = path( 'temp' )->openw; ## just like autodie dies o
+n error
my $ix = 0;
for my $lines ( @$pointers ) {
++$ix;
print $tempfh "Pointer$_ - $lines";
}
close $tempfh;
} ## end sub SpewPointers
sub SeekToAbcOffset {
my( $infh ) = @_;
my $infhsize = -s $infh;
#seek to text entry reference in file
seek $infh, 6, 0;
read $infh, my $buf, 2;
#convert data
my $abc = unpack( 'H*', $buf );
my $offset = hex( $abc );
#use text entry reference to seek to actual text and print file/proces
+s info
seek $infh, $offset, 0;
print "\n\n$infh - size of file: $infhsize - Text is at offset: $a
+bc\n\n";
return $offset;
} ## end sub SeekToAbcOffset
sub SolveThisProblem {
my( $filename, $pointers ) = @_;
use autodie qw/ open close /;
open my( $infh ), '<', $filename;
binmode $infh;
my $offset = SeekToAbcOffset( $infh );
READER:
while( read( $FILE, my $by, 1 ) ) {
if( $by eq "\x00" ) {
my $pos = tell( $FILE );
my $decimal_value_pointer = $pos - $offset;
push @$pointers, sprintf( "%X", $decimal_value_pointer );
next READER;
} elsif( $byte =~ /ff/ ) {
last READER;
}
} ## end READER: while( read( $FILE, my $by...))
} ## end sub SolveThisProblem
__END__
See also perlquote and perlrebackslash because "\x00" is equal to chr(0), ie $by eq chr(0) | [reply] [d/l] [select] |
you guys are awesome as always :)
i will go back and revise my code with hopes it comes out this neat. BUT i need also to know how i can reopen each file and write these pointer values back. See, what this programs main goal is, is to fix another programs mess ups lol. This program i have written goes to text entry and gets the pointer value, which should be written in the upper half of the file and overwriting the incorrect pointer value. if i were to push all the pointers to the array, would it work right if i did a foreach my $line(@array) as to where i could open the files and re write the values in succesion?
OR better that than, i could push pointer to an array, and before closing the file, i could go ahead and do the foreach $line(@array) which would hopefully write the pointers as their correct offset. then once all pointers are written, i could clear the array and open next files and start again.
I guess my next question is, can i loop thru an array like that? and expect the outcome to be right? and apologies for taking so long to respong
| [reply] |
Well, theoretically the answer to three of your questions is yes, it's possible, if you code it correctly ;-)
Other than that, we'd need to see some example expected output and some of the code your questions are about. Please have a look at I know what I mean. Why don't you? (as well as the usual How do I post a question effectively?).
In general, you can open a binary file for editing via open my $fh, '+<:raw', $filename or die $!;
| [reply] [d/l] |
so when i come out of a loop like that, it will close the $FILE for me?
Yes, but only if you use my $FILE instead of our $FILE. The automatic close is explained in open (look for the term "scope").
| [reply] [d/l] [select] |
so when i come out of a loop like that, it will close the $FILE for me
Only insofar your filehandle is lexical (using my, not our, as already suggested), and is lexically scoped to that loop's block. So you'd better understand Perl scopes if you want to use this opportunity.
| [reply] [d/l] [select] |