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:
Post a Comment