Perl:コマンドライン引数でつまずく

さっきまでPerlのスクリプトと格闘していてやっと問題が解決(?)したので、対処方法をメモしておきます。でも、まさかこんなことが起き得るんですね。

さて、その問題とはコマンドライン引数に改行文字が含まれるという問題。簡単にどんなシチュエーションでこの問題が起こったかを説明します。

まず、PCが2台あります。1つをPC_A、もう1つをPC_Bとします。
PC_A(WinXP 32bit)でPerlスクリプトとそれを何度も呼び出すシェルスクリプトを作成し、PC_B(WinXP 64bit)で実行します。そのプログラムの概要はだいたい以下の通り。
実行環境はCygwinで、Perlのバージョンは5.8.8(64bit)です。

#!/usr/bin/perl

my $a = $ARGV[0].".ext";
my $b = $ARGV[1].".ext";
my $c = $ARGV[2].".ext";

print system("java -jar jarfile.jar $a $b $c");

以下がシェルスクリプト*1です。(本当はこんな規則正しいパラメータの与え方をしているわけではありません。)

./perlscript.pl 10 10 10
./perlscript.pl 10 10 20
./perlscript.pl 10 10 30
# 以下同様...

./perlscript.pl 30 30 30

で、実行させようとすると、なぜかPerlスクリプトでの最後のコマンドライン引数がおかしなことになるのです。表示させてみると、どうやらcarriage returnが入っている模様。(表示が上書きされてたりするので。)

いろいろ試した結果、シェルスクリプトの行末に半角スペースを余分に入れることで対処。
でもこれまでこんな問題にぶつかったことがなかったので、かなり戸惑いました。


--
(2008/02/10 追記)
コメントの内容を受けて、実行環境などを補足しました。

--
(2008/02/10 追記)
コメントより、コマンドライン引数に変な改行文字が入っていたら次のようにしたらいいんじゃないかというアドバイスをいただきました!ありがとうございます(^O^)/

Cygwinではデフォルトの改行文字が「LF」(Unix形式)になっているらしいですね。
Windows上で作成されたファイルでは改行文字が「CRLF」になるので、そこが問題になっていたようです。

$line = "command line arguments\r\n"; # コマンドライン引数を代入した変数
{
    local $/ = "\r\n"; # 削除したい改行文字を設定
    chomp($line);   # 余分な改行文字を削除
}
  • *1:というよりバッチファイル

Track Back

Track Back URL

Comments [8]

そんなときはchompを使えばおk

それだけだったら,bashなら

set=$(seq 10 10 30);
for a in $set; do for b in $set; do for c in $set;
do echo -e "java -jar javafile.jar $a.ext $b.ext $c.ext"|sh;
done;done;done;


とかで出来ないだろうか.

推測で書くけど,

一段階目の実験プログラムでパラメータ最適化(Java)

二段目の実験スクリプト用shell scriptを吐く
-WindowsなのでJAVAプログラムからの出力は[CR][LF]付与される

./perlscript.pl 10 10 30[CR][LF] が実行される

Cygwinの改行コードは[LF]なので,

my $c = $ARGV[2].".ext";
=> 30[CR].ext


ってことだろうか.

perlスクリプトはcygwinで動かしてるからchompでは[LF]しか削除しないので,うまくいかないんだな.
chompは$/の値を削除するらしいので,

{
local $/ = "\r\n";
chomp($line);
}

すればいいと思うよ.

http://hassylin.nowa.jp/entry/56d3166bb0

同じ問題にはまったことがあったよ

http://hassylin.nowa.jp/entry/56d3166bb0

同じ問題にはまったことがあったよ

コメントする

公開されません

refresh captcha

画像の中に見える文字を入力してください。

このページの上部へ

About

tetsuの日記・雑記です。
日々経験したことを記録していきます。

広告

サイト内検索

最近のピクチャ

  • リアディレーラ

月別アーカイブ

最近のコメント