Bryan Harris wrote:
> 
> Is there a way to interpolate strings that the user enters?
> 
> I'm writing a filter (pipe-cat = pat) that lets you add text to the front or
> end of some piped data:
> 
> echo "2" | pat "1" - "3\n"
> 
> The "-" represents the piped data, so the above should print:
> 
> % echo "2" | pat "1\n" - "3\n"
> 1
> 2
> 3
> %
> 
> But here's what I get:
> 
> % echo "2" | pat "1" - "3\n"
> 1\n2
> 3\n%
> 
> How can I interpolate the "\n" that the user entered?

$string =~ s/\\n/\n/g;


> Here's my code (disclaimer:  I'm still very much a novice at this stuff).
> 
>    #! /usr/bin/perl -w
> 
>    $newtxt = "";
>    while ($_ = shift) {
>      if ($_ eq "-") {
>            open(FILE, "-") || die("Couldn't read from STDIN: $!\n");
>            undef $/;
>            $newtxt .= <FILE>;
>            close(FILE);

Since you are reading from STDIN and it is already open:

     if ( $_ eq '-' ) {
           local $/;
           $newtxt .= <STDIN>;


>        }
>        else { $newtxt .= $_; }
>    }
>    $/ = "\n";

If you had used 'local $/;' above then you wouldn't have to set it here.


>    chomp $newtxt;
>    print $newtxt, "\n";

Why remove "\n" in one line and then add it back on the next line?


>    exit(0);
> 
> I'm also very much open to tips from the pros on this stuff.

You could do it something like this:

#!/usr/bin/perl
use warnings;
use strict;

my %escapes = (
    '\\' => "\\",
    n    => "\n",
    t    => "\t",
    f    => "\f",
    b    => "\b",
    r    => "\r",
    );

my $newtxt = join '', map {
        s/\\([\\ntfbr])/$escapes{$1}/g;
        local $/;
        $_ eq '-' ? <STDIN> : $_
        } @ARGV;

print $newtxt;
exit 0;

__END__



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to