in reply to how to modify foreach

If I understand both you and the code correctly then you just want to keep one (the first) matched line from @save:

my $keep = ''; foreach (@save){ $_ = "" unless ($_ =~ m/"ENABLED","OLTP",/ && $_ =~m/^GREP +/ ); $_ = "" if ($_ =~m/SYSMAN/|| m/SYS/); if ($_) { $keep = $_; last; } } open(FILE, ">>OLTP.txt") or die ("error occured while opening +file OLTP.txt"); print FILE $keep if $keep; close(FILE);

Obviously untested since we don't have your data. You might be better off refactoring the script but hopefully this will get you started. HTH.

Replies are listed 'Best First'.
Re^2: how to modify foreach
by Anonymous Monk on Jun 08, 2018 at 09:19 UTC

    Hello Hippo and many thanks for your help. here is what i have done : replace

    ##merge data after filtering sub singlefile { my ( $file,$out) = @_; #open file open(FILE, $file) or die ("error occured while opening file"); #create list from file my @save = <FILE>; close(FILE); #empty table rows which do not meet criteria foreach (@save){ $_ = "" unless ($_ =~ m/"ENABLED","OLTP",/ && $_ =~m/^GREP/ ); $_ = "" if ($_ =~m/SYSMAN/|| m/SYS/); chomp $_; } #open output file, add data, close open(FILE, ">>OLTP.txt") or die ("error occured while opening file + OLTP.txt"); foreach (@save){ print FILE $_."\n" if ($_); } close(FILE); }

    by

    ##merge data after filtering sub singlefile { my ( $file,$out) = @_; #open file open(FILE, $file) or die ("error occured while opening file"); #create list from file my @save = <FILE>; close(FILE); #empty table rows which do not meet criteria my $keep = ''; foreach (@save){ $_ = "" unless ($_ =~ m/"ENABLED","OLTP",/ && $_ =~m/^GREP +/ ); $_ = "" if ($_ =~m/SYSMAN/|| m/SYS/); if ($_) { $keep = $_; last; } } open(FILE, ">>OLTP.txt") or die ("error occured while opening +file OLTP.txt"); print FILE $keep if $keep; close(FILE); }

    and the result is that i got only a file with only the header "User script,Serveur Name,Instance Name,Date of script,Serveur Name2,Instance.... and nothing else. if you want to give me a mail, i can send you some data to check. thank again OliverR

      It looks like you may have copy/pasted the line contituation character +

      $_ = "" unless ($_ =~ m/"ENABLED","OLTP",/ && $_ =~m/^GREP +/ );

      Should be one line

                  $_ = "" unless ($_ =~ m/"ENABLED","OLTP",/ && $_ =~m/^GREP/ );

      Have a read of File::Find

      poj

        you make my day !!! thank you everyone for your help and have a nice week end
        OliverR

      if you want to give me a mail, i can send you some data to check.

      That's not how we do things here. :-)

      Have a read of both SSCCE and How to ask better questions using Test::More and sample data. If you can provide your code and a small set of data along those lines I've no doubt that we'll be able to see where you are going wrong.

        oki, here is a set of DATA :

        in a file named xxxoptions.csv i have this :

        GREPME>>,xxxxx,BP5,2017-11-27_22:36:57,xxxxx,BP5,ADVANCED_COMPRESSION,TABLE_COMPRESSION,101189,count,DBA_TABLES,SYS,/BIC/D1002561,,"ENABLED","OLTP",
        GREPME>>,xxxxx,BP5,2017-11-27_22:36:57,xxxxx,BP5,ADVANCED_COMPRESSION,TABLE_COMPRESSION,101189,count,DBA_TABLES,SAPABW,/BIC/D1002562,,"ENABLED","OLTP",
        GREPME>>,xxxxx,BP5,2017-11- 27_22:36:57,xxxxx,BP5,ADVANCED_COMPRESSION,TABLE_COMPRESSION,101189,count,DBA_TABLES,SAPABW,/BIC/D1002566,,"ENABLED","OLTP",
        GREPME>>,xxxxx,BP5,2017-11-27_22:36:57,xxxxx,BP5,ADVANCED_COMPRESSION,TABLE_COMPRESSION,101189,count,DBA_TABLES,SYS,/BIC/D100256P,,"ENABLED","OLTP",

        Here, line 2 and 3 match with my criteria (because others are SYS)

        In a second file named YYYoptions.csv i have this :

        GREPME>>,yyyyy,IP5,2017-11-27_22:40:08,yyyyy,IP5,ADVANCED_COMPRESSION,TABLE_COMPRESSION,80440,count,DBA_TABLES,SAPISU,KWNPHRE,,"ENABLED","OLTP",
        GREPME>>,yyyyy,IP5,2017-11-27_22:40:08,yyyyy,IP5,ADVANCED_COMPRESSION,TABLE_COMPRESSION,80440,count,DBA_TABLES,SAPISU,KWNPHREPR,,"ENABLED","OLTP",
        GREPME>>,yyyyy,IP5,2017-11-27_22:40:08,yyyyy,IP5,ADVANCED_COMPRESSION,TABLE_COMPRESSION,80440,count,DBA_TABLES,SYSTEM,KWNPHRI,,"ENABLED","OLTP",

        Here, lines 1 and 2 match with my criteria

        so , the result expected would be oltp.txt with header:

        User script,Serveur Name,Instance Name,Date of script,Serveur Name2,Instance Name2,ADVANCED_COMPRESSION~HEADER,TABLE_COMPRESSION~HEADER,2,count,DATA_DICTIONARY_VIEW,TABLE_OWNER,TABLE_NAME,PARTITION_NAME,COMPRESSION,COMPRESS_FOR

        and then my lines (1 per file, the first one who match with criteria)

        GREPME>>,xxxxx,BP5,2017-11-27_22:36:57,xxxxx,BP5,ADVANCED_COMPRESSION,TABLE_COMPRESSION,101189,count,DBA_TABLES,SAPABW,/BIC/D1002562,,"ENABLED","OLTP"

        GREPME>>,yyyyy,IP5,2017-11-27_22:40:08,yyyyy,IP5,ADVANCED_COMPRESSION,TABLE_COMPRESSION,80440,count,DBA_TABLES,SAPISU,KWNPHRE,,"ENABLED","OLTP",

        thank again

        OliverR