I would like to use
myscript.pl targetfolder/* > result.csv
to grep some number from multiple ASCII files.
The data table is like
| 44.2 | 3123.7 | 3123 |
+--------+--------+--------+
--> this is the end of data table is like
myscript.pl
#!/usr/bin/env perl
use warnings;
use strict;
use Data::Dumper; # for debugging
$Data::Dumper::Useqq=1;
#####start######
Title1();
Title2();
print "
";
#####Grep#######
foreach my $currentfile (@ARGV) { # ARGV is the target files list
print Dumper($currentfile); # debug
open my $filehanlder, '<', $currentfile or die "$currentfile: $!";
while ($r <= $#fswf) { #judge end of the open file
Value1();
Value2();
Print1();
Print2();
print "
";
$r++;
} #go next line output
Close $filehanlder;
}
#####sub#######
sub Title1 {
print "title1,title2";
}
sub Title2{
print "title5,title6,title7,title8";
}
sub Value1 {
my ($line);
while ($line = <$filehanlder>)) {
if ($line =~ /^|sMachine:(S+)s+Release:(S+)s+/) {
our ($machine) = $1;our ($sw) = $2;
}
}
}
sub Value2 {
my ($line);
while ($line = <$filehanlder>)) {
if ($line =~ /^|sProductionsResults+|s(S+)s+|/) {
next if 1..4;
my (@b) = "";
$r = 1
@result1 = @result2 = @result3 = @result4 = "";
while ($line !~ /+-/) {
chomp $line;
@b = split / *| */, $line;
our ($result1[$r]) = $b[1];
our ($result2[$r]) = $b[2];
our ($result3[$r]) = $b[3];
our ($result4[$r]) = $b[4];
$r++;
$line = (<$filehanlder>);
@b = "";
}
}
}
}
##I need a value as file counter, but not sure where to put it.
Sub Print1 {
print "$machine,$sw,"; # this keeps same cross lines from same file
}
Sub Print2 {
print "$result1[$r],$result2[$r],$result3[$r],$result4[$r],"; # change every line
}
#####sub#######
I don't know is this correct way to pass the $filehander to the subroutine and pass it throught different subroutine.
@Dave Cross: Thanks for pointing out. Exactly as you said. If I do loop in the subroutine, then one subroutine will go to the end of file, other subroutine get nothing. So shall I do while loop in the main ? Or shall I do open in every subroutines? so I can reset the filehandler to the 1st line of the file in every subroutine. If I have multiple @result as I grep in the sub values2 , how I can print them with the max lines number of these @result. For example, I have @result5[7] ,@result6[12], so I would like to print 12 lines record, the first 7 lines with result5 grep result, the last 5 line ,result5 column keeps empty and result6 column continue printout.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…