ActivePerlとJperlの違いは?

[上に] [前に] [次に]
なな 2000/06/06(火) 14:49:35
こんにちは。正規表現について質問なんですが、

現在私は
A■if ($code =~ /^$/) {
B■if ($code =~ /^#/) {
の二つのパターンマッチを使っています。

ActivePerlだと正常に動作しますが、JperlだとなぜかA■の方がマッチしません。
どうしてなんでしょう?わからなくて困っています。

ActivePerlとJperlの違いを教えて頂けたらと思います!

もた 2000/06/06(火) 16:08:19
A■を以下のコードで試しましたが、JPerlでもActivePerlでもちゃんと
マッチしました。

$code = "\n";
if ($code =~ /^$/) {
        print "Matched!\n";
}

JPerlのバージョンはどうなっていますか?

なな 2000/06/06(火) 16:25:28
もたさん有り難うございます!

CSVのファイルを読んでLOOPし、
行に何も入っていなかったら処理する

という処理を行おうとしていました。

ローカルパソコンのActivePerlでテストし、同じ物をUNIXサーバ(Jperl)にアップして
テストをした時に出来なかったのです。
ちなみにJPerlのバージョンはJPerl5です。

なるほど〜もたさんの通りに
試しに$code = "\n";を入れてから処理をするとサーバーの方でも動作しました。
という事は。。。

CSVの読み方に原因が??
う〜ん。さっぱりわかりません。。。
同じ物を動かしているのにどうしてできたり出来なかったりするんでしょう?

教えて頂けると有り難いです。
初心者ですいません〜

もた 2000/06/06(火) 17:03:12
>ちなみにJPerlのバージョンはJPerl5です。
もうちょっと詳しく分かりますか?
ちなみに当方は jperl5.005_03-990703 EUC version です。

JPerl云々よりもWindowsとUNIXの改行コードの違いによるものかも
しれません。
if ($code =~ /^\r?$/) {  #"","\r","\n","\r\n"にマッチ
とするとどうなるでしょうか?

Fuji.♪ [E-Mail] [HomePage] 2000/06/06(火) 17:03:39
JPerlの入っている環境で perl -v してみてください。
5の下の細かい数字が重要になってくるんですよ。 (^_^;
5.003とか、5.004とか、5.005とか。

ActivePerlの入っているローカルマシン上でも同じ事をして見てください。
5.005や5.6じゃないですか?

なな 2000/06/06(火) 17:27:47
[[解決]]

もたさん、Fuji.♪さん、回答有り難うございます!

もたさんの言う通り、改行コードの問題でした!
お粗末な結果で申し訳ございません。。。
そうですか。UNIXの改行コードは「\r」なんですね。
勉強になりました!

Fuji.♪さん
せっかく回答頂いたのに、申し訳ございませんでした。
でもバージョンの見方を知らなかったので勉強になりました!

沢山勉強させて頂きました。
皆さんのご親切本当に感謝いたします。
有り難うございました!!

2000/06/06(火) 17:32:34
いえ、UNIXの改行コードは'\n'です。'\r'はMacです。
ついでに、Windowsは'\r\n'です。
もたさんの回答は、改行コードの解釈に汎用性を持たせたものと言えましょう。
ちなみに、私は結局何が問題だったのかよくわかってなかったりします。

なな 2000/06/06(火) 17:58:26
あれ?そうなんですか?

う〜ん。。。
試しに
if ($code =~ /^\n?$/) {
というのもやってみましたが、通りませんでした。
if ($code =~ /^\r?$/) {
だと通るのです。

どうしてなんでしょう?
無知な私にはどうしてなのかはわかりません。
すいません・・・

2000/06/06(火) 18:09:55
CSVファイルをバイナリモードでFTP転送していませんか?
多分、それが原因のような気がします。
と言うか、ほぼ間違いありません。
CSVファイルをアスキーモードで転送すればうまくいくと思います。

なな 2000/06/06(火) 18:28:55

偽 さん有り難うございました。

試してみましたら、全くその通りでございました!!
そうなんですか〜くうう〜当初の予想とは全然外れていて本当にお恥ずかしい限りです。
かなり勉強させて頂いています。

すいませんあの、もうちょっとお聞きしてもよろしいでしょうか?

あほな質問なんですけど、どうしてCSVファイルは
アスキーモードで送らなければならないのでしょうか?

2000/06/06(火) 18:44:09
それは、まさしく改行コードの問題があるからです。
ファイルは、大きく分けるとテキストファイルとバイナリファイルに分けられますが、
テキストファイルはアスキーモード、バイナリファイルはバイナリモードで転送しなく
てはなりません。
そして、CSVファイルはテキストファイルに属します。だから、アスキーモードで転送
してやる必要があるのです。
ちなみに、大雑把な見分け方ですが、エディタで表示したときにちゃんと読めるのがテ
キストファイル、派手に文字化けしているのがバイナリファイルです。
#もっとも、Windowsのメモ帳はShiftJIS以外の日本語コードを解釈できないので文字
化けを起こすことがありますが。

sadahiro 2000/06/06(火) 21:43:30
Windowsでは改行に \r\n を、UNIXでは改行に \n を使います。
ActivePerlはWindows上で動作するように移植されたPerlです。
ActivePerlでは入力時に \r\n → \n の、出力時に \n → \r\n の変換を行います。
これはOSの使用する改行コードが違っても、同じコード(プログラム)が使えるための配慮です。
(このような変換をさせないためには binmode という関数を用います)。
ところで、UNIX上で動作するPerlやJperlではこのような改行コードの変換を行いません。

Windowsでは空行が \r\n です。
ActivePerlで読みこむと入力時に \n に変換されるので、/^$/ にマッチします。
UNIX上のPerlですと \r\n のままなので \r がある行と見なされマッチしません。

WindowsからUNIXに転送するとき、
\r\n → \n の変換を行うのがアスキーモード(テキストモードともいう)、
この変換を行わないのがバイナリモードです。

なな 2000/06/07(水) 09:37:58
偽 さん、sadahiro さん有り難うございました!!

ご親切本当に感謝いたします!

うわ〜すっごい勉強になりました。
わかり易く説明して頂きまして本当に本当に有り難いです。

有り難うございました!!!!

[上に] [前に] [次に]