Wow, Johns, thanks for the tips...  I'm going to have to study that map
command very closely.  Either way you've answered my question, thanks!

Only one thing to add--  you ask:

>>    chomp $newtxt;
>>    print $newtxt, "\n";
> 
> Why remove "\n" in one line and then add it back on the next line?

I did this because I want to make sure I end with a "\n", but I don't want
an extra one if one is already there.  I guess I could've also done a:

$newtxt =~ s/([^\n])$/$1\n/;

... but the above seemed clearer.  Is that not a good reason?

- B




> 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


-- 
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