lollipop7081 has asked for the wisdom of the Perl Monks concerning the following question:

Ok, I posted on here a few days ago concerning a homework assignment. Thanks a lot to everyone who's helped!

So now I'm moving forward and I need to center the section headings in this .txt file i've got. Here's part of the text that needs to be formatted:

====================================================================== +======= SECTION 35 - BUILDING VIM FROM SOURCE 35.1. How do I build Vim from the sources on a Unix system? For a Unix system, follow these steps to build Vim from the sources: - Download the source and run-time filles archive (vim-##.tar.bz2) fro +m the ftp://ftp.vim.org/pub/vim/unix directory. - Extract the archive using the bzip2 and tar utilities using the com +mand: $ bunzip2 -c <filename> | tar -xf -


Now, to do the other parts of the project I needed to read it into an array and then chop the \n characters so it's one long string now.

There are a total of 37 Sections and every section heading has the row of = = = = = = before it. So, to center the section headings I did the following RE:

#!/usr/bin/perl # # Reformat the project3Data.txt file to make more accesible use strict; use warnings; my $file = '/u/home/jhart2/perl/project3Data.txt'; # Name the fil +e open(INFO, $file); # Open the file for input my @Project3 = <INFO>; # Read it into an array my $NoOfCharsPerLine = 80; my $NoOfLinesPerPage = 100; my $RightMargin = 7; my $header = 3; my $footer = 5; my @argument; my $width = 80; my $heading; chop(@Project3); # Remove \n characters my $string = "@Project3"; # Define the string my @chapters = split (/===+/, $string); # Split the string while (<INFO>) { if (/(SECTION)(\s)(\d+)(.*)(\3)(\.1\.)(.*)/) { $heading = $1.$2.$3.$4; print "$heading" x (($width-length($heading))/2); + # Center the heading } } close(INFO); # Close the file


...and here's the problem, it doesn't print anything. I know it has to be something simple, but I can't find it. Any suggestions? Thanks!

Replies are listed 'Best First'.
Re: Printing Help
by jwkrahn (Abbot) on May 16, 2006 at 00:21 UTC
    my @Project3 = <INFO>;
    Reads the entire file and the next time you use <INFO>:
    while (<INFO>)
    It will return eof() so the loop will not run. You need to either close and open the file again or use seek to return the filehandle to the beginning of the file.
Re: Printing Help
by GrandFather (Saint) on May 16, 2006 at 00:37 UTC

    You have confused the $string version and the file version of the data that you are editing. Probably the easiest thing to do is to use @Project like this:

    #!/usr/bin/perl use strict; use warnings; my @Project = <DATA>; chomp (@Project); # chomp is a little more selective than chop! It rem +oves $/ my $width = 80; my $heading; for (@Project) { if (/(SECTION\s\d+.*)/) { print ' ' x (($width-length($1))/2); # Center the headin +g } print "$_\n"; } __DATA__ ====================================================================== +======= SECTION 35 - BUILDING VIM FROM SOURCE 35.1. How do I build Vim from the sources on a Unix system? For a Unix system, follow these steps to build Vim from the sources: - Download the source and run-time filles archive (vim-##.tar.bz2) fro +m the ftp://ftp.vim.org/pub/vim/unix directory. - Extract the archive using the bzip2 and tar utilities using the com +mand: $ bunzip2 -c <filename> | tar -xf -

    Prints:

    ====================================================================== +======= SECTION 35 - BUILDING VIM FROM SOURCE 35.1. How do I build Vim from the sources on a Unix system? For a Unix system, follow these steps to build Vim from the sources: - Download the source and run-time filles archive (vim-##.tar.bz2) fro +m the ftp://ftp.vim.org/pub/vim/unix directory. - Extract the archive using the bzip2 and tar utilities using the com +mand: $ bunzip2 -c <filename> | tar -xf -

    Note that the sample code avoids needing an external file by using __DATA__. This is a trick worth cultivating for posting questions here.


    DWIM is Perl's answer to Gödel