grab pattern from start and end block -- input record separator

usage of local $/   or  $INPUT_RECORD_SEPARATOR 
INPUT script 

start
name:agnello
dob:2 april
address:123 street
end
start 
name:babit
dob:13 april
address:3 street
end
start 
name:ganesh
dob:1 april
address:23 street
end


i need to get the OUTPUT data in the following format 

name:agnello, dob:23 april ,address:123 street
name:babit,dob:13 april,address:3 street
name:ganesh,dob:1 april,address:23 street

i came up with this , is there a better way to do this : 
===============================
#!/usr/bin/perl 

use strict;
use warnings;

open my $FH , 'data.txt' or die "cannot open file $!";
read $FH, my $string, -s $FH;
close($FH);


my @string = split ( /start/ , $string ) ;

my %data;

foreach  ( @string ) {
chomp;
next if /^$/ ;
s/^ $//g;
s/end//;

my @data = split(/\n/, "$_");
  foreach my $i (@data) {
   print "$i,";

     }
print "\n";
}


alternate script is : 
========================
#!/usr/bin/env perl

use strict;
use warnings;

# --------------------------------------

use charnames qw( :full :short   );
use English   qw( -no_match_vars );  # Avoids regex performance penalty

# --------------------------------------
sub read_record {
  my $record_fh = shift @_;

# all records are from "start\n" to "end\n"
  local $INPUT_RECORD_SEPARATOR = "end\n";
  my $record = <$record_fh>;

# $record undef at end of file
  if( defined $record ){

# removes "end\n"
    chomp $record;

print "$record";
exit ;
# removes "start\n"
    $record =~ s{ \A start \s* }{}msx;
  }

  return $record;
}

# --------------------------------------
while( my $record = read_record( *DATA )){

# remove trailing "\n"
  chomp $record;

# replace field separators with commas
  $record =~ s{ \n+ }{,}gmsx;
# display the record
  print "$record\n";
}


__DATA__
start
name:agnello
dob:2 april
address:123 street
end
start
name:babit
dob:13 april
address:3 street
end
start
name:ganesh
dob:1 april
address:23 street
end










No comments:

Other Articles

Enter your email address: