Подтвердить что ты не робот

Как правильно запустить скрипты командной строки Perl "один лайнер"?

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

#!/usr/bin/perl

perl -e 'print "Hello";' 

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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";

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

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

perl -e 'print "Hello World";' 

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

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

Ответ 3

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

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

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

Ответ 4

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

perl -e "print 'Hello'"

Ответ 5

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

system("/usr/bin/perl -e 'print \"Hello!\\\\n\";'");

Ответ 6

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

# 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!
#

Ответ 7

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

$ 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, который вы можете представить как script в командной строке, поэтому отпустите его и вставьте код в тело. Оставьте -p в строке shebang (#!).

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

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

chmod +x script-name

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