Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Special handling of Perl range operator

I am parsing very huge file which is having content similar to:

File input_text.txt:

hello abc
0] Framework table
f1
f2
f3
0] number of entries
randomtext1
0] Test table
t1
t2
t3
0] number of entries
randomtext2
1] Test table
1] Same as framework page table
randomtext3
2] Test table
t4
t5
t6
2] number of entries
randomtext4
3] Test table
t4
t5
t6
3] number of entries
4] Test table
4] Same as framework page table
randomtext5
1] Framework table
f4
f5
f6
1] number of entries
randomtext6
foofoobar

From this file, I want to extract table entries as follows, which should be expected output:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Here is your framework table:
f1
f2
f3
f4
f5
f6

Here is your test table:
t1
t2
t3
1] Same as framework page table
t4
t5
t6
t4
t5
t6
4] Same as framework page table

I cannot read the whole file in an array due to its large size and number of entries. I have written following code using range operator, but it is showing unexpected result:

    $input_log_file = "input_text.txt";
    open(LOG_FILE, "$input_log_file") or die("Can't open $input_log_file to read. \n");
    while (<LOG_FILE>)
    {
        if (/Framework table/ .. /number of entries/)
        {
            next if (/Framework table/ || /number of entries/);
            push @framework, $_;
        }
        if (/Test table/ .. /Same as framework page table/)
        {
           next if (/Test table/);
           push @test, $_;
        }
        # if(/Same as framework page table/)
        # {
        #   next;
        # }
        if (/Test table/ .. /number of entries/)
        {
           next if (/Test table/ || /number of entries/);
           push @test, $_;
        }
       
    }
    
    close(LOG_FILE);

    print "\nHere is your framework table:\n";
    print @framework;
    print "\nHere is your test table:\n";
    print @test;

I am not able to understand, how to ‘break’ the range operator to parse the file successfully.

Any help please?

>Solution :

Don’t test for two different ranges with the same starting expression. Merge them into one.

    while (<LOG_FILE>) {
        if (/Framework table/ .. /number of entries/)
        {
            next if /Framework table|number of entries/;
            push @framework, $_;
        }
        if (/Test table/ .. /Same as framework page table|number of entries/)
        {
           next if /Test table|number of entries/;
           push @test, $_;
       }
    }

Also, instead of /Regex1/ || /Regex2/, use the regex alternative /Regex1|Regex2/.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading