in reply to Help Extract these lines

Your loop:

while ( <DATA> ) ...

Takes one line at a time.

print "Line is:", $_, " END\n";

Will give you a hint as to what's going on:

Line is:id: xx-ada-qwebasd, END Line is:name: telphone, END Line is:id: fasda-asd-123123-fkja123a, END Line is:name: car, END Line is:id: 97f921-a312-fas2, END Line is:name: ball, END

What you need to do is grab two lines at a time - there's various ways of doing that. Off the top of my head, reading a second line (if fixed format), or use of grep. I'll have a thought and see if I can come up with something elegant

Replies are listed 'Best First'.
Re^2: Help Extract these lines
by Anonymous Monk on Jun 17, 2013 at 18:31 UTC
    I thought of using a range operator to grab the two lines. But I'm confused as to why it is not grabbing the two lines.

      Because the 'while' loop goes off first, populating $_ with one line of DATA. Your range operator then applies to that, which is why it doesn't work.

      #!/usr/bin/perl use strict; use warnings; my %rec; while ( my $line = <DATA>) { $line .= <DATA>; $line =~ s/\"//g; $line =~s/,//g; my ( $id, $name ) = ( $line =~ m/id: (\S+)\nname: (\S+)/mg ); print "$id = $name\n"; $rec{$id} = $name; } __DATA__ "id": "xx-ada-qwebasd", "name": "telphone", "id": "fasda-asd-123123-fkja123a", "name": "car", "id": "97f921-a312-fas2", "name": "ball",

      That I think does the trick. (Basically, grabs two lines in a go, but isn't ideal if your data structure is more complicated). I suspect there's something more clever you could do to parse a file and grab out pattern matching, but I think most of those would involve reading the file in a scalar context and reading the whole lot (which may be fine, but can go wrong with large files).