Walt Mankowski on 19 Apr 2011 08:01:42 -0700


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: [PLUG] perl -e with system()


On Tue, Apr 19, 2011 at 10:39:58AM -0400, Chris Nehren wrote:
> On Apr 19, 2011, at 10:28 , Randall A Sindlinger wrote:
> 
> > Hey folks,
> > 
> > I'm getting a weird error.
> > 
> > I have a tab-separated datafile of the form
> > 
> > audit-2.0.5-5.8.1.x86_64	/var/log/audit/audit.log
> > ca-certificates-1-9.1.noarch	/var/lib/ca-certificates/ca-bundle.pem
> > filesystem-11.4-11.14.1.x86_64	parent is /boot/	/boot/backup_mbr
> > filesystem-11.4-11.14.1.x86_64	parent is /etc/	/etc/.pwd.lock
> > 
> > I want to split the filenames up into separate files, just using the package
> > as the filename.
> > 
> > perl -n  -e '($a, $b, $c) = split("\t"); chomp $a; chomp $b; chomp $c; if ($c) {system ("echo $c >> $a")} 
> > else {system ("echo $b >> $a")}' < data.file
> 
> The problem is that you're not quoting things properly. The LIST
> form of system does this for you, but it also doesn't invoke a
> subshell (so you can't do >>).

That's not correct.  If system() is passed a single parameter, that's
checked for shell metacharacters, and if any are found, the argument
is passed to "/bin/sh -c".  At least on unix.  Different things will
happen on other platforms.

In fact, Randall's script worked just fine for me and didn't print out
any errors.  My guess is that some of the other records in that file 
might be missing tabs and that's confusing the redirection.

> You really should be using open instead:
> 
> open my $fh, '>>', $file or die "open($file): $!";
> print $fh $content;
> close $fh;

That would certainly be a more robust solution, but it's also making
it a pretty big one-liner...
  
> Note also that $a and $b are special variables used by perl for
> sort() and you shouldn't use them. See perldoc perlopentut for more
> info, and please consider reading Beginning Perl so you don't make a
> mess of things.

True, you definitely don't want to do that in a real program.  But it
hardly matters in a one-liner where he's clearly not doing any
sorting.

> 
> > Thanks,
> >         . o 0 ( So _this_ is why I should've gone to JP's talk )
> 
> This has very little to do with the shell and everything with perl.

I'm still voting for bad data. :)

Walt

Attachment: signature.asc
Description: Digital signature

___________________________________________________________________________
Philadelphia Linux Users Group         --        http://www.phillylinux.org
Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce
General Discussion  --   http://lists.phillylinux.org/mailman/listinfo/plug