web-dev-qa-db-ja.com

Perl「ワンライナー」コマンドラインスクリプトを適切に実行する方法は?

私はいくつかのチュートリアルを調べましたが、それでも私が間違っていることを理解できません。以下のコードを(.pl Perlファイルで、実行可能ファイルとして)試しています:

#!/usr/bin/Perl

Perl -e 'print "Hello";' 

このスクリプトを実行すると、次のようになります。

コンパイルエラーのため、/ home/user1/Desktop/file_backups.plの実行が中止されました。

(Perlを使用してLinuxコマンドラインを呼び出すのは初めてです。)

19
Rick

Perlは、Perlスクリプト内の有効なコマンドではありません。そのファイルに.shスクリプトとして名前を付け、Shebang行で#!/bin/bashを使用した場合、それは機能しますが、Perlを呼び出すためだけにbashファイルを作成することはあまり意味がありません(なぜPerlを直接呼び出さないのですか?)

コマンドラインとやり取りしたいとおっしゃっていたので、ここでは、@ARGV配列を介してPerl内のコマンドラインオプションを取得できることを説明します。 ( perldoc perlvar を参照してください。)

12
Ether

試してください:

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

コマンドラインで入力するだけです(ファイルではありません)

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

これは、ワンライナーにとって本当に良いことです。長いスクリプトには独自のファイルが必要です...

10
Henno Brandsma

これはうまくいくはずです。 ;)内の単一引用符の外側の二重引用符

Perl -e "print 'Hello'"
4
Slak

あなたはこれをやろうとしているかもしれません:

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

あなたが反対を探していると言ったので、これはあなたが意味することかもしれません:

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

次の入力があるとします。

$ 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 abc 
 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 abc 
 a is a 
 b is b 
 c is c 
 
 $です。/upcase abc 
 
 $!cat 
 cat abc 
 A IS A 
 B IS B 
 C IS C

同様の質問への回答 からのその他のヒント:

-eオプションは、実行するPerlコード(コマンドラインのスクリプトと考えることができます)を導入するため、それをドロップし、コードを本体に貼り付けます。シバン(-p)行に#!を残します。

一般に、シバン行のオプションの最大1つの「束」に固執するのが最も安全です。さらに必要な場合は、常に同等のものをBEGIN {}ブロック内にスローできます。

実行ビットをオンにすることを忘れないでください!

chmod +x script-name

あなたが変換したい実際のワンライナーを与えなかったので、私は幅広い一般的な答えをしなければなりませんでした。質問を編集して、目的に合わせて具体的にすると、より役立つ回答が得られます。

0
Greg Bacon