さじろーどっとねっと
<PERLメモ>

Perlのテクニカルメモです
文字列を指定の文字で区切る。それを別の領域に入れる
2000/08/19-02:34:30
これは一般的に使われています。(ここに書く必要があるかなっと思いますがとりあえず...)

カンマ区切りの文字列を別の領域に入れる方法
????PROGRAM START????
$string="これは,テスト,です";
($word1,$word2,$word3)=split(/\,/,$string);
print "word1=$word1\n";
print "word2=$word2\n";
print "word3=$word3\n";
????PROGRAM END????

結果はこうなります
word1=これは
word2=テスト
word3=です

配列に入れたい場合はこうします。
????PROGRAM START????
$string="これは,テスト,です";
(@word)=split(/\,/,$string);
foreach(@word){print "word=$_\n";}
????PROGRAM END????

結果はこうなります
word=これは
word=テスト
word=です

もちろん区切り文字は文字列でも大丈夫です。
例えば
<>の時は、"/\,/"を"/<>/"に変えます。
aaaの時は、"/\,/"を"/aaa/"に変えます。
=の時は、"/\,/"を"/=/"に変えます。

結構簡単に文字列操作ができるので便利です。

ファイルを逆順に読む
1999/9/9-12:26
簡単そうでいまいち簡単に出来ません。そんな訳ですが、一般的なやり方を説明します。

---- これが簡単で一般的な例 ----
open(IN,"xxxx.dat");
@data = <IN>
@data = Reverse @data;
close(IN);
-------------------------------

---- UNIX(ソラリスの場合) ----
open(IN,"tail -r xxxx.dat |");
@data = <IN>;
close(IN);
-------------------------------

---- Linuxの場合 --------------
open(IN,"tac xxxxx.dat |");
@data = <IN>;
close(IN);
-------------------------------

どれも結果は逆になります。Linuxはチョット不安...(私の持っている、RedHat5では、”tail”ってコマンドがありません。)

オープン時にコマンドが入るので、WINDOWSでは使えません。openにコマンドが入るのは便利なんだけど、OS依存するのでサーバーのバージョンとかが影響してしまいます。

一番始めの例が一般的なんでしょうね。

配列から、必要なレコードだけ抽出する。
2000/08/19-02:21:49
これは結構戸惑いました。

なんでなぜかって言うと、日本語の場合、検索で引っかからないケースが良くあります。これを解消するためにはどうすれば良いかって考えたらちょっと大変でした。

日本語が入っていなければこんな感じで書けます。

@data=("aaa<>01","bbb<>02","ccc<>03","ddd<>04");
# @dataの中からaaaを含むレコードを抽出します。
@kekka=grep(/aaa/,@data);
print "@kekka";

出力されるのはこのレコードです。
aaa<>01

しかし、日本語が入ってしまうと上手く行きません。これは一部の日本語がうまく検索できないからだと思います。そんでこんな感じで、grepの中にindexを追加します。

@data=("あああ<>01","いいい<>02","ううう<>03","えええ<>04");
# @dataの中から“あああ”を含むレコードを抽出します。
@kekka=grep(index("$_","あああ")>=0,@data);
print "@kekka";

出力されるのはこのレコードです。
あああ<>01

grepの使い方ですが、こうすればなんとかできます。でもパフォーマンス的には良く解りません。indexって関数は、文字列の検索です。検索文字列があれば、その文字数を返します。無ければ0未満の数字が帰ってきます。

結構使えると思いますが...どうでしょう?


ブックマークに追加する