in reply to Re^4: Group __DATA__ lines in a while?
in thread Group __DATA__ lines in a while?

If you are interested in a more compact style, you could be writing your @sections loop as

section($tab, sub { for my $line (@$_) { heading($tab,$1,$2, { id => idify($2) }), next if $line =~ /^( +[1-6])\s+(.*)/; line($tab,$line), next if $line =~ /^< +/; line($tab,"<$line>"), next if $line =~ /^[ +bh]r$/; paragraph($tab,$line); } }) for @sections;

I like this for its tabular look where the action is on the left and the condition on the right. It also avoids the chain of elsifs. The danger is that it becomes difficult to stay the course when the actions become more complex...

Replies are listed 'Best First'.
Re^6: Group __DATA__ lines in a while?
by Lady_Aleena (Priest) on Oct 24, 2013 at 04:48 UTC

    hdb, it got a little more complicated than it was. Here is the the most recent version. There are a few more elsif statements. I am almost content with it now. :)

    sub story { my ($source,$magic) = @_; my $tab = 3; my $inc = 0; my @sections; my @toc; while (my $line = <$source>) { chomp($line); next if !$line; if ($line =~ /^2/) { $inc++; my ($number,$text) = split(/ /,$line,2); push @toc, anchor(textify($text), { href => '#'.idify($text) }); } push @{$sections[$inc]}, $line; } $inc = 0; for my $section (@sections) { if ($section) { section($tab, sub { for my $line (@{$section}) { if ($line =~ m/^</) { line($tab,$line); } elsif ($line =~ /^& /) { my ($symbol,$magic_word) = split(/ /,$line,2); $magic->{$magic_word}->(); } elsif ($line =~ /^[1-6]\s/) { my ($heading,$text) = split(/ /,$line,2); my $id = idify($text); heading($tab,$heading,$text, { id => $id }); } elsif ($line =~ /^bq\s/) { my ($symbol,$text) = split(/ /,$line,2); blockquote($tab,$text); } elsif ($line =~ /^[bh]r$/) { line($tab,"<$line>"); } else { paragraph($tab,$line); } } }); } if ($inc == 0 && @toc > 3) { section($tab, sub { list($tab, 'u', \@toc, { class => 'two' }); }, { class => 'contents'} ); } $inc++; } # paragraph($tab,"written by $root_user", { class => 'author' }); }
    No matter how hysterical I get, my problems are not time sensitive. So, relax, have a cookie, and a very nice day!
    Lady Aleena
Re^6: Group __DATA__ lines in a while?
by Lady_Aleena (Priest) on Nov 10, 2013 at 23:16 UTC

    I just want you to know, I did it your way when I made a handful of additions. You were right about the elsifs spiraling out of control. Here is the updated version. :)

    sub story { my ($source,$magic) = @_; my $tab = 3; my $inc = 0; my @sections; my @toc; while (my $line = <$source>) { chomp($line); next if !$line; if ($line =~ /^2/) { my ($number,$text) = split(/ /,$line,2); push @toc, anchor(textify($text), { href => '#'.idify($text) }); $inc++; } push @{$sections[$inc]}, $line; } $inc = 0; for my $section (@sections) { if ($section) { section($tab, sub { for my $line (@{$section}) { line($tab, $line), next if $line =~ /^</; line($tab, "<$line>"), next if $line =~ /^[bh]r$/; $magic->{$1}->(), next if $line =~ /^&\s+(.*)/; blockquote($tab, $1), next if $line =~ /^bq\s(.*)/; item($tab, $1), next if $line =~ /^\*\s(.*)/; item($tab, $2, { value => $1 }), next if $line =~ /^\*(\d+)\ +s(.*)/; heading($tab, $1, $2, { id => idify($2) }), next if $line + =~ /^([1-6])\s+(.*)/; paragraph($tab, $line, { class => 'author' }), next if $line + =~ /^by /; paragraph($tab, $line); } }); } if ($inc == 0 && @toc > 3) { section($tab, sub { my $class = @toc > 25 ? @toc > 50 ? 'four' : 'three' : 'two'; my $style = @toc > 50 ? 'font-size:smaller' : undef; list($tab, 'u', \@toc, { class => $class, style => $style }); }, { class => 'contents'} ); } $inc++; } # paragraph($tab,"written by $root_user", { class => 'author' }); }
    No matter how hysterical I get, my problems are not time sensitive. So, relax, have a cookie, and a very nice day!
    Lady Aleena

      Thanks for letting me know.

      Are these scripts called every time someone visits your website? Or are they part of the build process of the website?

      If your scripts get ever more complicated it might make sense to cache the resulting HTML files rather than generating them every time dynamically. The script could check whether the HTML file is older than the input file and only then generate output.

        Each script is loaded into the browser every time. Storing the HTML would be huge. I came to perl to make my site as teeny-weeny as possible, and I have succeeded. Since I don't have to store so much HTML (some inline elements remain to be coded out), my site has gone from 10 MB (the max allowed on one web server) to a mere 2.5 MB with a lot more content and data! All of those HTML tags take up a lot of space.

        No matter how hysterical I get, my problems are not time sensitive. So, relax, have a cookie, and a very nice day!
        Lady Aleena