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

Perl: Read Source File, Set Write Destination filename from read source file content, Read source file for all C format comments containing a keyword

My overall perl script is trying to operate as follows:

  • Read source file for content
  • Find regex match and use that match for Destination filename
  • Open new Destination filename
  • Find regex match for C format comments /* */ that contain a keyword, i.e. abcd
  • Write string matches found to destination filename
#!/usr/bin/perl
use warnings;
use strict;

my $src = 'D:\\Scripts\\sample.c';
my $fileName;

# open source file for reading
open(SRC,'<',$src) or die $!;

while(my $row = <SRC>){
    if ($row =~ /([0-9]{2}\.[0-9]{2}\.[0-9]{3}\.[a-z,0-9]{2}|[0-9]{2}\.[0-9]{2}\.[0-9]{3}\.[a-z,0-9]{3})/){
        $fileName = $1;
    }
}

my $des = "D:\\Scripts\\" . $fileName . ".txt";

# open destination file for writing
open(DES,'>',$des) or die $!;

print("copying content from $src to $des\n");

while(my $row = <SRC>){
    if ($row =~ /(\/\*.*abcd.[\s\S]*?\*\/)/){
        print DES $1;
    }
}

# always close the filehandles
close(SRC);

close(DES);
print "File content copied successfully!\n";

I am running this in Windows 10 command line with Perl 5.32.1. My problem is I am not getting any content writing to the destination file. The file gets created but no content gets written to it. When I change:

print DES $1; -> print "$1\n";

I get no content coming out the command line window either. When I move the entire second if statement to be nested underneath the first while loop after the 1st if statement I get output to the command line. But I cannot keep the 2nd if statement there because I want it to write to the destination file.

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

>Solution :

As the $src file is read the first time the SRC filehandle reaches the file end. So when you try to read the file again, there is nothing to read (and it won’t tell you).

After the first read is done reposition the filehandle to the beginning of the file, seek SRC, 0, 0;.

There are nice symbolic constants that can be used with seek, see Fcntl


Note: it is just better to use lexical filehandles than typeglobs, like

open my $src_fh, '<', $src_file  or die $!;

See a comment on it in perldata, and search SO posts (here is one for example).

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