use strict; use warnings; use Fcntl; use Tie::File; use Carp; use Data::Dumper; #use Benchmark; #variables #----------------------- my $test_file =$ENV{FILE_NAME}; unless (defined $test_file) { croak "No filename in environment (FILENAME)\n"; } my $path = $ENV{FILE_PATH}; unless (defined $path ) { croak "No path directory in environment (FILE_PATH)\n"; } my $page_begin = '^PAGE_BEGIN$'; my $mark1 = '%%DELETE_PAGE%%'; #delete a complete page my @tied_metafile; #MAIN #----------------------- #my $anfang = new Benchmark; #BENCHMARK BEGIN sysopen METAFILE, $test_file, O_RDWR or croak "Can't open $test_file: $!"; #open metafile for read/write tie @tied_metafile, 'Tie::File', \*METAFILE; my $stored_indexes_ref = search_mark(); #do sub 1 delete_marked ( $stored_indexes_ref ); #do sub 2 untie @tied_metafile; close METAFILE or croak "Can't close $test_file: $!"; #close metafile #my $ende = new Benchmark; #BENCHMARK END #my $vergangen = timediff ($ende, $anfang); #BENCHMARK #print "Vergangene Zeit: ", timestr ($vergangen), "\n"; #BENCHMARK #SUBS #----------------------- sub search_mark { my $index = 0; my @stored_indexes; #a helping array with relevant indexes foreach my $line ( @tied_metafile ) { if ( $line =~ m/$page_begin/) { unshift( @stored_indexes, $index ); } if ( $line =~ m/$mark1/) { my @mark1_match_index; #a helping array with index of mark as first element unshift( @mark1_match_index, $index ); unshift( @stored_indexes, \@mark1_match_index ); #store reverse } $index++; } unshift( @stored_indexes,$#tied_metafile+1); #necessary if last page should be deleted return \@stored_indexes; } sub delete_marked { my @stored_indexes_ref = shift; my $index = 0; print Dumper @stored_indexes_ref; foreach ( @$stored_indexes_ref ){ if ( ref(@$stored_indexes_ref[$index]) eq 'ARRAY') { my $del_from = @$stored_indexes_ref[$index+1]; my $del_until = @$stored_indexes_ref[$index-1]; my $range = $del_until - $del_from; print "delete from line : ", $del_from, "\n"; print "delete until line: ", $del_until, "\n"; print "Range : ", $range, "\n"; splice( @tied_metafile, $del_from, $range); #delete last lines first } $index++; } } exit 0