in reply to I want to write a function, you call it ,it will return one matched record each time!
G'day dwslovedh,
Welcome to the monastery.
I read your post which looked like this:
----- OP's original post starts ----------------------------
Hi there, I want to write a function that can return one record from a file ervery time, for example, the records in input.txt are like this:
_________________________ 12 dd DH: mm struct{ int a; char b; m1 struct { int c; int d; }; m2 struct { int e; int f; }; } 2 dfdkk df dd } 1 LOCAL_PARAM: ssi_struct { ref = 0; header = { req = 0xa; }; } DH: mm struct{ int a; char b; m1 struct { int c; int d; }; } ____________________________________
I want to use a function to extract the records starting with "DH:" each time I call it,like this $record = get_record("input.txt"); So I must remember the position of the file last read, and continue to extract the record. I use the seek and tell, but it didn't work. Here is the script:
sub get_record_from_file { my $filein = shift; my $regex = shift; my $pos = shift open FILEIN, "<$filein" or die "!$\n"; seek(FILEIN, $pos, 0); my $in_block = 0; my $last = "}"; my @array = {}; foreach my $line (<FILEIN>) { if ($line =~ /$regex/) { $in_block = 1; } if ($in_block) { push @array, $line; } if ($line =~ m/$last$/) { $in_block = 0; } } $pos = tell FILEIN; return (\@array, $pos); } $record = get_record_from_file("input.txt","DH:",0);
Can anyone help? Thanks:)
----- OP's original post ends ------------------------------
I came up with a solution and clicked on the "Comment on" link to post it. I then found your posting had completely changed to this:
Please do not do this. If you want to cancel something you've posted, put <strike>...</strike> tags around the whole block of markup; add replacement text if that's appropriate; then add an Update: section which explains the changes you've made.
Here's my solution to your original problem:
#!/usr/bin/env perl use strict; use warnings; my $sep = '=' x 60 . "\n"; (my $dh_file = $0) =~ s/pl$/dat/; open_dh($dh_file); while (1) { print 'Get next DH record (y/n): '; my $reply = <>; if ($reply =~ /^y/i) { print "Next DH record:\n"; my $dh_record = read_dh(); print "$sep$dh_record\n$sep"; if (eof_dh()) { print "No more DH records!\n"; last; } } else { print "Stopped reading DH records.\n"; last; } } close_dh(); { my $dh_fh; sub open_dh { my $dh_file = shift; open $dh_fh, '<', $dh_file or die "Can't read $dh_file: $!"; my $discard = read_dh(); return; } sub read_dh { local $/ = 'DH: '; my $dh_trim_re = qr{\A \s* (.*?) \s* (?: DH: \s )? \z}msx; my $dh_record = <$dh_fh>; $dh_record =~ s/$dh_trim_re/$1/; return $dh_record; } sub close_dh { close $dh_fh; return; } sub eof_dh { return eof $dh_fh; } }
Here's a sample run:
$ pm_get_multi_rec.pl Get next DH record (y/n): y Next DH record: ============================================================ mm struct{ int a; char b; m1 struct { int c; int d; }; m2 struct { int e; int f; }; } 2 dfdkk df dd } 1 LOCAL_PARAM: ssi_struct { ref = 0; header = { req = 0xa; }; } ============================================================ Get next DH record (y/n): y Next DH record: ============================================================ mm struct{ int a; char b; m1 struct { int c; int d; }; } ============================================================ No more DH records!
-- Ken
|
|---|