http://qs321.pair.com?node_id=92897


in reply to My day with Damian Conway

I never saw any great problem with this:

sub Unindent { my $unindent = shift; $unindent =~ s/^[ \t]+//gm; return $unindent; } ... $message = Unindent <<" MESSAGE"; A fatal die was trapped by the $scriptname die nice routine: Time: $datetime List name: $list_name Script name: $scriptname Package: $package File: $file Line Number: $line Error Message: $message MESSAGE print $message; ....

cheers

tachyon </code>

Replies are listed 'Best First'.
Unindenting here-docs (Re: My day with Damian Conway)
by tye (Sage) on Jan 11, 2002 at 21:09 UTC

    Yes, that is fine. The problems come in when you want to strip some of the leading whitespace:

    print unindent( <<" END" ); Usage: $0 [flags] [args] Gropples the snarflog. -v Verbose. -t mode Mode of groppling to use. "mode" can be: fast Minimize execution time. hard Maximize decryption time. wide Minimize alphabet size. Do not use on UTF8 files. END
    Any attempt to write an unindent() for the above will run into problems in the face of 1) editors that insert tabs when maintenance work modifies the text, and 2) people who don't agree on how far apart tabstops should be set.

    The only solution I've found that I like goes something like this:

    sub unindent { s/^\s*\S//gm } print unindent( <<" END" ); .Usage: $0 [flags] [args] .Gropples the snarflog. . -v Verbose. . -t mode Mode of groppling to use. "mode" can be: . fast Minimize execution time. . hard Maximize decryption time. . wide Minimize alphabet size. .Do not use on UTF8 files. END

            - tye (but my friends call me "Tye")
      sub unindent { my $str = shift; (my $s) = $str =~ m/^(\s+)/; $str =~ s/^$s//gm; return $str; }

      This will look at the first line and extract that much leading whitespace from every line so does what you want without the .

      cheers

      tachyon

      s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print

        Um, no, you missed the whole point.

        print unquote( <<" TEST" ); First line Second line Third line Fourth line TEST
        Tell me what that should produce and I'll tell you what my tab stops were set to and that you were wrong. :) (And don't be fooled by how your browser happens to display that code.)

                - tye (but my friends call me "Tye")