[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 メーリングリストの案内