Я просмотрел много учебных руководств, но я все еще не могу выяснить то, что я делаю неправильно.. Я пробую код ниже (в .pl файле Perl как исполняемый файл):
#!/usr/bin/perl
perl -e 'print "Hello";'
Я запускаю этот скрипт и добираюсь:
Выполнение/home/user1/Desktop/file_backups.pl, прерванного из-за ошибок компиляции.
(Я плохо знаком с использованием Perl для вызова командной строки Linux.)
perl
не является допустимой командой внутри сценария Perl. Если бы вы назвали этот файл сценарием .sh и использовали бы #! / Bin / bash
в строке shebang, это сработало бы, но на самом деле нет большого смысла писать bash только для того, чтобы вызвать Perl (почему бы не вызвать Perl напрямую?)
Поскольку вы упомянули, что хотите взаимодействовать с командной строкой, я упомяну здесь, что вы можете получить доступ к параметрам командной строки в Perl через @ARGV
массив. (См. perldoc perlvar .)
Попробуйте:
#!/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";'
Фон: #!
- это директива интерпретатора .
Когда команда выполняется, она преобразуется в выполнение интерпретатора.
Просто введите в командной строке (не в файле)
perl -e 'print "Hello World\n";'
Это действительно хорошо только для однострочников. Более длинным скриптам нужен свой собственный файл...
Поскольку вы сказали, что ищете обратное, это может быть то, что вы имеете в виду:
# 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!
#
Допустим, у вас есть следующие данные:
$ 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 имя-скрипта
Поскольку вы не указали фактическую однострочную строку, которую хотите преобразовать, мне пришлось дать широкий, общий ответ. Если вы отредактируете свой вопрос, чтобы он соответствовал тому, что вы хотите сделать, мы сможем дать более полезные ответы.
Возможно, вы пытаетесь сделать это:
system("/usr/bin/perl -e 'print \"Hello!\\\\n\";'");