russell@ccu1.aukuni.ac.nz (Russell J Fulton;ccc032u) (06/18/91)
I have been writing a perl program to implement a generic print command for our UNIX system. On of the ways we print files is by doing a DEC NET copy of the file to a vax where a process picks up the file and puts it in a VMS queue. (You *really* *don't* want to know why we do it this way!) Anyway I cobble to getter a long file name with various information coded into it and then invoke the decnet copy program with system. here is the fragment of code. $ddev='ccvcom::sys\$sysdevice:[decnet.uspool]'; print "/usr/bin/dn/dncp $file $ddev$$__$printer"."__$USER__$vmsfn\n"; system("/usr/bin/dn/dncp $file $ddev$$__$printer"."__$USER"."__$vmsfn"); There are two things that puzzle me. One is why do I need to escape the $ in the first statement. If I don't then the print statement prints the string correctly, in the call to system the $sysdevice is interpreted as a variable and substituted with a null string. The other thing is: why do I need to break the string with a "." after $printer? I could have understood it if I had to break up "$$__" because perl got confused between $$ and $_. BTW all the variables in these exprssions contain /\w/. I am running perl 4.03. I have this application running now but I would like to understand why I need to do this and hopefully say myself some time when I next fall over some thing similar. Thanks, Russell. -- Russell Fulton, Computer Center, University of Auckland, New Zealand. <rj_fulton@aukuni.ac.nz>
Andrew.Vignaux@comp.vuw.ac.nz (Andrew Vignaux) (06/18/91)
In article <1991Jun18.051149.25411@ccu1.aukuni.ac.nz>, russell@ccu1.aukuni.ac.nz (Russell J Fulton;ccc032u) writes: |> $ddev='ccvcom::sys\$sysdevice:[decnet.uspool]'; |> system("/usr/bin/dn/dncp $file $ddev$$__$printer"."__$USER"."__$vmsfn"); |> |> There are two things that puzzle me. One is why do I need to escape the |> $ in the first statement. $sysdevice is being interpreted by /bin/sh. |> The other thing is: why do I need to break the string with a "." after |> $printer? I could have understood it if I had to break up "$$__" because |> perl got confused between $$ and $_. Because '_' is a valid character in an identifier. An easier workaround is to use {}s: "...__${printer}__..." To avoid /bin/sh getting its grubbly little hands on your '$'s (or even worse someone invoking your utility with "USER='; echo gotcha'") you could invoke: system('/usr/bin/dn/dncp', $file, "$ddev$$__${printer}__${USER}__$vmsfn"); i.e. pass the arguments to dncp directly. Andrew -- Domain address: Andrew.Vignaux@comp.vuw.ac.nz