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

Hi Monks, I'm new to coding and I'm probably missing something obvious. I'm writing a script to place Markdown footer links under their respective paragraphs. So a file that looks like this:

This is a an example of [Markdown][1] footer links. I'm trying to use +[Perl][2] to organize them more coherently. But I'm getting too many newlines and I'm hoping the [PerlMonks][3] ca +n help. [1]: https://daringfireball.net/projects/markdown/ [2]: http://www.perl.org/ [3]: http://www.perlmonks.org/

Should look like this:

This is a an example of [Markdown][1] footer links. I'm trying to use +[Perl][2] to organize them more coherently. [1]: https://daringfireball.net/projects/markdown/ [2]: http://www.perl.org/ But I'm getting too many newlines and I'm hoping the [PerlMonks][3] ca +n help. [3]: http://www.perlmonks.org/

I want blank lines before and after each block of footer links, but instead, it's placing newlines between each array element, like this:

This is a an example of [Markdown][1] footer links. I'm trying to use +[Perl][2] to organize them more coherently. [1]: https://daringfireball.net/projects/markdown/ [2]: http://www.perl.org/ But I'm getting too many newlines and I'm hoping the [PerlMonks][3] ca +n help. [3]: http://www.perlmonks.org/

Here's the code I'm using:

#!/usr/bin/perl use strict; use warnings; use diagnostics; my $text; local $/; $text = <>; my @url_list = ($text =~ m/\[.*?\]\:.*/g); $text =~ s/\s+\[.*?\]\:.*//g; foreach my $line (split /^/, $text) { print $line; foreach ($line =~ m/\[.*?\]\[(.*?)\]/g) { my $link_number = $_; print "\n"; print grep(/(\[$link_number\]\:.*)/, @url_list); print "\n"; } }

I've tried chomp on all the relevant variables.

Replies are listed 'Best First'.
Re: Preventing Blank Lines Between Printed Array Elements
by NetWallah (Canon) on May 05, 2014 at 05:26 UTC
    This small modification makes your code work:
    foreach my $line (split /^/, $text) { print $line; my $separator_printed = 0; foreach ($line =~ m/\[.*?\]\[(.*?)\]/g) { my $link_number = $_; $separator_printed++ or print "\n"; print grep(/(\[$link_number\]\:.*)/, @url_list); print "\n"; } }

            What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against?
                  -Larry Wall, 1992

      Thanks NetWallah, that works perfectly.
Re: Preventing Blank Lines Between Printed Array Elements
by kcott (Archbishop) on May 05, 2014 at 07:11 UTC

    G'day immamanatee,

    Welcome to the monastery.

    You're reading your data an inordinate amount of times:

    • Read all input into $text using slurp mode ($/ = undef).
    • Read all data to generate @url_list.
    • Read all data to remove URL lines.
    • Read all remaining lines in an outer loop.
    • Read each line in an inner loop to generate link numbers.
    • Read the entire @url_list in every pass through the inner loop.

    As you're dealing with paragraphs, consider reading your input as paragraphs and processing it just once:

    • Read all input into an array using paragraph mode ($/ = '').
    • Create a hash, mapping link number to URL, using just the last paragraph of text.
    • Loop through all but the last paragraph, printing each paragraph and any associated footnotes.

    Here's an example using your data:

    #!/usr/bin/env perl -l use strict; use warnings; my @data = do { local $/ = ''; <DATA> }; my %urls = map { /^\[(\d+)/ => $_ } split /^/ => $data[-1]; print $data[$_], @urls{$data[$_] =~ /\[.*?\]\[(\d+)\]/g} for 0 .. $#da +ta - 1; __DATA__ This is a an example of [Markdown][1] footer links. I'm trying to use +[Perl][2] to organize them more coherently. But I'm getting too many newlines and I'm hoping the [PerlMonks][3] ca +n help. [1]: https://daringfireball.net/projects/markdown/ [2]: http://www.perl.org/ [3]: http://www.perlmonks.org/

    Output:

    This is a an example of [Markdown][1] footer links. I'm trying to use +[Perl][2] to organize them more coherently. [1]: https://daringfireball.net/projects/markdown/ [2]: http://www.perl.org/ But I'm getting too many newlines and I'm hoping the [PerlMonks][3] ca +n help. [3]: http://www.perlmonks.org/

    -- Ken

      Thanks Ken. My current sloppy code works OK, as the files are small, but I'll study your solution for the future.