Re: Passing user input to a shell command
by jdporter (Paladin) on May 17, 2007 at 21:44 UTC
|
print "$_\n" for qw "perl /Users/james/perlstuff/macc/macc1 $file";
You might have other problems with that program as well.
For starters, you should probably chomp($file) immediately after reading it in.
Also, you're opening the file for reading, then immediately passing the filename
to an external program. I really don't think you want to do both. You certainly
don't need to open a file before passing it to an external program; that
program will do what it wants with the name, and wouldn't see your open filehandle
anyway.
Thirdly, you're pulling in the Shell module, but not using it.
You could use it, by doing this:
use Shell qw( perl );
. . .
perl "/Users/james/perlstuff/macc/macc1", $file;
A word spoken in Mind will reach its own level, in the objective world, by its own weight
| [reply] [Watch: Dir/Any] [d/l] [select] |
|
I know that the file $file does not exist, I open it to insure that user is typing the file exists. The question should have been how do I tell the shell line that $file = <STDIN> is the value that is entered by the user and to put it into the shell line ie
User enters test.txt
So $file is now = test.txt
the shell command shout be
perl /Users/james/perlstuff/macc/macc1 test.txt.
James
| [reply] [Watch: Dir/Any] |
|
-f $file or die "You specified a non-existent file.\n";
Even if you do open it for this purpose, you should definitely close it right away,
before letting another process have it.
A word spoken in Mind will reach its own level, in the objective world, by its own weight
| [reply] [Watch: Dir/Any] [d/l] |
A reply falls below the community's threshold of quality. You may see it by logging in.
|
|
| [reply] [Watch: Dir/Any] |
|
print "$_\n" for qw "perl /Users/james/perlstuff/macc/macc1 $file";
| [reply] [Watch: Dir/Any] [d/l] |
Re: Passing user input to a shell command
by liverpole (Monsignor) on May 17, 2007 at 21:48 UTC
|
Hi james734,
Your problem, more likely than not, is that there's a newline character at the end of $file;
Try adding the line:
$file = <STDIN>;
chomp $file;
Another piece of advice is to use $! when printing errors that result from system calls:
open(IN, $file) or die "The file $file is not present ($!)\n";
s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/
| [reply] [Watch: Dir/Any] [d/l] [select] |
Re: Passing user input to a shell command
by shmem (Chancellor) on May 17, 2007 at 22:17 UTC
|
Well, up to here it has really been nearly all PerlMonks on you :-)
To elaborate further
- gratuituous parens in my ($file);
- you don't check whether you've actually read something from STDIN, nor what. Sanitize your input (see perlsec)
- ...
okay, I'll shut up... welcome to the monastery, btw :-)
--shmem
_($_=" "x(1<<5)."?\n".q·/)Oo. G°\ /
/\_¯/(q /
---------------------------- \__(m.====·.(_("always off the crowd"))."·
");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}
| [reply] [Watch: Dir/Any] [d/l] |
Re: Passing user input to a shell command
by FunkyMonk (Chancellor) on May 17, 2007 at 22:03 UTC
|
In addition to comments made by the other monks, I'd also suggest you move to the three argument open and lexical filehandles.
So, instead of
open(IN, $file) or die "The file $file". "is not present.\n";
use
open my $IN, "<", $file
or die "can't open $file: $!";
| [reply] [Watch: Dir/Any] [d/l] [select] |