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)です。
(本当はこんな規則正しいパラメータの与え方をしているわけではありません。)
で、実行させようとすると、なぜかPerlスクリプトでの最後のコマンドライン引数が
おかしなことになるのです。表示させてみると、どうやらcarriage returnが入っている模様。
(表示が上書きされてたりするので。)
いろいろ試した結果、シェルスクリプトの行末に半角スペースを余分に入れることで対処。
でもこれまでこんな問題にぶつかったことがなかったので、かなり戸惑いましたね~。
対処方法をメモしておきます。でも、まさかこんなことが起き得るんですね~。
さて、その問題とはコマンドライン引数に改行文字が含まれるという問題。
簡単にどんなシチュエーションでこの問題が起こったかを説明します。
まず、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が入っている模様。
(表示が上書きされてたりするので。)
いろいろ試した結果、シェルスクリプトの行末に半角スペースを余分に入れることで対処。
でもこれまでこんな問題にぶつかったことがなかったので、かなり戸惑いましたね~。
*1
: というよりバッチファイル
Perl:コマンドライン引数でつまずくの続きを読む
研究の都合で、Perlでスレッド使ったら早く処理が済むんじゃないかと思い立ちました。
もともと、実験の処理を行わせるスクリプトがPerlで書かれているというのもあるんですが、
あまり使い慣れてはないので、一瞬「スレッドをサポートしてるんかな?」とか思って
しまいました。でも、今さらそんなわけないですよね。
googleを使って調べてみると、簡単なサンプルが落ちていました。
[web] Perlでマルチスレッド - 結城浩
これってほとんどJavaと同じような感覚で使えますよね。
Javaなら、Runnableインターフェースを実装したクラスのインスタンスをThreadに与えて
runメソッドを呼び出して、joinメソッドでスレッドの終了を見届ける(?)ので、
それと置き換えて考えれば簡単に覚えられそうです。
以下がそのサンプルプログラムです。
(利用される場合は自己責任でどうぞw)
もともと、実験の処理を行わせるスクリプトがPerlで書かれているというのもあるんですが、
あまり使い慣れてはないので、一瞬「スレッドをサポートしてるんかな?」とか思って
しまいました。でも、今さらそんなわけないですよね。
googleを使って調べてみると、簡単なサンプルが落ちていました。
[web] Perlでマルチスレッド - 結城浩
これってほとんどJavaと同じような感覚で使えますよね。
Javaなら、Runnableインターフェースを実装したクラスのインスタンスをThreadに与えて
runメソッドを呼び出して、joinメソッドでスレッドの終了を見届ける(?)ので、
それと置き換えて考えれば簡単に覚えられそうです。
以下がそのサンプルプログラムです。
(利用される場合は自己責任でどうぞw)
use strict;
use threads;
my $thread1 = threads->new(\&main, "One");
my $thread2 = threads->new(\&main, "Two");
$thread1->join;
$thread2->join;
print "done.\n";
sub main {
my ($name) = @_;
for (1..10) {
print "I am $name ($_)\n";
threads->yield();
}
}

最近のコメント
hszaki on ハワイアン・バーガー: 残念・・
alto on ハワイアン・バーガー: 食べたその日にこの記
tetsu on ハワイアン・バーガー: マヨネーズは・・・、
hszaki on ハワイアン・バーガー: マヨネーズ入っていた
tetsu on MovableType5にアップグレード: 指摘ありがとうござい
hszaki on MovableType5にアップグレード: 新年早々、エリクサー
tetsu on FFXIII: win2000って.
alto on FFXIII: こっちでも仕事でちょ
tetsu on 所属オケの演奏会: ごめんなさい^^;