views:

115

answers:

6

I'm new to using Perl to call the linux command line and have looked through a number of tutorials but still can't figure out what I am doing wrong.. I am trying the code below (in a .pl perl file, as an executable):

#!/usr/bin/perl

perl -e 'print "Hello";' 

I run this script and get: "Execution of /home/user1/Desktop/file_backups.pl aborted due to compilation errors."

I would appreciate any advice.

+7  A: 

Try:

#!/usr/bin/perl
# this is a comment ~~~
# this script will be run as a perl script
# since 'perl' isn't a keyword or function in perl
# something like this must fail:
#
# perl -e 'print "Hello";' 
#
# the following should work:

print "Hello"; print " World\n";

or, if you want your shell script to execute perl:

#!/bin/sh
# that's a bash script ~~~
# it's just a command line in a file ...    

perl -e 'print "Hello World";' 

Background: #! is an interpreter directive.

When the command is executed, it is converted to an execution of the interpreter.

The MYYN
A: 

You might be trying to do this:

system("/usr/bin/perl -e 'print \"Hello!\\\\n\";'");
eruciform
Thanks for the responses.. well what I'm trying to do is write perl scripts that interact with the command line, I guess I had it backwards as what I was looking at are bash / shell scripts to call perl
Rick
This is just bad advice. OP wants to print hello inside a Perl script. So just use print.
ghostdog74
@ghostdog: i'm not trying to advise this, it's just an answer to a direct question. i'm trying not to judge. it looks like he's looking for the opposite, anyways, so we're both off. :-)
eruciform
+2  A: 

perl is not a valid command inside a Perl script. If you had named that file as a .sh script, and used #!/bin/bash on the shebang line, it would have worked, but it doesn't really make a lot of sense to write a bash file just to invoke Perl (why not invoke Perl directly?)

Since you mentioned you want to interact with the command line, I'll mention here that you can get at the command line options within Perl via the @ARGV array. (See perldoc perlvar.)

Ether
A: 

Since you said you're looking for the opposite, is this is what you mean?:

# vi stdin.pl
# cat stdin.pl
  #!/usr/bin/perl
  while(<STDIN>)
  {
    if( /^hello/ ){ print "Hello back to ya!\n"; }
  }
# chmod 0777 stdin.pl
# ./stdin.pl
  foo
  hello
  Hello back to ya!
#
eruciform
+3  A: 

Just type on the command line (not in a file)

perl -e 'print "Hello World\n";'

This is only really good for oneliners. Longer scripts need their own file...

Henno Brandsma
A: 

Say you have the following inputs:

$ for i in a b c ; do echo "$i is $i" > $i; done

$ cat a b c
a is a
b is b
c is c

Everybody knows capital letters are much better!

perl -i.bak -pe '$_ = uc' a b c

So now

$ cat a b c
A IS A
B IS B
C IS C

But we'd really like to can this in a command called upcase, and that's easy to do!

#! /usr/bin/perl -pi.bak
$_ = uc

See it at work:

$ for i in a b c ; do echo "$i is $i" > $i; done

$ cat a b c
a is a
b is b
c is c

$ ./upcase a b c

$ !cat
cat a b c
A IS A
B IS B
C IS C

More tips from an answer to a similar question:

The -e option introduces Perl code to be executed—which you might think of as a script on the command line—so drop it and stick the code in the body. Leave -p in the shebang (#!) line.

In general, it's safest to stick to at most one "clump" of options in the shebang line. If you need more, you could always throw their equivalents inside a BEGIN {} block.

Don't forget to turn on the execute bit!

chmod +x script-name

Because you didn't give the actual one-liner you want to convert, I had to give a broad, general answer. If you edit your question to make it specific to what you want to do, we can give more helpful answers.

Greg Bacon