[Tokyo.pm] dos2unix 対 --

Tetsuya Ryuchi ryuchi @ ryuchi.org
2004年 2月 18日 (水) 07:30:03 CST


  りゅうちです

> あいかわらず、このML流量少ないですね。
> ネタ不足で私も投稿できないでいますが、今回1つばかり。
> わざわざpmに流さず、PerlのMLに投げればよいのですが、ちとカッコ悪い。

  ぜひ、もりあげてください。

> 初めてのサーバーに簡単なcgiのプログラムをアップしてサイト構築したのですが、
> asciiで転送してるのに「bad interpreter」になる。
> viでプログラム見ても例の「^M」が行末に表示されない。
> 調べたらvsFTPd使ってて、ascii転送はデフォルト設定のままで使えなかった。
> (転送エラーにはなってくれない)
> dos2unixってコマンド知らなかった。

  dos2unix ってコマンドは 私も知りません。そちらの環境がわからない
のですが、そちらのサイトで MS-DOS系(Windows系)のエディタ、FTPクライ
アントを使う人のために 特別に作られたものではないですか?

  ちなみに、私は こういう場合には nkf コマンドを使っています。
  -c と -d のオプションで 相互に行末のコードを変更できます。

> ついでに、1行目の最後に" --"をつけると、dos2unixしなくても動くようになる、
> これにはびっくりしました。ググッて見つけたのですが、何故かは書いてない。
> 知ってたら教えて下さい。

  #!/usr/bin/perl --

  とするのですね?

  えっと #!/usr/bin/perl で 終わっている場合、 MS-DOSのファイル形式の
場合は、 ^M^J (16進数だと 0x0c, 0x0a つまり CR/LF) というコードが行末
についています。
  UNIX の場合 LF が改行コードなので /usr/bin/perl^M というコマンドを
実行しようとしますが、実在しないため、エラーとなります。

  ところが #!/usr/bin/perl -- とすると 空白で区切られて -- という
パラメータを /usr/bin/perl というコマンドを実行しようとします。
この場合、/usr/bin/perl は実在しますので、問題なく起動できるようにな
ります。 MS-DOS形式のファイルの場合 --^M なパラメータが Perl に渡され
ることになります。 -- のあとに 空白があれば 実行した Perl script の
$ARGV[0] に ^M が入るかもしれません。

  ところで -- の意味ですが...

  Perl のコマンドラインは 概略下記のようになっています。

  perl [-オプション] -- [スクリプト ファイル名] [スクリプトへの引数]

  一般に Perl の オプションは - で始まります。 -w とか、よく使います
よね? そして 起動されるスプリクトにも 引数が渡されます。

  さて、ここで -w と書いた場合、それが、Perl 自身への引数なのか、ス
クリプト名 または その引数なのか、明確に区別する方法が必要となりま
す。もし、その方法がないと、さらに もし -w や -f など - で始まる名前
のファイルで保存されているスクリプトを起動しようとするとき、区切る方
法がないため、困ってしまうことになります。

  そこで Perl 自身への引数と スプリクトとその引数の間に 区切りとなる
マークとして -- をおきます。 -- から後ろは、スクリプト名と その引数
であると、はっきり決めてしまいます。
  これで 明確に Perlの引数と スクリプトとその引数を明確に区別できる
ようになります。 もし -- という名前のスクリプトを起動するならば、
Perl -- -- とすればよいことになります。同じように -w や -f という様
な名前のファイルでも起動することができます。

  こんな感じでいかがでしょうか?

(龍)
--
# From Tetsuya Ryuchi   ryuchi @ ryuchi.org
#                       ryuchi @ beatcraft.com



Tokyo-pm メーリングリストの案内