Как правильно выполнить Perl “один лайнер” сценарии командной строки?

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

#!/usr/bin/perl

perl -e 'print "Hello";' 

Я запускаю этот скрипт и добираюсь:

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

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

18
задан Peter Mortensen 9 August 2012 в 08:56
поделиться

6 ответов

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

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

13
ответ дан 30 November 2019 в 06:54
поделиться

Попробуйте:

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

Фон: #! - это директива интерпретатора .

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

15
ответ дан 30 November 2019 в 06:54
поделиться

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

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

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

10
ответ дан 30 November 2019 в 06:54
поделиться

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

# 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
ответ дан 30 November 2019 в 06:54
поделиться

Допустим, у вас есть следующие данные:

$ 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 в строке shebang ( #! ).

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

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

 chmod + x имя-скрипта

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

0
ответ дан 30 November 2019 в 06:54
поделиться

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

system("/usr/bin/perl -e 'print \"Hello!\\\\n\";'");
0
ответ дан 30 November 2019 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: