Perlスクリプトには本当に拡張子がないのですか?


12

私はO'ReillyのLearning Perl、6th Editionを読み始めたばかりでこの抜粋に出くわして驚いた。

#!/usr/bin/perl
print "Hello, world!\n";

それをテキストエディタに入力したとしましょう。(パーツの意味や機能についてはまだ心配しないでください。すぐにわかります。)通常、プログラムは任意の名前で保存できます。Perlは特別な種類のファイル名や拡張子を必要とせず、拡張子をまったく使用しない方がよいでしょう。

拡張機能がない方が良いのはなぜですか?ボウリングのスコアを計算するプログラムを作成し、それをすべての友達にbowling.plxと呼ばれていることを伝えたとします。ある日、Cで書き直すことにしました。それでも、同じ名前で呼び出して、Perlで書かれていることを意味しますか?または、新しい名前が付いていることをみんなに伝えますか?(そして、bowling.cと呼ばないでください!)答えは、彼らが単にそれを使用している場合、それが書かれている言語は彼らのビジネスではないということです。したがって、そもそもそれは単にボウリングと呼ばれるべきでした。

これは私がこのビューで見た唯一のソースです。私が読んだ他のすべてのものが.pl拡張子をサポートしています。私はまだPerlプログラマではないので、習慣になる前のコミュニティの見方を知りたかった。


答えが説明するように、拡張子は重要ではありません。スクリプト(Perlを含む)の場合、重要なのはシバン行です。

1
いいえ、同意しないでください。ファイル拡張子がないと、IDEやプログラマーのエディターは構文の強調表示をどのように決定するのでしょうか。
GrandmasterB 2015年

3
@GrandmasterBは、シバン行を見たり、モードラインを読んだりします。.pl配布したいプログラムには拡張機能を使用しません(その情報はシグナルではなくノイズです)が、これはローカルスクリプトの便利なリマインダーです。とにかく、これはモジュール(.pm拡張が必要)またはテスト(.t通常の拡張)のいずれかにあるため、Perlコードの90%以上には関係ありません。
2015年

1
@GrandmasterB私はLinuxで開発しています。VimとKateはどちらも#!/usr/bin/env perl、ファイルに拡張子などの矛盾がない場合、その行で始まるファイルをPerlスクリプトとして正しく識別します.cppfileプログラム(与えられた入力のMIMEタイプを推測するために使用される)が正しく推論text/x-perl拡張子に関係なく。
2015年

3
そこにどこかは、私たちは思ったことは注目.plという拡張子がためだったのp ERLのリットルの ibraries、何とか人々はプログラムのために使用したもの変身しました。
ブライアン

回答:


14

本のアドバイスは完全に有効です-少なくともUNIXライクなシステムにとっては。スクリプトの実行は#!、ファイル名の拡張子部分ではなく、行によって制御されます。Perlスクリプトに特別な拡張機能を使用すると、スクリプトを実行する人にとって重要ではない情報が公開されます。

Windowsは別の問題です。Windowsはこの#!メカニズムをサポートしていません。代わりに、ファイルを開くために使用される方法は、拡張子によって異なります。たとえば、Windowsシェルは、.plファイルをダブルクリック(またはプロンプトから実行)すると、それを引数としてPerlインタープリターに渡すように構成されている場合があります。Perlシステムをインストールすると、おそらく自動的に設定されます。

移植を意図したPerlスクリプトの.pl場合、Windowsで必要なサフィックスがUNIXライクなシステムに「リーク」する可能性があります。インストール時にスクリプトに適切な名前を選択する、システム固有のインストール方法を用意するのがおそらく最善です。

UNIX系のシステムでは、.pl拡張子はほとんど無害であり、そしてあなたはそれが特定のスクリプトによって使用されているどの言語のリマインダーとして有用な(おそらくあなたがのコレクションを持って見つけた場合は.pl.py.sh、および.rbスクリプト)、その後、あなたがそれを行うことができます。しかし、本で説明されているように、このアプローチには欠点があります。別の言語でスクリプトを再実装する場合は、名前を変更し、それを呼び出すものをすべて更新する必要があります。

(Perl モジュールは、.pmPerlがそれらを見つけることができるように、拡張機能を持っている必要があります。たとえば、次のようになります。

use Foo::Bar;

インタープリターは、配列にリストされているディレクトリーの1つの下にあるBar.pmディレクトリーに名前が付けられたファイルを検索します。ただし、ファイルは直接実行するためのものではありません。)Foo@INC.pm

これは私がこのビューで見た唯一のソースです。私が読んだ他のすべてが.pl拡張機能をサポートしています。

それは驚くべきことです。私が見たアドバイスのほとんどは、実行可能スクリプトに拡張機能を使用しないこと.plです。


1

関係ない

#!/usr/bin/perl

コードの実行に使用するプログラムをシステムに通知します。

に変更した場合

#!/usr/bin/bash

または

#!/usr/bin/python

別のインタープリターを使用します。

拡張機能の使用は完全にオプションであり、ユーザーが言語を知る必要がないという点は、ほとんどの場合100%正しいです。

add 2 3(ユーザーとして)実行して5を取り戻すことだけが私が気にしていることです。

スクリプトに拡張機能を追加するのは、なんらかの理由でエンドユーザー(場合によっては自分自身)が言語を知る必要がある場合のみです。

example.shまたはexample.plを使用して、同じタスクを実行するさまざまな方法を示します。

とはいえ、エクステンションがない方が一般的ですが、それはすべて好みです。


1

抜粋は確かに完全に有効なアドバイスをします。

また、小さなシステムの場合、実装について気が変わった場合に備えて、あちこちにいくつかのファイルや文字列の名前を変更することは非常に簡単です。

一方、発展途上にある現代のトレンド大きめのシステムは、すべてのモジュールが、それはまだ言語固有の拡張子を持つことに依存しながら、任意の拡張子を除いた主な実行可能ファイルを持つ意味します。

実際、Python これを仕様上必要としています。通常、メインのPythonスクリプト(名前に拡張子がないスクリプト)は、アプリ全体をブートストラップする数行です。


0

この本がすべてを伝えているのは、Unixでは、ファイル拡張子は慣例にすぎないということです。実際には、多くの種類のファイルがこのカテゴリに分類されます。Rubyファイルは同じ規則を使用するため、.rb拡張子は必要ありません。Cコンパイラは有効なCコードのみを必要とするため、必要に応じて.watoozyという名前を付けることができます。

技術的な制約はありませんが、驚きを最小限に抑えるという原則には実際的な制約があります。基本的に、ルビコードを.plファイルに表示するのは非常に驚くべきことなので、一般的にはそうしません。

ルールの1つの例外

一部のサーバーアプリケーションでは、サービスとしてアプリケーションを簡単に起動できるように、起動スクリプトが拡張子のないファイルに含まれています。その場合、ファイルは他のコンパイル済みコマンドと同じように見えます。Perlがインストールされている限り、同様に動作します。


Cコンパイラは通常、拡張子に応じて入力ファイルを異なる方法で処理します。例えば、GCC扱い.Cソースコードとしては、.cpp.cc.CC ++ソースコードとして、.oオブジェクトファイルとしてリンカに渡され、そしてようにすることができます。コマンドラインオプションでそれを上書きすることができますが、私はそれを使用したことがほとんどないので、それが何であるか覚えていません。.cCソースファイルの拡張子は重要です。.pl実行可能なPerlスクリプトの拡張はそうではありません(少なくともUNIXライクなシステムでは)。
キーストンプソン

1
@KeithThompson:実際には、SUS準拠のUnixシステム上で、これらのファイルの拡張子がため仕様の一部でもありc99コマンド:pubs.opengroup.org/onlinepubs/9699919799/utilities/...
イェルクWミッターク

-4

「O'Reilly's Learning Perl、6th Edition」の本からの抜粋はゴミです。Cをperlと比較することは同等ではありません。まず、Cは拡張機能のないバイナリにコンパイルされます。

Perlはコンパイルされないため、一部のテキストエディターでは、ファイルタイプを識別するために拡張子が必要になります。

ベストプラクティスの一部として、システム内の任意の場所に拡張子の付いた完全なスクリプトファイル名をハードコーディングしないでください。シンボリックリンクを常に使用するか、エイリアスはオペレーティングシステムに依存します。

今後、元のファイルを変更する必要がある場合は、新しい場所を指すようにシンボリックリンクを変更するだけで済みます。


テキストエディターに関する記述は有効な場合がありますが、emacsとvimはどちらも、特別な拡張機能がなくてもPerlスクリプトを検出できます。「ベストプラクティス」についてのあなたの主張は、いくつかのサポートでより説得力があります。私のシステム(Linux)には常に拡張機能なしでPerlスクリプトをインストールしていますが、問題が発生することはありません。
キース・トンプソン、

ええ、もちろん、スクリプトにハッシュバン(#!)が含まれている場合はスクリプトが実行されます。Linuxで作業するのはすばらしいと思います。次にパッケージマネージャーでアプリケーションをインストールするときは、スクリプトの作成方法にも注意してください。ファイルを直接binディレクトリに書き込むのではなく、binディレクトリへのシンボリックリンク..なぜだろう。
Aaron Goshine、2016

多分それはパッケージマネージャーに依存しますか?私のUbuntu 14.04システム/usr/binでは、シンボリックリンクとしてではなく、325のPerlスクリプトをの直下にインストールしています。これらはすべて、システムのパッケージマネージャによってインストールされました。パッケージマネージャーには、各パッケージのすべてのファイルの場所を追跡する独自のデータベースがあります。(私がソースから構築するソフトウェアの場合、私はシンボリックリンクを使用します。)しかし、Perlスクリプトに.pl拡張機能が必要かどうかについて、それが何をしているのかわかりません。
キース・トンプソン、

ここで一番上に行ったのではないかと思います。
Aaron Goshine

1
そのコメントにはもっとあるはずだったのですか?
キーストンプソン、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.