Как правильно запустить Perl "one liner" сценарии командной строки? - PullRequest
17 голосов
/ 10 июля 2010

Я просмотрел несколько учебных пособий, но до сих пор не могу понять, что я делаю неправильно ... Я пытаюсь описать код ниже (в файле .pl Perl, как исполняемый файл):

#!/usr/bin/perl

perl -e 'print "Hello";' 

Я запускаю этот скрипт и получаю:

Выполнение /home/user1/Desktop/file_backups.pl прервано из-за ошибок компиляции.

(Iя новичок в использовании Perl для вызова командной строки Linux.)

Ответы [ 7 ]

15 голосов
/ 10 июля 2010

Попробуйте:

#!/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";

Или, если вы хотите, чтобы ваш скрипт оболочки выполнял код Perl:

#!/bin/sh
# That's a Bash script ~~~
# It's just a command line in a file ...    

perl -e 'print "Hello World";' 

Справочная информация: #! - это директива интерпретатора .

Когда команда выполняется, она преобразуется в выполнение интерпретатора.

12 голосов
/ 10 июля 2010

perl не является допустимой командой внутри скрипта Perl.Если бы вы назвали этот файл как сценарий .sh и использовали #!/bin/bash в строке shebang, это бы сработало, но на самом деле не имеет большого смысла писать bash-файл просто для вызова Perl (почему бы и нетвызывать Perl напрямую?)

Поскольку вы упомянули, что хотите взаимодействовать с командной строкой, я упомяну здесь, что вы можете получить параметры командной строки в Perl через массив @ARGV.(См. perldoc perlvar .)

10 голосов
/ 10 июля 2010

Просто введите в командной строке (не в файле)

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

Это действительно хорошо только для oneliners.Для более длинных скриптов нужен собственный файл ...

4 голосов
/ 17 сентября 2013

Это должно работать. Двойные кавычки вне одинарных кавычек внутри;)

perl -e "print 'Hello'"
0 голосов
/ 10 июля 2010

Скажем, у вас есть следующие входные данные:

$ 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

Все знают, что заглавные буквы намного лучше!

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

Так что теперь

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

Но нам бы очень хотелось сделать это с помощью команды upcase, и это легко сделать!

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

Посмотри на работу:

$ 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

Дополнительные советы от ответа на аналогичный вопрос :

Опция -e представляет исполняемый код на Perl, который можно рассматривать как сценарий в командной строке, поэтому отбросьте его и вставьте код в тело. Оставьте -p в строке Шебанга (#!).

В общем, безопаснее всего придерживаться не более одного «набора» опций в линии Шебанга. Если вам нужно больше, вы всегда можете выбросить их эквиваленты в блоке BEGIN {}.

Не забудьте включить бит выполнения!

chmod +x script-name

Поскольку вы не указали фактическую строку, которую хотите конвертировать, мне пришлось дать широкий общий ответ. Если вы измените свой вопрос, чтобы он соответствовал тому, что вы хотите сделать, мы можем дать более полезные ответы.

0 голосов
/ 10 июля 2010

Поскольку вы сказали, что ищете противоположное, вы можете иметь в виду следующее:

# 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!
#
0 голосов
/ 10 июля 2010

Возможно, вы пытаетесь сделать это:

system("/usr/bin/perl -e 'print \"Hello!\\\\n\";'");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...