Nyimi Jose wrote: > > IMHO > $string =~ /.{1,$len}/g; > Is the best suggestion i have seen so far ;) > > I have an other request : "code review" :-) > Below is my final code. > I'm sure that you guys will find > Some better style to write it ... > > #!/usr/local/bin/perl -w > use strict; > #------------------ > #Global variables > #------------------ > my $group_len=64; > my $index_len='A1'; > my $name_len='A6'; > my $way_len='A3'; > my $delim_len='x1'; > my $meas_len='A5'; > my $nof_meas=9; > #------ > #Main > #------ > my $file=$ARGV[0]; > open(FH,$file) || die "can not open $file : $! \n"; > > while(my $line=<FH>){ > next if $. < 3; > > my($date,$dummy,$str)=$line=~/(\d{2}-\d{2}-\d{4}:\d{3})\s+(\d{2})(.+)/; > for( &split_len($str,$group_len) ){ > print $date."\t", join( "\t",&get_fields($_) ),"\n"; > } > } > close(FH); > #------------ > #Subroutines > #------------ > sub split_len{ > my ($str, $len) = @_; > $str =~ /.{1,$len}/g; > } > > sub get_fields{ > my($str)[EMAIL PROTECTED]; > my $format="$index_len $name_len $way_len"; > $format.=" $delim_len $meas_len" x $nof_meas; > unpack($format,$str); > }
Well you did ask :) How about this. Cheers, Rob use strict; use warnings; use constant GROUP_LEN => 64; use constant INDEX_LEN => 1; use constant NAME_LEN => 6; use constant WAY_LEN => 3; use constant DELIM_LEN => 1; use constant MEAS_LEN => 5; use constant NOF_MEAS => 9; my $format = join ' ', map "A$_", ( INDEX_LEN, NAME_LEN, WAY_LEN, (DELIM_LEN, MEAS_LEN) x NOF_MEAS ); { local @ARGV = $ARGV[0]; while (<>) { next if $. < 3; my ($date, $str) = / (\d{2}-\d{2}-\d{4}:\d{3}) \s+ \d\d (.+) /x; foreach ( split_len ($str, GROUP_LEN) ) { print join ("\t", $date, unpack $format, $str), "\n"; } } } sub split_len{ my ($str, $len) = @_; $str =~ /.{1,$len}/g; } -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]