[lug] Perl question: how to print embedded metacharacters

Chip Atkinson chip at pupman.com
Wed Nov 25 11:20:05 MST 2009


Thanks!  Yes, this is pretty much what I was looking for.  

I think the thing that I must not have been clear about was that the
metacharacters need to be interpreted at run time rather than compile
time.  

Thus someting like 

$kx = "abc\ndef";

gets evaluated at compile time so that the \n that you see in the text
editor is converted to 0x0D and stuffed into the string before it's
executed by the perl engine(?).

I was playing with eval but wasn't sure how to go about it.

Chip

On Wed, 25 Nov 2009, Matthew Beldyk wrote:

> So it's more clear what my script is doing (and fixing the error with
> the <<EOS thing (I initially wrote this with cat file|perl -ne
> 'blah'))
> 
> [10:10:25]            beldyk at chupacabra: ~
> $ ./tmp.pl
>  foo\nbar\tfoo\a\t
> *****************************
>  foo
> bar	foo	
> [10:10:26]            beldyk at chupacabra: ~
> $ cat tmp.pl
> #!/usr/bin/perl -w
> 
> my $str = ' foo\nbar\tfoo\a\t';
> 
> my $nstr;
> 
> eval("\$nstr =  \"$str\";");
> print $str;
> print "\n*****************************\n";
> print $nstr;
> 
> 
> 
> On Wed, Nov 25, 2009 at 10:07 AM, Matthew Beldyk <matt at beldyk.org> wrote:
> > More Perlically Correct: (security considerations aside, I basically
> > run the perl interpreter on the input and treat it as code again) Just
> > make sure you do lots of input checking with this program.
> >
> > [09:57:25]            beldyk at chupacabra: ~
> > $ cat tmp.pl
> > #!/usr/bin/perl -w
> >
> > my $str = <<EOS;
> > foo\nbar\tfoo\a\t
> > EOS
> >
> > my $nstr;
> >
> > eval("\$nstr =  \"$str\";");
> >
> > print $nstr;
> >
> > [09:57:33]            beldyk at chupacabra: ~
> > $ ./tmp.pl
> > foo
> > bar     foo
> >
> >
> >
> > On Wed, Nov 25, 2009 at 9:45 AM, Jeffrey Haemer
> > <jeffrey.haemer at gmail.com> wrote:
> >> It didn't take much thought to realize I should have written "Perlitically
> >> Correct."
> >>
> >> On Wed, Nov 25, 2009 at 9:41 AM, Jeffrey Haemer <jeffrey.haemer at gmail.com>
> >> wrote:
> >>>
> >>> Chip,
> >>> Yep, I'm using the shell to do the dirty work.
> >>> I don't doubt there are elegant, pure-Perl solutions.  I was only trying
> >>> to find something that would work for you, immediately, until someone else
> >>> volunteers a more PC (Perlishly Correct) way. :-)
> >>> On Wed, Nov 25, 2009 at 9:34 AM, Chip Atkinson <chip at pupman.com> wrote:
> >>>>
> >>>> Hmmmm... that does work, but isn't it using the bash printf rather than
> >>>> perl?  My concern is how fast it would be.  I can experiment there
> >>>> though,
> >>>> and it does work.
> >>>>
> >>>> Thanks for your help!
> >>>>
> >>>> Chip
> >>>>
> >>>> On Wed, 25 Nov 2009, Jeffrey Haemer wrote:
> >>>>
> >>>> > Chip,
> >>>> >
> >>>> > Okay.  Would something like this be good enough?
> >>>> >
> >>>> >
> >>>> > #!/usr/bin/perl
> >>>> >
> >>>> > while (<>) {
> >>>> >   $_=` printf "$_" `;
> >>>> >   print;
> >>>> > }
> >>>> >
> >>>> >
> >>>> >
> >>>> >
> >>>> > On Wed, Nov 25, 2009 at 9:06 AM, Chip Atkinson <chip at pupman.com> wrote:
> >>>> >
> >>>> > > No, unfortunately.
> >>>> > >
> >>>> > > The problem is that the script reads the string in from the command
> >>>> > > file,
> >>>> > > so I need to interpret the string before printing it.  Here's another
> >>>> > > example:
> >>>> > > ---------------------
> >>>> > > chip at chip-desktop:~$ cat try2.pl
> >>>> > > #!/usr/bin/perl
> >>>> > >
> >>>> > > #my $kw = 'abc\ndef';
> >>>> > > #my $nv = "${\($kw)}";
> >>>> > >
> >>>> > > while (<>) {
> >>>> > >  print "$_";
> >>>> > > }
> >>>> > > chip at chip-desktop:~$ echo 'abc\ndef' | ./try2.pl
> >>>> > > abc\ndef
> >>>> > > chip at chip-desktop:~$
> >>>> > > ---------------------------------
> >>>> > > In a sense, I need the opposite of quotemeta -- something that takes
> >>>> > > in a
> >>>> > > string and does the metacharacter replacements.
> >>>> > >
> >>>> > > I know that something like
> >>>> > > while (<>) {
> >>>> > >  s/\\n/\n/g;
> >>>> > >  # etc. for all metacharacter sequences...
> >>>> > >  print;
> >>>> > > }
> >>>> > >
> >>>> > > would work but I wanted to avoid the "etc. for all metacharacter
> >>>> > > sequences"
> >>>> > >
> >>>> > > Hopefully that's more understandable.
> >>>> > >
> >>>> > > Chip
> >>>> > >
> >>>> > > On Wed, 25 Nov 2009, Jeffrey Haemer wrote:
> >>>> > >
> >>>> > > > Chip,
> >>>> > > >
> >>>> > > > Can you do this instead?
> >>>> > > >
> >>>> > > > my $kw = "abc\ndef";
> >>>> > > >
> >>>> > > > If not, can you explain in enough detail that I can try again? :-)
> >>>> > > >
> >>>> > > > On Wed, Nov 25, 2009 at 8:29 AM, Chip Atkinson <chip at pupman.com>
> >>>> > > > wrote:
> >>>> > > >
> >>>> > > > > Greetings,
> >>>> > > > >
> >>>> > > > > I'm working on a perl script that reads strings from a
> >>>> > > > > configuration
> >>>> > > file
> >>>> > > > > and prints them out.  What I'd like to be able to do is have any
> >>>> > > embedded
> >>>> > > > > metacharacters interpreted but I'd like to avoid doing the
> >>>> > > substitutions
> >>>> > > > > myself.
> >>>> > > > >
> >>>> > > > > For example, here is a little script to emulate the problem:
> >>>> > > > >
> >>>> > > > > #!/usr/bin/perl
> >>>> > > > >
> >>>> > > > > my $kw = 'abc\ndef';
> >>>> > > > >
> >>>> > > > > print "$kw";
> >>>> > > > > ----------------------
> >>>> > > > > the output is
> >>>> > > > > abc\ndef
> >>>> > > > >
> >>>> > > > > What I want is
> >>>> > > > > abc
> >>>> > > > > def
> >>>> > > > >
> >>>> > > > > --------------
> >>>> > > > > I tried to jfgi but no joy.
> >>>> > > > >
> >>>> > > > > Thanks in advance.
> >>>> > > > >
> >>>> > > > > Chip
> >>>> > > > >
> >>>> > > > > _______________________________________________
> >>>> > > > > Web Page:  http://lug.boulder.co.us
> >>>> > > > > Mailing List: http://lists.lug.boulder.co.us/mailman/listinfo/lug
> >>>> > > > > Join us on IRC: lug.boulder.co.us port=6667
> >>>> > > > > channel=#hackingsociety
> >>>> > > > >
> >>>> > > >
> >>>> > > >
> >>>> > > >
> >>>> > > > --
> >>>> > > > Click to Call Me Now! --
> >>>> > > > http://seejeffrun.blogspot.com/2009/09/call-me-now.html
> >>>> > > >
> >>>> > > > Jeffrey Haemer <jeffrey.haemer at gmail.com>
> >>>> > > > 720-837-8908 [cell],  @goyishekop [twitter]
> >>>> > > > http://www.youtube.com/user/goyishekop [vlog]
> >>>> > > >
> >>>> > >
> >>>> > > _______________________________________________
> >>>> > > Web Page:  http://lug.boulder.co.us
> >>>> > > Mailing List: http://lists.lug.boulder.co.us/mailman/listinfo/lug
> >>>> > > Join us on IRC: lug.boulder.co.us port=6667 channel=#hackingsociety
> >>>> > >
> >>>> >
> >>>> >
> >>>> >
> >>>> > --
> >>>> > Click to Call Me Now! --
> >>>> > http://seejeffrun.blogspot.com/2009/09/call-me-now.html
> >>>> >
> >>>> > Jeffrey Haemer <jeffrey.haemer at gmail.com>
> >>>> > 720-837-8908 [cell],  @goyishekop [twitter]
> >>>> > http://www.youtube.com/user/goyishekop [vlog]
> >>>> >
> >>>>
> >>>> _______________________________________________
> >>>> Web Page:  http://lug.boulder.co.us
> >>>> Mailing List: http://lists.lug.boulder.co.us/mailman/listinfo/lug
> >>>> Join us on IRC: lug.boulder.co.us port=6667 channel=#hackingsociety
> >>>
> >>>
> >>>
> >>> --
> >>> Click to Call Me Now! --
> >>> http://seejeffrun.blogspot.com/2009/09/call-me-now.html
> >>>
> >>> Jeffrey Haemer <jeffrey.haemer at gmail.com>
> >>> 720-837-8908 [cell],  @goyishekop [twitter]
> >>> http://www.youtube.com/user/goyishekop [vlog]
> >>>
> >>>
> >>
> >>
> >>
> >> --
> >> Click to Call Me Now! --
> >> http://seejeffrun.blogspot.com/2009/09/call-me-now.html
> >>
> >> Jeffrey Haemer <jeffrey.haemer at gmail.com>
> >> 720-837-8908 [cell],  @goyishekop [twitter]
> >> http://www.youtube.com/user/goyishekop [vlog]
> >>
> >>
> >>
> >> _______________________________________________
> >> Web Page:  http://lug.boulder.co.us
> >> Mailing List: http://lists.lug.boulder.co.us/mailman/listinfo/lug
> >> Join us on IRC: lug.boulder.co.us port=6667 channel=#hackingsociety
> >>
> >
> >
> >
> > --
> > Calvin: Know what I pray for?
> > Hobbes: What?
> > Calvin: The strength to change what I can, the inability to accept
> > what I can't, and the incapacity to tell the difference.
> >
> 
> 
> 
> -- 
> Calvin: Know what I pray for?
> Hobbes: What?
> Calvin: The strength to change what I can, the inability to accept
> what I can't, and the incapacity to tell the difference.
> _______________________________________________
> Web Page:  http://lug.boulder.co.us
> Mailing List: http://lists.lug.boulder.co.us/mailman/listinfo/lug
> Join us on IRC: lug.boulder.co.us port=6667 channel=#hackingsociety
> 




More information about the LUG mailing list