Perlについての質問箱 2箱目

このエントリーをはてなブックマークに追加
Perl について議論するスレです。
Perl は言語の一つです。 CGI ではありません。
UNIX 系 OS が吐き出す膨大なログに頭を抱えている人、
C/C++ に挫折して Perl で再教育を受けている人、
Perl で HTTP サーバを立てた神などの降臨をお待ちしています。

繰り返しになりますが Perl は CGI ではありません。(GNU is Not UNIX)
Perl は WebProg へという方は C も Ruby も向こうで議論してください。
また、CGI に関する質問も向こうでお願いします。
2棄教者 ◆egKIKYO7cg :02/10/04 08:38
2get
スレ立て乙
1=2
うわ・・・
Perl は WebProg の方が人が多いよ
C は こっちの方が人が多い
 
5デフォルトの名無しさん:02/10/04 08:53
おつ
6荒れませんように:02/10/04 10:28
>>1 お疲れさまです。ところで、

> 繰り返しになりますが Perl は CGI ではありません。(GNU is Not UNIX)

この意味がワカラン。なぜに GNU が出てくる(w
>>3
>>2=>>3という罠では?
コテが出てきた時点で終わったな、、、
アーメン
いやー、立ててくれましたか。
>>1さん、乙彼さま。
10デフォルトの名無しさん:02/10/04 14:04
2づつカウントされる
カウンターってありますか?
>>10
ここは Perl の話をするスレです。
CGIはWebProgでどうぞ。
>>10
あるよ。$cnt+=2;
#!/bin/perl
#ム板ならこう書くのが正しいと思うのです

/binかよ
15棄教者 ◆egKIKYO7cg :02/10/04 18:53
cygwin で
$which perl
/usr/bin/perl

Debian GNU/Linux で
$which perl
/usr/bin/perl
棄教者、、、いいかげんにしろよ

すきな(使用)バージョンはなんだ
Perl5.8
Perl5.8pre
Perl5.7
Perl5.6
Perl5.6.1
、、あたりで
17棄教者 ◆egKIKYO7cg :02/10/04 19:16
cygwinで
$ perl -v

This is perl, v5.6.1 built for cygwin-multi

Copyright 1987-2001, Larry Wall

Debian GNU/Linux で
$ perl -v

This is perl, v5.6.1 built for i386-linux

Copyright 1987-2001, Larry Wall
18 ◆hMJAPH9PWA :02/10/04 19:40
>>16
ActivePerl使いなんで5.6.1。5.8が出たらその刹那アップデートします。

# XSの再コンパイルが面倒くさそうだけど…
前スレでActive PerlのFile::Find使ったとき日本語のファイル名が変に扱われて
どうのこうのと言ってた人がいたが5.8になったらどうなるかねえ
20nobodyさん:02/10/04 20:27
>>15
Solarisで/opt/bin/perl
FreeBSDで/usr/local/bin/perl
って、数年前の話、今はcygwinとLinuxのユーザ。
21デフォルトの名無しさん:02/10/05 10:45
らくだ本3版てもう出てるの?
日本語版ね
22nobodyさん:02/10/05 10:52
>>21
出てる。ここで盛んに話題になってたよ。
49 C 【Perl,CGI】参考書籍 第三版 [WebProg]
>>22
アレ、そうか。でも見ないな。田舎だからか
24デフォルトの名無しさん:02/10/05 13:14
つまんない質問なんですけどFILEアップロードするプログラムなんですけど
<input type=FILE>でUPするとたしかにプログラムは動くのですが
ファイル名を表示することができません。
cgi.libをつかっています
$IN{’’}でとってきてprintとすると文字がばけます
エンコードするのですか?
よくわかりません。初心者です。
早速出たね。

ここはCGIの質問するスレじゃないぞ。>>1をよく読みタマへ
2624:02/10/05 16:10
>>1
を読みましたGNU is Not UNIXってなぜあそこに書かれているのか、、、、
書いた人の頭がすこし心配です
webProg板に逝ってきます
さ(・O・)よ(・。・) おなら(≧〜≦)=3 ブーッ!
>>26
> を読みましたGNU is Not UNIXってなぜあそこに書かれているのか、、、、
> 書いた人の頭がすこし心配です

お前の知識/理解力がだいぶ心配だよ。
CGI 初心者は CGI-ML にでも行ってくれ。
http://forest.ne.jp/cgi-ml/
29厨房:02/10/05 22:27
$hensu1、$hensu2、$hensu3、がありまして、

if ($hensu1 = 1){$kotae1=1}
if ($hensu1 = 13){$kotae1=2}
if ($hensu1 = 111){$kotae1=13}
.
.
if ($hensu2 = 1){$kotae2=1}
if ($hensu2 = 13){$kotae2=2}
if ($hensu2 = 111){$kotae2=13}
.
.

などの条件分岐を作っているのですが(実際はもっと何十行もあって、数値は適当です)、
これをもっと短くできないでしょうか?お暇な方ご教授願います。
>>29
$hensu1〜3 と $kotae1〜3 は配列にスレ。
たくさん並んでいる if 文は連想配列がいいかと思う。

こんな感じ... (perl うろ覚えだし、実行環境が手元にないからあくまでも感じだけね。)

my @hensu, @kotae;
my %Map;
$Map{1} = 1;
$Map{13} = 2;
$Map{111} = 13;
for(my $i = 1..3){
 $kotae[$i] = $Map{$hensu[$i]};
}
31厨房:02/10/05 22:57
>>30
取りあえずお礼だけ…
ありがとうございます。今からやってみます。
32 ◆hMJAPH9PWA :02/10/06 00:04
myの引数が複数あるときはカッコでくくらないとダメだよ。
my($foo, $bar) このようにね。

あと%Mapは
my %Map = (
1 => 1,
13 => 2,
111 => 13,
);
という風に初期化するほうが読みやすぃし書きやすいので吉だと思うな。

forはfor(list)のforeach形式と一般的なfor(init; test; continue)だけ。
そのケースの場合は
for my $i(1 .. 3)じゃないと思った通りには動かないよ。
おまえらオナニーしたいだけじゃないかと、、
”厨房”は連想配列とかわからないと思われ、。
>>33
> ”厨房”は連想配列とかわからないと思われ、。

お前は、サンプルソースも読めないのか ?
>>33
いやPerl弄るなら連想配列は必須。
使えないのはさんまのしっぽばかり食ってるようなもん。
36デフォルトの名無しさん:02/10/06 00:56
いつの間にか前スレが無くなって
新しくスレが立ってた。
37nobodyさん:02/10/06 02:27
>>33
厨房様には、WebProg板に
CGIとかPerlとか超初心者なんだけど、
【Perl】初心者コーナー Part6
をご用意してお待ちしておりますので、どうぞご利用ください。


Perl は CGI ではありません。(GNU is Not UNIX)
39デフォルトの名無しさん:02/10/06 04:10
>>32
それはmyしない方が良いんじゃないの?
>>38 アホ。PerlはCGI以外の用途にも用いられていることと
"GNU is Not UNIX"に何の関係がある。恥ずかしいから止めろ。
41nobodyさん:02/10/06 09:15
>>40
類同的関係ってやつだ。頭の悪いお前に説明してやろうか?
GNUはUNIXだと、逆にUNIXはGNUだとよく誤解されるが、実際は
UNIXでないGNUもGNUでないUNIXもある。PerlはCGIで使われる
言語だとかCGIといえばPerlだと思っている厨が多いが、Perl
とCGIはそれぞれCGIとPerlよりも広い範囲をカヴァーしている。
分かった?
類似的関係・・・ぷ
低脳が思いつきそうな戯言だな。さすがPerlユーザ。
43nobodyさん:02/10/06 09:22
>>42
ただけなすことしかできない低脳。もしかしてrubyキティか。
44デフォルトの名無しさん:02/10/06 09:22
なんだ。やっぱり耐えきれずに新スレ立てたのか(大爆笑)
45デフォルトの名無しさん:02/10/06 09:24
ただ貶されるだけの糞言語、それがPerl
そしてそれにいつまでもしがみつくのがPerlユーザ
46デフォルトの名無しさん:02/10/06 09:25
類似的関係だって。
すごいや。馬鹿の極みだね。
47デフォルトの名無しさん:02/10/06 09:29
糞言語には糞スレがお似合い
WebProgにでも引きこもって一生出てこないでくれ。
くさいんだよ。お前らは
とりあえず、まともに話が出来ないようにすればスレも自然消滅するだろうがな。
>>44-47
RubyでCGI書きたいんですが。
板違いでしょうか。
>>50
板違いです。首吊って氏んで下さい。
GNU is Not UNIXは確かに物凄く恥ずかしい
漏れはrubyユーザではありません
53nobodyさん:02/10/06 10:00
>>52
何か後ろめたい気持ちでもあるんか。
Ruby user is using OS called NotUNIX.
55 ◆hG4XfSMGTg :02/10/06 10:08
恥ずかしいと思わない奴はずっと嗤われていればいいよ。
>>52==1

>>53よ。まあ、つまり、そういうことさ。憶測だがな。
>>55
トリップがSMGか。素敵だな。
58 ◆hG4XfSMGTg :02/10/06 10:17
糞固定までちょろちょろ出てきやがって
死ね
>>55









( ´,_ゝ`)フーン
6052:02/10/06 10:19
52!=1
誰がみても恥ずかしいと思うが如何?
61デフォルトの名無しさん:02/10/06 10:23
Perlユーザ=無知、無恥
>>1
GNU は UNIXでは無い、とも読めるし、
GNU は NotUnixだ、 とも読める。

isn't と書いてくれないと、激しく紛らわしい。
>>61
誰がみても恥ずかしいと思うが如何?
64nobodyさん:02/10/06 10:30
普通は、Non-UnixとかNo-Unixだよ。Notは動詞に付ける。
したがって、nobodyさんの言ってる通り。



65デフォルトの名無しさん:02/10/06 10:31
恥ずかしすぎ。Perlゆーざのレベルが知れるなw
66529:02/10/06 10:31
>>39
> それはmyしない方が良いんじゃないの?

なんで ?
67nobodyさん:02/10/06 10:32
理由も説明できないで恥ずかしい恥ずかしいってばかみたい。
>>65はrubyアフォです。
みごとに>>49の意図通りになったな
>>64
> 普通は、Non-UnixとかNo-Unixだよ。Notは動詞に付ける。
> したがって、nobodyさんの言ってる通り。

ねぇ、あんたたちは、"GNU is not Unix" 自体がおかしいと言って騒いでいるの ?
→◆hG4XfSMGTg
こいつは、前からPerlスレ荒らしやってたので、発言停止依頼しました。
>>71 んで、効果はあったのか?
73nobodyさん:02/10/06 10:40
rubyキティが紛れ込んでるので俺は発言を控える。
74nobodyさん:02/10/06 10:57
君たちUNIXに2つの意味があるの知ってる?
普通使ってるのは、SolarisやらFreeBDSやらLinuxを含めた
広義の意味での「ユニックス」だよ。まさかそこにけちを
つけてんじゃないだろな。したがって、nobodyさんが言って
ることが正しい。




7552:02/10/06 11:01
余計なこと書かずにperlやろうぜ!
でよかったんじゃないの?
漏れは心配して逝ってるつもりなんだけど
>>74
> FreeBDS

はぁ ? 言ってる内容も意味不明だし...。
77nobodyさん:02/10/06 11:16
うぜぇよ禿
>>77
> うぜぇよ禿

ププッ、指摘されてあせってやんの。素直に、typo だよって言えばいいのにね。

「言ってる内容も意味不明だし」の方に触れちゃったかな ?
逆鱗に触れました。
ズゴゴゴゴゴゴゴ
FreeBSD(自由な牛海綿状脳症)
81nobodyさん:02/10/06 11:28
断発宣言(発言を控える)してから私じゃないnobodyさんが2人
出現。これからは、デフォルトの名無しさんでいくからそう思え。
もう断発はやめた。
Perlでオブジェクト指向のオセロ書いて、
CやC++やJavaを使う輩を叩きのめしませんか?
やってもいいけど、時間かかるやろ。それと、あそこのスレにもruby
キティが出入りしてたからな。
発言を控える
→発言を断つ?
>>82
何かいてもRuby厨は文句言うに決まってるw
Ruby ユーザのふりして Perl を攻撃し、Rubyユーザが反感をかうように仕向けている
粘着基地外がいます。騙されたり煽られたりしないようにお願いします。

日曜日の朝に出現することが多いです。
>>86
お前のことか ?
>>82
ここで質問にちゃんと答えてるやつは、
CかC++メインのやつだろ。
そういうふざけたことを言うもんじゃない。
89デフォルトの名無しさん:02/10/06 13:58
http://enya-mp3.tripod.com
やっほ〜、↑はRuby界の有名厨房。るびきち こと 西本孝志君の写真だよ〜☆
彼女いない暦25年の無職童貞だからってなめてんじゃねーぞ!
>>86
誰がそれを信じると?
Rubyユーザの閉鎖性&攻撃性&粘着性はみんな知ってますよ。
>>90
あんたは荒らしている本人か、それか嘘を嘘と見抜けないアフォですか?
>>90
それじゃ基地外の思う壺
だいたいが Perl スレで Rubyユーザを名乗って荒らしている本人が、
Rubyユーザは最低とか自作自演で言ってるんだろ?みてりゃわかるじゃん。
結局悪いのはそのキチガイで、PerlユーザもRubyユーザも被害者なんだよ。
そんで被害者同士でいがみあっていたら、それこそが荒らしの望む展開だって
ことぐらい理解しろよ。
つーか、質問箱なんだから質問と回答以外は書かないようにしようよ。(まあ、これも違うと言われればそうなんだけどね。)
スレが 93 まで行ってるのに質問が一つだけって言うのはちょっとまずいよ。
質問ないのかなぁ...。
95厨房:02/10/06 20:19
>>30,32
今更ですがうまく行きました。
ありがとうございますた。
96デフォルトの名無しさん:02/10/06 22:10
プププ
お前らひひひ必死だな
あの…90はネタのつもりだったんですが…(汗
>>97
正直、ネタで>>90のような投稿は自重して欲しい。
>>82&83
オセロなんてJava or C言語の新人研修でみんなちゃらっと
作るよ
時間なんてかかんないと思うけど
>>99
むちゃいうな
いや、UI なしなら割とすぐかと。
>>100
マジレスよ
だからperlでもできるはず
>>99
テトリスなら作ったが、オセロなんて知らんぞ。
あの手の、思考エンジンで優劣が決まるようなプログラムは
普通のアプリを作る際にはあまり参考にならんだろ。
>>98
んだ。
>>103
普通のアプリを作るときに優秀なアルゴリズムを組んだ経験があれば
srcの品質が高まるよ
やって無駄はないかと思うけどね

>>105
あんた、実際にあの手のゲーム作ったことないだろ。
思考エンジンを強化しようとするとたいがいつぎはぎだらけになり
ロジックも糞もなくなってくる。
目的が勝負に勝つことになるからね。
>>101
> いや、UI なしなら割とすぐかと。

おいおい、次は思考ルーチン無しならとか言い出すんじゃないだろうな?
>>107
本格的なオセロを作るなら別だが、
OOは戦場では必要なしスレ向けなら
・おけるところからランダム
・取れる枚数が多いところ
程度の馬鹿ルーチンでいいでしょ。
109hoge&lo;hoge&lro;:02/10/07 13:48
hoge
>>108
それじゃぁ、誰でも作れるから面白くない。
それを5行で作るっていうのはどうよ。
Perlらしいじゃん。
112デフォルトの名無しさん:02/10/09 19:07
Windowsで漢字混じりのテキストファイル読むのにseek使ったらまずいんでしょうか。
し〜くしくしくしくしく。
>>112
べつにまずくないでしょう。
>>114
\r\nの中間とかに飛んでもだいじょうぶかなぁ。

らくだ本第三版二冊で壱万円
ActivePerl-5.6.1.633でpl実行する際に表示されるログの文字
味気ないんで色つけたいんですけどなにか方法ありますか?
>>117
ありがとう!
かなりわかりやすいです。
やってみます
>>115
はあ? まずい場所に飛んだら、脇によける必要は当然あるでしょう。
文字の境界にも気をつけなければいけませんね。
>>112
とりあえず ActivePerlには binmode が seek にも影響を与えるって書いてあるけど
どういうことは知らん。テキストモードで使えないとは書いてないけど\r\n境界の話は
かいてなかったなぁ。
121 ◆hMJAPH9PWA :02/10/10 20:11
>>116
5.6以上だとTerm::ANSIColorってモジュールが標準でついてくるね。
122デフォルトの名無しさん:02/10/10 22:45
( ´_ゝ`)ノ質問です。

Perlでアンケートの送信フォームを作りました。
送信ボタンを押したら、メールが送信されるやつです。
メッセージを入れる部分で改行したら、届いたメールには改行されずに<br>
が表示されています。

どうすればよいのでしょうか。
>>122
CGIか?
CGIならWebProg板に逝け。
124デフォルトの名無しさん:02/10/10 23:43
はい。
>>122
改行コードを<br>にするのを辞めるか、或いは<br>を改行コードにするかどちらか。
改行コードは\r\n。
>>1
前スレ
http://pc3.2ch.net/test/read.cgi/tech/1017736187/

くらい貼っといてくれ。
SDBM で tie した場合、ロックされてないみたいなんですが、ロックするにはどうしたらいいんですか?
flock使おうにもファイルハンドルがわかんないし。
>>127
flockってファイル名(とモード)を引数に取るでしょ。
>>127
デバッガで
x tieの返り値
してみそ
>>128
何言っているの?(^_^;)
PerlでもCでもファイル名は取らないよ(^_^;)
機能上、オープンしていないファイルには使えないでしょ(^_^;)
いまどき珍しいラフカディオハーンの発見した日本人の奇妙な薄ら笑い。
>>127
1)SDBM_Fileを改造する。
2)DB_Fileを使うことにする。
133デフォルトの名無しさん:02/10/11 17:30
質問です。
MIME:Parser.pm
を使ってmbxファイルからfrom,subject,bodyだけを抜き出したいのですが
outlookから送られた添付ファイル付きのメッセージだけが上手く抜き出せません。

こんな感じで使ってます。
my $oParse = new MIME::KbParser;
$oEnt = $oParse->parse_data($mail) || die "couldn't parse MIME stream";

どうやらmulti-partを上手く分けれてないようです。
$oEnt->partsを見ても何も入ってません。
その時はfrom,subjectは上手く抜き出せているようです。

boundaryの位置が悪いんだろうとは思うのですがどうやれば良いのか分かりません。
何かオプションがあれば教えて頂きたいのですが…

お願いします。
>>132
DB_File なら DB_FH にファイルハンドルが自動的にはいるわけですね。
SDBMが使えないのでこいつを使わせてもらうことにします。
>>134
自動的になるわけじゃないよ。マニュアルをもちっと読め。
正規表現が長くなった場合に複数行にわたって書くにはするにはどうしたらいいですか?
\RETだとインデントの関係で読みにくいし、変数に入れるとパフォーマンスが落ちるので
いい方法を探しています。
137デフォルトの名無しさん:02/10/13 01:23
>>136
/x使って、インデントするなりコメントつけるなり好き勝手しやがれ!
関数の呼び出し元の変数にアクセスする方法ってありますか。
引数に参照として渡すのが普通だと思うけど・・・
140デフォルトの名無しさん:02/10/13 15:13
超絶糞言語
超絶テク
>>136
> 変数に入れるとパフォーマンスが落ちるので
信じがたいな。oつけたら変わらんと思う
>>142
何度も使う場合、2〜3倍違うがなにか?
>>143 バカ?
>>142
せめてラクダ本ぐらい読もうよ。
>>145
せめてラクダ本ぐらい読もうよ。
>>142
この場合、oは関係ないぞ。

>>143
正規表現の複雑さとか、ループ回数によって倍率はいくらでも変えられるんで
その比較は無意味。

まあ、ループの内側じゃなければ問題なし。
>>143=147
恥ずかしいやつ(w
DBD::ODBCってFileDSN使えないんですか?
ASPとかJavaScriptだと使えるのにPerlはDB関連は弱いみたいですね。
150133:02/10/14 01:52
>>133ですが
「○○を読め!」とか間接的なアドバイスでも良いのでお願いします…
全然分かりません(涙)
MIME::Parserは使ったことないけど
http://groups.google.co.jp/groups?hl=ja&lr=&ie=UTF-8&oe=UTF-8&c2coff=1&q=%22MIME%3A%3AParser%22+Outlook
ここらへんを丹念に読むとか。
モジュールも全部Perlなんだろうしこういうときはデバッグしてコミュニティにフィードバックせよというのが流儀では?
152デフォルトの名無しさん:02/10/14 18:24
避難所はこっちかな
帰れ。面汚し
154デフォルトの名無しさん:02/10/14 18:32
age
あれは絶対に規制されるな。
初心者ですが、何のことが問題になってるのか分からないんですが。
>>155
どうするんだろ。あれにしかない機能が2つくらいあるけどね。
あれってなんだ?
コレですよコレ
160デフォルトの名無しさん:02/10/15 21:12
PerlスクリプトをPerlがインストールされていないWindowsで使いたいのですが、
変なdllなどはいらないexeにコンパイルするコンパイラなどはないでしょうか。
C++に変換するものでもかまわないです。
>>160
perl2exeっていうのでexeに変換できる。
Shareware
30日間らしい
未レジスト状態で作ったexeは、実行時に「perl2exe未レジスト版で作成しました」のようなメッセージがでる。

perl2exeでコンパイルするマシンにはPerlが必要だとおもうけど
162デフォルトの名無しさん:02/10/15 22:22
>>161
perl2exeで検索したら類似品でPerlAppってやつで出来るみたいなので
そっちでやってみます。ネイディブコンパイラじゃなくてソース埋め込み型みたいですが。
163デフォルトの名無しさん:02/10/16 09:33
>>155
ム板住人としては、あれの動作原理が知りたいところなんですが
どうやっているのでしょうか?
164デフォルトの名無しさん:02/10/16 09:54
WebProg板のPerl初心者で質問したんですが、場違いだったみたいでこちらへ来ました。
↓これを使いたいのですが
http://www.perlpress.com/perl/gres

例の通りに実行しても全然動かないのですけど、どうやれば動くのでしょうか?
以下は何もおきずに終わります。
perl gres.pl -e 's!and!or!g' *.txt

以下は"Processed 0 files." と表示されて終わります。
perl gres.pl -v -e 's!and!or!g' *.txt

ファイルを見つけられないのかとファイル名を直接指定すると、
perl gres.pl -e 's!and!or!g' readme.txt
GLOB(XXXX) ←こんなのが画面いっぱいに表示されて、readme.txt は 0 バイトになってしまいます。

どうかよろしくおねがいします。
165デフォルトの名無しさん:02/10/16 11:32
C、C++は、ちょっと知っていますが、Perlについては、ほとんど、全く知らないものです。
Perlについて、お薦めの本があれば、教えてください。主な用途としては、データのテキスト処理、CGIなどです。
ちょっと、本屋で見たのですが、基本的な文法しか書いてないとか、逆に難しすぎたりでなかなかいい本がありません。基本的な知識から、CPANの使い方まで、サクッと書いた本はないものでしょうか?
(どうか、らくだ本という殺生なことは言わないでください。)
よろしくお願いします。
166 ◆hMJAPH9PWA :02/10/16 12:01
>>164
誰も答えたくないのは質問の仕方が悪いからとは思わなかったの?
多分、自分の環境やそのプログラムについて一言も触れていないので、ネタだと思われたんだよ。

とりあえずマジレスすると、古いPerlでは動いたのかもしれないけど今は普通に動かないよ。
既にメンテナンスされていない効率の悪いプログラムをあえて使う必要は無いと思うけどね。
どうしても使いたいなら下のように変更してね

# diff -u orig.pl new.pl
@@ -77,7 +77,7 @@

while( <$fin> ) {
eval $expr ;
- print $fout ;
+ print $fout $_;
}

close $fout ;
167棄教者 ◆egKIKYO7cg :02/10/16 12:13
>>165
ラクダ本は厚いだけで難しくないです。楽に学習できるから楽だ本なのです。
漏れが最初に買ったのは
CGI & Perl ポケットリファレンス
と言う本です。文法は簡単な解説だけで後はすべて関数の説明。
意外なことにこれがかなり役に立った。
>167
おい、英語の原著でも楽だから楽だ本なのか?
>>165
CとC++できるのなら、Perlなんておちゃのこさいさいだよ。
添付のドキュメント、Webで見つかるその日本語訳、既存のスクリプト読み
だけでマスターできるじゃん。
3日あれば大丈夫だよ。
170デフォルトの名無しさん:02/10/17 00:03
>>165

初めてのPerlはどうよ。
立ち読みして味噌
易し過ぎるかもしれないが素人向けの本ではないと思った。

http://www.oreilly.co.jp/BOOK/lperl2/
まあラクダ本だろうね。
元々C屋を対象に書いてるし。
172デフォルトの名無しさん:02/10/17 07:50
>CGI & Perl ポケットリファレンス
これないと仕事に差し支えるくらいお世話になった。
173棄教者 ◆egKIKYO7cg :02/10/17 09:59
>>172
手垢が付いて汚れているし、どこにでも持っていくからボロボロになっているYO!
174デフォルトの名無しさん:02/10/17 18:47
らくだは漏れにとってむずいが良書。
175デフォルトの名無しさん:02/10/17 21:37
>>165です。
やはり、ラクダ本ですか。CGI&Perlポケットリファレンスですか。今度、探してみます。
どうもありがとうございました。
176デフォルトの名無しさん:02/10/18 06:30
perl5.6 の unicode って「実験段階」ってことになってるけど、
じっさいどれくらい使えんの? 使ってる人いる?

いまだに日本語処理には jperl5.005_03 使ってんだけど、
そろそろ乗り換えたいんだな。
177Ruby!!!!!!!!!!!:02/10/18 06:42
糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞
>>165
>>169
俺もC、perlの順で学んだけど、本は使わなかった。Webのみ。
凄く有名なページだと思うけど、とほほ と use object にお世話になりました。
日本語版のマニュアル(perlmanj)もわかりやすいと思う。

でも短期間で効率よく覚える、っていうならやっぱり本なんだろうなあ。
179デフォルトの名無しさん:02/10/18 07:58
今日もるびキティが吠えているようですが、実用的なPerlについての質問です。
実行時にモジュールを動的に選択して利用するようにするにはどうすれば良いのでしょうか。
180デフォルトの名無しさん:02/10/18 09:39
俺ラクダ本だけでperl勉強したから、普通に使えるようになるまでに3年くらいかかったな…
larning perlが欲しかったんだが、田舎なので売ってなかった
#PerlInterpreter MultiLineVersion
perl -e 'while(<>){if($_ eq "\n"){eval $s;print $@;$s="";}else{$s.=$_;}}'
182 ◆hMJAPH9PWA :02/10/18 10:41
>>179
perldoc -f require

if(expr){
require Module::A;
}else{
require Module::B;
}

useと同じ効果を期待するならBEGIN内におく。

BEGIN{
expr ? (require Module::A, import Module::A()) : (require Module::B, import Module::A());
}
>>182
動的にってことだから、こうじゃないのか?
$modname = "hoge.pl";
require $modname;

>>180
俺のときはラクダ本しかなかった。しかも赤。
184Ruby!!!!!!!!!!!:02/10/18 14:13
糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞
どっちでもいいだろ。さすが糞スレ。
糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞糞
185デフォルトの名無しさん:02/10/18 14:28
>>178
>でも短期間で効率よく覚える、っていうならやっぱり本なんだろうなあ。

ですね。大学の時の指導教官が、「ぱーるってのを学ぶにはどの本見ればいいの?」
と学生部屋からラクダ本を持って行って、だいたい4時間くらいでマスターして
いました。短時間でやろうというのなら本でしょう。機械可読なテキスト
だけで学ぼうとすると、「世界の仕組み」を掌握するだけでそれくらいの時間
はかかりますし。
186179:02/10/18 14:29
>>182-183
ありがとうございました。>>183のようにやればよかったのですね。
これでプラグイン機能が実現できますです。
>>185
どうでもいいけど、「世界の仕組み」ってのは何ですか
188Ruby!!!!!!!!!!!:02/10/18 20:48
糞pげんごどもsうぃうんべよぷい
日本語の不自由な方ですね
>>187
そのシステムの使い方やらデバッグ法やら情報の集め方などの
全大系を総称して「世界の仕組み」とかいうだろ?
この場合、「Perl世界の仕組み」ってことだろ。
>>190
寡聞にしてそのお言葉は存じ上げませんでした。ども。
192デフォルトの名無しさん:02/10/19 01:06
マルチでゴメソ。
質問です。
正規表現にマッチした部分だけを変数に格納するには
どう書けばイイですか?
193博士:02/10/19 01:13
そりゃな君、

$hoge =~ /...(hoge...hoge).../;

のように括弧でくくってやると、マッチした部分が $0 に入るのじゃよ。
>>193
博士、ウソ教えないでくだちい。
$0はメインスクリプト名。
部分文字列は$1から。
マッチ全体は$&でつ。
195192:02/10/19 03:38
>>193-194

ということは$1〜にセットされるんですね?
そのくらい試してみればすぐ分かるだろ。
perlユーザは馬鹿ばっかり(w
>>197
層が厚いってことなんだよ。
トップレベルは、(略)
>>198
トップレベルは、どの言語でもさほど変わらないと思うが、ボトムのレベルは言語間の差が激しいと思う。
Perlのようにユーザが多いと必然的にボトムのレベルは低くなる。
201デフォルトの名無しさん:02/10/19 13:07
システムデフォルトのDNSではなく、別のところから正引きを行いたいんですが
どうすればよいのでしょうか。
>>200
>>201 みたいな「スレタイトルが読めないヴォケ」がいるのも、ユーザー数のせいか ?
>>202
perlでって事だろ。
なんかそんなことするモジュールがあった気がする。
>>201
Net::DNS使えば?
205おなら:02/10/19 15:54
ぷう
おなら君、さーよおなーらー♪
207デフォルトの名無しさん:02/10/19 21:32
使ったことないのですが、ActivePerlってふつうの
Perlとどうちがうんですか?

208 ◆hMJAPH9PWA :02/10/19 21:37
>>207
PerlのWin32版で最も普及しているものがActivePerl。
標準ライブラリに加えて更にLWPなどのライブラリがバンドルされているほか、
Win32特有の機能が追加されていたりするね。
209デフォルトの名無しさん:02/10/19 21:56
>>208
厨房な質問なのにお答えありがとうございます。
UNIX上のActivePerlについてはいかがでしょう?
>>209
そんなの使ってるやついるのかな?
もしいたら、そのメリットを知りたいが。
211デフォルトの名無しさん:02/10/19 22:16
>>210
うちの会社で標準になるらしい。。。
212 ◆hMJAPH9PWA :02/10/19 22:22
ああ、そういやLinux版とかもあったっけ。すっかり忘れてた。

普通のPerlとの差は…どうなんだろう。
見たところやっぱりいろいろとバンドルされてるようだけど、perl本体の差はわからないな。
>>211 >>212
Active Perl つーよりPDKのことなんだろか??
214おれは暴走君だよ:02/10/20 01:14
#!/usr/local/bin/perl

$test = '0';

open (FH,">>unko.dat");

while ($test > 0) {
print FH "あ";
}

close(FH);

こんなプログラムを実行した場合の対処法を伝授してください。
A:気合
B:ファイル削除
C:サーバー管理人に謝る。「すんまそん」
D:その他

さてどれ?
>>214
頭の弱い方でつか?
プログラムの止め方も分からないのに実行するなよ
active perlで Net::DNS使おうとしたら Subroutine version redefined ...がいっぱい出てきて
使えないです。defined(@array) is deprecated も出ました。

Net::DNSは http://www.activestate.com/PPMPackages/5.6/で落してきたんですが、なんで使えないんでしょう?
201=216 環境とコードくらい書け。
218216:02/10/20 04:30
すいません。
Windows2000でActivePerl Binary build 633 (perl v5.6.1)
コードはたとえば以下のコードでもエラーが出ます
--
use Net::DNS;
1;
--
>>214
D: 「回線切って、氏ぬ。」
>218 変だな。同じ環境のはずだが、何ともない。
ところで、Net::DNSはどういう手順でインストールした?
その>>216のactivestate.comから落とした後、ppm経由でインストールしたか?
>>214
そもそも動かないんじゃないだろうか・・・。
$testが0だからwhileのところで0>0となり偽になってファイルには何もかかれず終了。
違ってたらスマソ
今221がいいこと言った!!
質問です。長文失礼。

文字列を変換処理するとあるCのライブラリを、perl5.8.0 から使いたい。
xs を使って書いてみたのはいいけど、どうもうまくいかないので
お知恵拝借したいところ。

1.Cのライブラリ側関数は strcpy( char* dst, char* src ); みたいな感じで、
src から dst に変換処理をかけながらコピーする。
dst が src よりも長くなる可能性はある。
2.char* dst は予めメモリ確保する必要がある。
3.perl からもこの関数と同じように使えるようにするため、
xs では hoge( dst, src ); とした。
4.実際使ってみるとうまく動いてそうなんだけど、
src に長い文字列(大体500bytesくらい)を与えると
Carp/Heavy.pm did not return a true value at /usr/local/lib/perl58/Carp.pm line 178, <IN> chunk 2.
とかってエラーが出る。

結局仕方なく my dst = 0 x ( length( src ) * 2 ); とかやって
しのいでいるんだけど、あまりにひどい処理なのでなんとかしたい。

また xs の時点で dst のメモリ確保をするのも考えたけど、
そのメモリをいつ開放すればいいのかわからないので実際に試してはいない。

うーん説明わかりづらいかも・・・。
224_gunzip ◆eiH/XdoCNg :02/10/22 01:35
>>223
概要は分かったけど、XSでどのようなコードを書いているかが分からないのでコメントしづらい。
それと、Perl側から $dest = hoge($src); のように呼ぶのが普通じゃないかな。
例を挙げると、<stdlib.h>のrealpath()で、$realpath = MyTest::realpath($path);と呼ぶ場合

----- MyTest.xs -----
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

#include <stdlib.h>
#include <sys/param.h>

MODULE = MyTestPACKAGE = MyTest

SV *
realpath(path)
    char *path
    PREINIT:
        char buffer[MAXPATHLEN]; /* <sys/param.h> */
    CODE:
        if (realpath(path, buffer) == NULL) {
            XSRETURN_UNDEF; /* RETVAL = &PL_sv_undef; でもよい */
        } else {
            /* bufferの内容をコピーした、新しいスカラー値を作る。
             長さに0を指定し、Perlに計算させる。*/
            RETVAL = newSVpv(buffer, 0);
        }
    OUTPUT:
        RETVAL
225_gunzip ◆eiH/XdoCNg :02/10/22 01:36
SV *
realpath2(path)
    char *path
    PREINIT:
        char *buffer = NULL; /* わざわざmalloc()するバージョン*/
    CODE:
        if ((buffer = malloc(MAXPATHLEN)) == NULL) {
            XSRETURN_UNDEF;
        }
        if (realpath(path, buffer) == NULL) {
            ST(0) = &PL_sv_undef; /* リターンスタックの先頭にundefをセット */
        } else {
            /* 上の例と同じようにRETVAL = newSVpv...としても可
            sv_2mortal()で、不要になり次第GCすることを許可する*/
            ST(0) = sv_2mortal(newSVpv(buffer, 0));
        }
        free(buffer); /* いらないので解放(コピー済み) */
226_gunzip ◆eiH/XdoCNg :02/10/22 01:40
>>223さんがしたいように、realpath($dest, $path); と呼ぶ場合

void
realpath3(dest, path)
    SV *dest
    char *path
    PREINIT:
        char buffer[MAXPATHLEN];
    CODE:
        /* destが妥当なSV値であるかどうかテスト */
        if (SvREADONLY(dest)) {
            XSRETURN_EMPTY;
        }
        if (realpath(path, buffer) != NULL) {
            /* sv_setpv()でbufferの内容をコピーする */
            sv_setpv(dest, buffer);
        }

/* おわり。間違ってもsv_grow() でバッファを引き延ばして、SvPVで得たchar *に直接書き込んではいけない*/
227デフォルトの名無しさん:02/10/22 13:23
>>224-226
なるほど。
やはり SV を使わないとダメってことですね。
いまちょっと別作業入っちゃってすぐに確認できないけど、
あとで動いたか報告します。
さんくす。

ちなみに、手元ではなにも考えずこんな感じにしてました。
いま思えばまともに動くわけがないよなぁ。
情けない…。

void
hogehoge( dst, src )
wchar_t* dst
wchar_t* src
CODE:
{
dst[0] = NULL;
hogehoge( (unsigned char *)dst, (unsigned char *)src );
}
OUTPUT:
dst

wchar_t* で渡して (unsigned char*) に cast しているのは
この hogehoge 関数の仕様で仕方ないってことで。
228223=227:02/10/22 13:28
ぐあ。223=227です。書き忘れた。しかも sageてない。
さらにしかも書き込み時の tab って無視されるのね…。
229_gunzip ◆eiH/XdoCNg :02/10/22 20:50
>>227-228
xsubppの吐いたCソースファイルを見てもらえば分かるけど、
/usr/local/lib/perl5/5.8.0/ExtUtils/typemap に従って、SV *からwchar_t *に変換する際に
wchar_t *dst = (wchar_t *)SvPV_nolen(ST(0));
wchar_t *src = (wchar_t *)SvPV_nolen(ST(1));
SvPV()でSVの文字列用の内部バッファを貰っているわけだから、
perlの管理をbypassして勝手に書き換えたら不味いと思う。たぶん
(SvGROW()で十分にバッファを引き延ばして、書き換えた後にSvCUR_set()で
適切に長さを設定しなおしてやれば問題はないかもしれないが)

...ところで、そのhogehoge()関数は、destの領域サイズを渡すことはできないの?
溢れた際、処置のしようがないけど
230223:02/10/23 11:13
>>229
とりあえず質問部分にだけ返答します。

ここで書いたogehoge()関数って実際にはstrcpy(),strncpy(),strlen()に
相当するものがそれぞれ用意されていて、C で書くと
size_t len;
len = hogestrlen( (unsigned char*)src );
wchar_t* dst;
dst = (wchar_t*)malloc( len );
hogestrcpy( (unsigned char*)dst, (unsigned char*)src );
みたいな使いかたするものみたいなんです。
hogestrlen() は引数の src を変換したら何bytes になるかを返すっていう感じね。

まぁそういう仕様なので溢れたらさようならーなのが仕方ないっぽい。
231_gunzip ◆eiH/XdoCNg :02/10/23 21:01
>>230
こんな感じでいいのでは?
hogehoge($dst, $src) or error_happend();
のように呼び出す、と。

void
hogehoge(dst, src)
    SV* dst
    wchar_t* src
    PREINIT:
        size_t len;
        wchar_t *buffer;
    CODE:
        if (SvREADONLY(dst)) {
            XSRETURN_NO;
        }
        len = hogestrlen((unsigned char *) src);
        if ((buffer = malloc(len + 1)) == NULL) {
            XSRETURN_NO;
        }
        hogestrcpy((unsigned char *)buffer, (unsigned char *)src);
        sv_setpvn(dst, buffer, len);
        free(buffer);
        XSRETURN_YES;

#>229の(...)内は無視してね。perlgutsに駄目だとはっきり書いてあった。
232デフォルトの名無しさん:02/10/24 19:29
正直、perlのオブジェクト指向プログラミングはどうですか?
rubyと比較してどうですか?
いろんな角度から、客観的な意見を聞きたいです。
できれば両方を使える人、答えてください。
構文が泥臭い。
Ruby以外は糞
>>234
てめえの脳が糞、耳垢も糞?
236デフォルトの名無しさん:02/10/24 23:21
メインのスクリプトファイル(1)と、そこからrequireで取りこんで利用するファイル(2)
の2つがあるとします。

(2)でpackage main;として、パッケージ変数を宣言して代入、これを(1)から参照しよう
とすると、(-w つけたときに)その変数は1回しか使われていない、打ち間違いでは?とい
うようなワーニング(possible typoとかいうやつ)が出ます。

パッケージ変数を(1)で宣言したり、(2)をmain以外のパッケージにして、(1)で完全修飾
で参照するとワーニングは出ないのですが、なんで同じパッケージなのにこんなワーニン
グが出るのでしょうか。これをuse vars以外で回避するにはどうすればいいのでしょうか。

いちいち別パッケージを作りたくないが、同じファイルにべたっと書くと読みにくい時
などに困っております。

>>232
メンバの定義の時、perlだと無名ハッシュや無名配列などを作ってその中にうまく配置し
なければならないので少し面倒です。C++だと単にブロックの中で宣言していくだけで
いいのでやや楽です。public/privateもきっちりしております。
rubyは知りません。


>>232
オブジェクト指向言語として必要な要素はすべて揃っている。
超強力なリフレクションで徹底的に動的に扱うことができる。

ってかんじかな。デメリットは包括的かつ統一されたクラスライブラリ
が付いてこないこと。これが痛い。

JavaとかRubyとかSmalltalkが気持ち良いのって
そーいうクラスライブラリが付いてきてるからなんだよな。

"クラスライブラリも言語の一部だ"なんて声もあるけど
言語を特色付ける一要素でしかない。でもユーザからすると重要。
うーむ。
>>232
perl5のOO記法が気に入らなくてrubyに走った。
>>236
その警告はコンパイル時に出されるものだからだね。
試しにperl -wc script.pl(コンパイルのみ)にしても警告は出るはずだよ。

というのも、Perlがコンパイル時に変数を見たとき、その(2)の変数は見えないんだよ。
requireは実行時になって初めて呼ばれるからね。
requireすればPerlにとっては変数が複数回使われていると分かるけど、
もう発行した警告は取り消せないというわけ。

でもたいていの場合、その警告はもっともだと思うんだよね。
今回はたまたまtypoしなったのかもしれないけど、
本当にtypoしても別ファイルだと気付きにくいでしょ。
だから、use strictをしてその使う変数をvars/ourで宣言するか、
その(2)をモジュールにしてuseで取り込むかした方がいいと思うよ。
PerlのOOってprivateとかpublicみたいな区別ってあったんだっけ。
「境界線はパトロールしない」んじゃなかったけ。
俺は、無理やり従来の枠組みに押し込もうとしたような記法があんまり
好きではないな。@ISA ってなんの略じゃろ。みたいな。
>>240
@ISAって何の略ですか?
Implementation of Super Algorithm
>>242
まーたーぁ。
"is a"の略でしょ。
バイナリファイル内の文字列を置換するにはどうしたらいいのでしょうか…。

open(INFILE, "<$infile") or die "ERROR : ファイルが開けません($infile)\n";
open(OUTFILE, ">$outfile");
binmode(INFILE); binmode(OUTFILE);

while (read(INFILE, $buffer, 1024)){
  $buffer = s/対象文字列/置換文字列/g;
  print OUTFILE $buffer;
}

close(INFILE);
close(OUTFILE);

とかは無理でした。
>>244
typoじゃないなら板違い
まあ、まず「=」の代わりに「=~」としないときびしいんじゃないかな。

あと日本語だとどうなのって気もするし。
247もうだめぽ。。。:02/10/25 16:54
>>245-246
あ、、、、(略

  ______
 〈 スイマセン、コノトオリデス!
  ∨ ̄ ̄ ̄ ̄ ̄
      ヾ
 (´Д`;)、
  ノノZ乙
248デフォルトの名無しさん:02/10/26 18:40
あるディレクトリの階層を出力する方法がわかりません。

真剣困ってます。教えてください。
>>248
は?
250248:02/10/26 19:34
はぁ・・・・・・・

自力でがんばろ!
真剣に困ってる奴が書く文章には見えない。
まず日本語勉強しないとな。
あと、Perlクックブックとかを買うと幸せになれるのでは?
mataaoridesuka?
         @     @             @     @
      __〃     〃          __〃    〃
.     /´〃⌒ヽ⌒〃ヽ         /´〃⌒ヽ⌒〃ヽ
    /            ヽ     /             |
   |            |     |.             |
    |       -‐   '''ー |     |.           |
  /     ‐ー  くー |     |         、  , |
  ( (   ´゚  ,r(、_>、 ゚')ヽ   ( (     -―●-●|ヽ
  ヽ/⌒っ   .ト‐=‐ァ' ! ⌒っ ヽ/⌒っ   ) ‥ )⌒っ
   \ ノi、   ` `二´' 丿ヽ、ノ   \ ノ     ー=_ノヽ、ノ
       |、` ''Iー-‐I 、|          |、` ''Iー-I 、|
       ̄つ   ̄つ         ̄つ  ̄つ
糞言語には糞スレがお似合いだな。ぷぷっぷぷぷ
         @     @             @     @
      __〃     〃          __〃    〃
.     /´〃⌒ヽ⌒〃ヽ         /´〃⌒ヽ⌒〃ヽ
    /            ヽ     /             |
   |            |     |.             |
    |       -‐   '''ー |     |.           |
  /     ‐ー  くー |     |         、  , |
  ( (   ´゚  ,r(、_>、 ゚')ヽ   ( (     -―●-●|ヽ
  ヽ/⌒っ   .ト‐=‐ァ' ! ⌒っ ヽ/⌒っ   ) ‥ )⌒っ
   \ ノi、   ` `二´' 丿ヽ、ノ   \ ノ     ー=_ノヽ、ノ
       |、` ''Iー-‐I 、|          |、` ''Iー-I 、|
       ̄つ   ̄つ         ̄つ  ̄つ
アラレキ〜〜ック
θ==〜〜
>>257
やる気の無いレスだ・・・
259ハッカ飴:02/10/27 13:14
>>248
glob('*/*');
というようにワイルドカードを2つ使うとサブディレクトリのファイル名が全て手に入るよ。
さらに、
glob('*/*/');
だとサブディレクトリ名が全て手に入る。
260デフォルトの名無しさん:02/10/27 14:07
grobでできるならシェルでもできるね。
ls -l */*/*|glep xxx
とかやると簡易findになるし。
261248:02/10/27 14:52
>>259-260さん
教えてくれてありがとうございます。
これから精進します。
>>259
globbingの質問だったのか…。
ディレクトリの深さを調べるとかかと思ったよ。

しかしそれだと同一レベルのものしか見付からないから、File::Findを使うべきでは。
>>252も言ってるが、cookbookを読むべき。
わけのわからんことを言ってる奴が多すぎる。
コンソール上に表示させる際に、
色を指定して表示させることはできるのでしょうか?
265223=320:02/10/28 15:34
>>231
報告遅れましたが、この code でうまく動きました。
XS って情報が少ないので大変感謝です。
266デフォルトの名無しさん:02/10/28 21:07
winのactivePerlでは*.pmとか*.plはどこにおいたらいいですか?
baka?
Perlについての質問箱
http://pc3.2ch.net/test/read.cgi/tech/1017736187/

が前スレ=Pert1ってことでOK?
CPANに書いてるし。
>Copy the module into your Perl's lib directory.
>That'll be one of the directories you see when you type perl -e "print qq(@INC)".

DOS窓なんかで perl -e "print qq(@INC)" って打って出てきたディレクトリに
放り込めと。
270デフォルトの名無しさん:02/10/29 14:51
ここのフィボナッチをやってみたんですが、
http://www.bagley.org/~doug/shootout/bench/fibo/fibo.perl
>perl fibo.perl 10
とすると、
89
が返ってきて計算がおかしい様なんですが、なんででしょうか。
(55が返るはず)

ちなみに30渡すと、
>perl fibo.perl 30
Out of memory!
Error: Runtime exception
なんなんだろう・・
>>270
最初の三項演算子の比較を<=2にすればあんたがほしい答えになる。
後者はあんたの環境が悪い。
余計な話だがuse integerを使う意味もないし、すぐ桁あふれを
起こす使い物にならないスクリプトだと思う。
この種の処理ならBigIntを使うべき。
つうかフィボナッチで再帰するな馬鹿。糞言語ににはお似合いだがな
>>271
あんたまっとうなレスもするんだな。ちょっと意外。
グチャミソゴミ吐き言語のサンプルとしては>>270のリンク先は
あまり適切ではないと思うが。
274デフォルトの名無しさん:02/10/29 21:50
糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語
糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語
糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語
糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語
糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語
糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語
糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語
糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語糞言語
(アフォにアフォ扱いされて憤死)
272は273ではありません。
271は変質者か?カスはどっかいけ
“アフォ”しかレス出来ないのに、さも知ったかぶったような馬鹿のおられるスレは此方ですか?
煽りしか出来ねえ癖にガタガタうるせえんだよ。ヴォケ!と伝えたいのですが。


勘違いとは詳しい事情もしらず決め付けるやつも勘違いだわな(わら


今度近日中に都内の電車にサリンを巻く。
もし君たちが、Rubyに入教すれば
座禅をしたままで、空中浮遊をすることができるようになる。
matzは偉大なり。紙さまです。今日は電車を使わず
座禅で出勤することができました。これもRubyのおかげです。
Rubyに入れば、永遠の命を手にすることができるのです。



>>278
警視庁のHPから通報しました。こういう類のことは予告
でもつかまるんだよね。犯罪はだめぽ。
相変わらず頭悪いなぁw
281270:02/10/30 06:32
>>271
うーん、
http://www.bagley.org/~doug/shootout/bench/fibo/fibo.perl
このコードがおかしいとなると、このサイトのベンチ結果は
当てにならないってことでいいんですかね・・?
環境はPerl for Win32 Build 316 - Built 23:50:22 Mar 16 1998です。
ちなみに<=2にしても30は計算できませんでした。

>>272
ベンチ用のコードなので、あえて再帰を使ってるのは納得できる
理由だと思いますが?
このコードは引数2のときの処理がおかしい。
漏れの環境では条件を<3にすると正常に計算できた。
>>281
バカ?
284デフォルトの名無しさん:02/10/30 10:54
Perl5で、

my_defun hoge($foo, $bar) { BODY };

なんて書くと

sub hoge($$) {
 my ($foo, $bar) = @_;
 eval { BODY };
}

みたいな文に展開されるサブルーチン "my_defun" みたいのは書けないでしょうか?
>>284
なんでこんなんが必要なのか分からんが

sub my_defun {
  my($name) = $_[0] =~ /^([^\t\x20(]+)\s*(?:\(((?:(?:[\$%&@][^\t\x20,]+)(?:,\s*)?)*)\))?$/;
  my @arg = split /,\s*/, $2;
  my $code = $_[1];

  for (@arg) {
    $p = substr($_, 0, 1);
    if ($p eq '$') { $_ = "my $_ = " . 'shift;' }
    elsif ($p eq '@') { $_ = "my $_ = " . '@{shift @_};' }
    elsif ($p eq '%') { $_ = "my $_ = " . '%{shift @_};' }
    elsif ($p eq '&') { $_ = 'my $' . substr($_, 1) . ' = shift;' }
  }

  eval join '', (
    'sub ', $name, ' {',
      @arg,
      $code,
    '}',
    '*::', $name, ' = \\&', $name, ';'
  );
}

my_defun 'hoge(@foo, $bar)', q{ print join '/', $bar, @foo };
my @hoge = ('age','sage');
hoge(\@hoge, 'moge');

プロトタイプ宣言はコンパイル時にのみ有効だから、
動的生成時は無視される。
286270:02/10/30 19:26
つーか<=2っておかしくない?
287デフォルトの名無しさん:02/10/30 19:29
>>1
やけにCGIを意識した書き込みだな。
288270:02/10/30 19:40
そもそもfib(30)って、高々30階層しか再帰呼び出しされない筈なのに、
Out of memory!になるのはおかしいよね・・・。
perlで数値計算させるのがまちがってるんでしょうか。
CGI以外にまともな用途がないからな。
perlっのコード見てるとつい鼻毛抜いてしまう
291270:02/10/30 19:42
まともなレスしない割に粘着ですね。>rubyist@カラアゲうまうま
低レベルな書き込みをいつまでも続けないで欲しいな。お前のことだ。糞野郎>>270
293270:02/10/30 19:50
問題が全然解決してないので書きこんでるだけです。
掲示板を私物化ですか?>rubyist@カラアゲうまうま
294270:02/10/30 19:53
つーか正解は
return $_[0] < 2 ? $_[0] : fib($_[0]-2) + fib($_[0]-1);
ですよね。やっぱベンチはでたらめかな。
いい加減うざいな。独り言なら余所でやれ。
>>295=rubyist@カラアゲうまうま
自作自演もほどほどにな。
297295:02/10/30 20:11
>>296 ハァ? お前もソイツと一緒に消えろ。
>>293
いちいち相手するな。

俺は Perl よりむしろ Ruby を使うほうだが、rubyist を騙って粘着する基地外は
氏んでもらいたい。
299 ◆hMJAPH9PWA :02/10/30 21:45
>>294
C等のコードを見ると同じ間違いをしているから、ベンチマークの結果は正しいと思うよ。
といっても、ベンチマークの結果を鵜呑みにしていいかどうかはまた別問題だけどね。
rubyistはみんなそんな感じだ。いい加減消えてくれ
301棄教者 ◆egKIKYO7cg :02/10/31 08:42
#!/usr/bin/perl

while(1) {
 print 'rubyist@カラアゲうまうまは名無しさん@カラアゲうまうまとは別人ですよね?';
}
302デフォルトの名無しさん:02/10/31 17:33
Perlで複素数や文字式の計算をやりたいのですが、できるのでしょうか?
学校の先生とPerlについて話をしていて、ウェブで複素数の計算できるようなもの作ってみてくれと言われたんですが、いかんせん複素数をどうしたら扱えるかわからなく悩んでいます。
本はもちろんのことgoogleで調べてみましたが全くと言っていいほど情報が無く、ダメでした。どなたかご存知ないでしょうか?
>>302
ラクダ本を買え
HTMLのフォームに式を入れて、それを計算させるの?

式[(5i - 2)(2i + 1) ] = 解[        ]
とか?
305302:02/10/31 17:48
>>303
早速本や行って見てきます。
田舎だから売ってないかも…
そしたら都会にお出かけしてきます。
306棄教者 ◆egKIKYO7cg :02/10/31 18:46
一番簡単なのは複素数を配列として表現することだよね。
3+2i だったら @hoge = (3, 2) とする。

で四則演算をやる関数を
×( @hoge, @fuga )
とかって感じで呼び出せるように定義すればいいんじゃないかと思われ。
>>306
素直に標準libを使ったほうが簡単だと思うが?
>>302
「こんなコードどこかにないかな〜」と思ったら、まず
http://search.cpan.org/
ここで検索するんだ。今回の場合はComplexといれて検索。
http://search.cpan.org/author/JHI/perl-5.8.0/lib/Math/Complex.pm
と一瞬にして出てくる。

しかしだなぁ、
http://www.google.co.jp/search?q=perl+%E8%A4%87%E7%B4%A0%E6%95%B0&ie=UTF-8&oe=UTF-8&hl=ja&lr=
で一発なところを見ると、本当に検索したのかと小一時間問い詰めたい。

ウェブの使い方と厨学生レヴェルの英語力があれば、ラクダ本は無用。
漏れ的には「オブジェクト指向Perlマスターコース」を勧めるが、
基本的に「本を買え」ってだけの香具師は信用するな。
>>308
だから、>>302にはあんたがいう程度のスキルもないってことだよ。
Math::Complexはperlの標準libに入ってる。
本来、探すもへったくれもないだろうが。
>>309
確かに、googleで検索する前に、
perldoc perlmodlib
で名前を調べて、
perldoc Math::Complex
とやってもいいな。
厨房でも大きな顔が出来る。それがPerlスレ(わら
304が正しいとすると式を構文解析するほうがよほど大変そう。
306 も偉そうにしているわりには標準libすら知らない
>カラアゲうまうま
キモッ!
315302:02/10/31 22:42
いろいろレスありがとうございます。
昨日はMath::Complex.pmまでは探し当てたんですが、それから立ち往生してしまい…
いわゆるモジュールなんてPerlの初心者本でcgi-libとjcode変換ぐらいしか知らなくて、モジュールとはどんな風に使うのか?というところで悩んでしまいました。
それでComplex.pmを落としてきて、ルートの計算や階乗まではいけたんですが、肝心の複素数を扱うところで挫折と言った具合です。
まぁもう少し難しそうな本を読まないと置けないのかと思いました;´Д`)
316302:02/10/31 22:49
追加で返事忘れてました。
>>304そうですそんな感じです。あと複素数同士の割り算やなどです。
>>306さんのは簡単な計算ではいいのですが、iをそのまま虚数として扱えるフォートランのような感じでやれないものかと思っていました。
今のところ306さんのようなiを文字として最後に引っ付けてやっているのですが、やはり限界が訪れてしまい皆さんに聞いてみようと思ってのです…
お世話かけて申し訳ない。もう少し頑張るデス!
317302:02/10/31 23:22
と言いつつさっきやったら出来ました。
いままで3*iを3iとして打ち込んでいました。
全くもって情けない話ですみません |д゚)
318一見:02/11/01 00:03
@data=('A,7,緑','C,6,青','B,4,赤','A,9,紫','A,2,黄緑','B,10,黄','C,3,青紫')
という配列の各要素の第1項でソートするには、
@data=map{$_[0}sort{$a->[1] <=> $b->[1]}map{[$_, split /,/]} @data;
とする。

んで、配列から重複した要素を取り除くには
@array=grep(!$count{$_}++, @array);
と書きます。

上の@dataのような2次元配列(?)の各要素の第1項で重複した要素を取り除くにはどう変形させたらいいか分かる人教えてください。
-> の使い方がイマイチようわからんです。
>>318
まず、それは二次元配列ではなく、単なる一次元配列だ。
普通は、
my $data =
[['A', '7', '緑'],
['C', '6', '青'],
.... ]];
とする。もしくは3つのうちどれかをキーにした無名ハッシュへのリファレンスを
要素にもつ無名配列にする。漏れなら後者だな。重複する可能性の少ないデータ、
この場合は2番目の数をキーにする。単なる数だから配列でもいいかも知れない。

まずはデータ構造の見直しを推奨するが、どうしてもこれでなければならないのか?
320一見:02/11/01 00:58
>>319
@dataの構造でないといけないというわけではないです。
1.要は、3つの項からなる要素をひとつのカタマリとする
2.各要素のN項に着目し、重複した要素は除く
ということが満たされるということをしたい。

無名配列とかについてはちょっとまだ使ったことがないというレベルです。
my $data の形の方がわかりやすいかな?
321曽爾 久理恵:02/11/01 11:17
それって>>318の例でいうと、
たとえば「最初の項に着目する」場合、
ほしい結果は「('A', 'B', 'C')」みたいな
リストなわけ??
322一見:02/11/01 13:00
いや、欲しい結果はこういうこと。
('A,7,緑','C,6,青','B,4,赤')
323曽爾 久理恵:02/11/01 13:09
最初の項が「A」である要素が3つあって、
そのなかのどれを選んでもいい、っていうなら、たとえば、

foreach $data (@data) {
if ($data =~ /^(.)/) { # これだと「最初の一文字」だが、まあ。
$hoge{$1} = $data;
}
}
として
foreach $hoge (sort keys %hoge) {
print $hoge{$hoge}
}
とかするとこれはPerlらしい泥縄でuniqして最後に現れた要素だけとりだせると。

もっと簡潔に書ける人大募集。
302に便乗して質問です。
複素数や文字式を格納した変数を有効桁数で表示してみたいんですけどどうしたらよいですかね?
printf や sprintf でやってみたけど文字の入った式は無視されちゃって…
2.063835iというのを2.06iに直して出力できないものっでしょうか?

今の時点では変数内でiを探して抜き出し、数字部分だけで有効桁にしてiを付けてやるというのしか思いつきません。
>>324

s/(\d+\.\d+)/sprintf("%.2f",$1)/eg;

じゃダメ? :-)
326デフォルトの名無しさん :02/11/01 18:54
a.txtとb.txtと2つのファイルがあったとして
a+b.txtみたいなファイルを出力にするには
どうしたらいいんでしょうか。

a.txt
1 1 4 3
5 2 2 8
2 8 6 9

b.txt
3 2 1 9
0 2 1 1
3 0 2 8

a+b.txt
4 3 5 12
5 4 3 9
5 8 8 17
>>324
perldoc Math::Complex して、
The first one is "format", which is a sprintf()-style
という行を検索してみてください。それらしいことが書いてありますたよ。
328 ◆hMJAPH9PWA :02/11/01 19:33
>>324
perldoc Math::Complexにやり方が書いてあるけど…。
英語が分からなくても、一度ざっと目を通すくらいはしてね。

Math::Complex->display_format(format => '%.2f'); # Complexオブジェクト全般に有効
my $cplx = new Math::Complex;
$cplx->dislay_format(format => '%.2f'); # このオブジェクトにのみ有効

>>326
簡単な方法は無いから、力ずくでやるしかないね。
329 ◆hMJAPH9PWA :02/11/01 19:34
あう、被った上に親切すぎだね…。
>>326
配列に[ ]で区切って数字を入れていって、
@a[i]と@b[i]を足して
printする。
331326:02/11/01 19:53
ちからずくですか…(-_-) perlヤメヨウ
>>326
Math::Matrixを使いなされ。
333326:02/11/01 20:05
Math::Matrix
(ノ゚ο゚)ノ オオオオォォォォォォ-そんな便利なものが!
>>333
>>308にも書いたが、とにかく*自分でコード考える前に*、
http://search.cpan.org/
で検索すれ。
335326:02/11/01 20:19
一つ勉強になりますたm(__)m
336324:02/11/01 21:10
みなさん親切にありがとうございます。
只今エキサイト翻訳しつつ、解読中です。
なんとなく解りかけていたので、試行錯誤しつつやってみます。
( ● ´ ー ` ● )
えげr78お23tg4kjf@psdcさcあs





s::::::::::
338デフォルトの名無しさん:02/11/01 23:59
↑↑なっち!
339デフォルトの名無しさん:02/11/02 13:31
dbmopenでDBMファイルを作ると
自分のLinuxマシン(RedHat7.3、Perl5.6.1)では
拡張子の無い単一のファイルができるんだけど
プロバイダ(OS不明、Perl5.6)上で同じの実行すると
拡張子が.dirと.pagの2つのファイルができる。

相互でDBMファイルをやり取りしようという計画だったんだけど
無理なのかなあ。

違いが生じる原因はOSの違い?
なんか解決する方法あったら教えて。
340デフォルトの名無しさん:02/11/02 13:33
require で呼ばれた hoge.pl の最後には、
なんで 1; が無いとだめなんでしょう?
>>339 DBMといってもsdbm,gdbm,BerkeleyDBとか亜種があることぐらい知っておけ。
>>340 そういう糞仕様だから。

ぺrlは区塩
342デフォルトの名無しさん:02/11/02 14:13
Perl の設計者(だれかしらんけど) に一言文句を言わせてくれ!!
それは変数のスコープについてだ!

なんで local な変数がグローバルなスコープを持ってて、
本当にローカルなスコープの変数を使いたいときには
my を使わないといけないんだ!

   混 乱 す る だ ろ う が !
ちなみに俺は、ruby は嫌いだがから揚げは好きだ。
ちなみに俺は、ruby は好きだが rubyist@カラアゲうまうまは大嫌いだ。
345デフォルトの名無しさん:02/11/02 14:27
俺の読んでいる perl 入門チラシには

sub サブルーチン名 {
  処理
}

って書いてあるんだけど、

sub サブルーチン名 (\%$) {
  処理
}

みたいに ( ) がついてるのはどういう意味?
>>340
最後に真の値を返さなければならない仕様で、その一番簡単な方法だからだ。
UNIX系の連中が大好きな「慣習」ってやつ。

>>342
myは後付けだからな。一応今でもlocalに使い道はあるぜ。漏れがよくやるのは、
作ってる最中のコードの頭で$DEBUG = 1としておいて、テストが済んだサブルーチン
の頭でlocal $DEBUG = 0ってやると、そのルーチンのデバッグメッセージだけ
飛ばせる。

>>345
Cの関数プロトタイプみたいなもんだ。なくてもいいよ。
347345:02/11/02 14:46
>>346
( ) の中は別になくてもいいのか・・・
これによって sub の中での @_ に何か影響があるのかな〜と思ってたよ。
ありがd
348初心者用勉強サイト:02/11/02 20:02
Perlプログラミング講座
http://www5a.biglobe.ne.jp/~n_rieko/perl/

PerlとCGI入門
http://pc-information.com/perl.html
ahya'foo とか ahya::foo とか。
' と :: って同じものなの?
perl4
perl5
351曽爾 久理恵:02/11/02 22:32
>>349

同じ。
hoge'hogeだと、emacsのperl-modeが識別できないんだな。
352デフォルトの名無しさん:02/11/03 00:05
教えて下さい。 $TEST に
X-Mailer : RIGHT Mailer
MAIL To: root\@test.com (以下略)
ってな感じでメールの内容が入ってるんすけど、これをsendmailに渡す時って
どうやったらいいんでしょうか?どーもスマートな方法がわからないんです・・・
354352:02/11/03 01:08
>>353
すいませんでした・・・見つけますた。
>>350-351 ありがd
356216:02/11/03 04:44
File::Tailと同等なモジュールないですか?
ActivePerlを使っているのでFile::Tailが使えないんです。
357rubyist:02/11/03 06:43
おまえ資質無いよ。
358デフォルトの名無しさん:02/11/04 02:58
資質があるやつは、こんなとこに来ない。
言うことはそれだけか。ぷぷっ
例外が使えないPerlは正直使い物にならんです。
361nobodyさん:02/11/04 12:17
例外処理のこと?
もし、それならevalつかうんだけど、、、
362デフォルトの名無しさん:02/11/04 17:43
マジレス求む。

デバッグメッセージに自分がいるサブルーチンを含めることは可能だろうか?

たとえば
sub hoge {
(snip)
print_debug_msg($foo); # $foo = 1
(snip)
}



hoge: 1


みたいな

363rubyist:02/11/04 17:47
caller使え馬鹿低能
>>363
くだらん質問が来たらおれもあんたを騙ろうかな(w
365 ◆hMJAPH9PWA :02/11/04 19:46
>>362
>>363にあるようにcaller()が使える。
内部でcallerを使ってるだけだけど、標準ライブラリCarpにあるconfessとcluckは
メッセージと共にスタックフレームも出力してくれるから便利だよ。
366一見:02/11/04 21:21
>曽爾 久理恵さん
教えていただきありがとうございます。


配列の形式を変えて、以下の形としました。
@data=(["A","7","緑"],["C","6","青"],["B","4","赤"],["A","9","紫"],["A","2","黄緑"],["B","10","黄"],["C","3","青紫"]);

この形で、
1.各要素の1項目目でソートをする
@data=(["A","7","緑"],["A","9","紫"],["A","2","黄緑"],["B","4","赤"],["B","10","黄"],["C","6","青"],["C","3","青紫"]);

2.各要素の1項目目が重複した要素を取り除く
@data=(["A","7","緑"],["B","4","赤"],["C","6","青"]);

という結果を得たいのですが、いい案はないでしょうか?
367 ◆hMJAPH9PWA :02/11/04 21:49
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
our @data=(["A","7","緑"],["C","6","青"],["B","4","赤"],["A","9","紫"],["A","2","黄緑"],["B","10","黄"],["C","3","青紫"]);

# 1
@data = sort{ $a->[0] cmp $b->[0] } @data;
print Data::Dumper->Dump([\@data], ['*data']);

# 2
# ただし何が残るのかは指定できない
{
my %t;
@data = grep{ ! $t{ $_->[0] }++ } @data;
}
print Data::Dumper->Dump([\@data], ['*data']);

__END__
368デフォルトの名無しさん:02/11/04 23:22
>>366
いい案って……やればいいだけじゃん。
369デフォルトの名無しさん:02/11/05 01:48
perlでオブジェクト指向って無謀ですか?今度大き目のWebの仕事で
perlを使用するんけど、リーダーがOOを前面に押し出した作り
にすると言い出しまして...
370rubyist:02/11/05 02:34
OOならRubyだろ。馬鹿じゃね?
GNOMEでCによる大規模OOPが可能であることが証明されていますから、
OOPサポートのあるPerl5でOOPが無謀だなんてことはありません。
RubyでWebアプリケーションは重過ぎます。
373rubyist:02/11/05 02:43
>>371 おまえGnome/GTK+でプログラムを書いたことないだろ。あのダサイ設計を見て言っているなら病気だな(w
gtk_hoge_do_something(GTK_HOGE_CAST(obj), args)なんか毎度やってられるか。
>>372 Walrusはとっくに実用レベルですが? Perlにありましたっけ?

下層階級・業界のドカタの皆さんにはPerl見たいな糞言語がお似合いです。
374デフォルトの名無しさん:02/11/05 03:25
>>369
メンバーがみなperl者なら、行くとこまで行っちゃえば。
破綻が目に見えるようだな。
>>373
>Walrusはとっくに実用レベルですが?
実際に稼動してるとこ見たことないぞ。
つーか本家に行ってもC++に書き直される運命ですた。
377ぅぁぁぁ:02/11/05 07:31
Perlで大規模OOPできるよ。ただし、Perlの哲学を忘れないでね。
「オブジェクト指向は、それが意味のあるときだけ使い、そうでないときには避けること。」
それじゃ、開発がんばってね。
OO自体は他の言語で経験があるというんじゃなきゃやめとけ。
>>376
頼むから偽rubyistは相手せずに放置してやってください。
380デフォルトの名無しさん:02/11/05 13:35
この前、とほほでperlを勉強し始めた、にわかperl君なんですが「空配列」
って何のために使うんでしょうか?
ググってみたけど、断片的にしか書いて無くてイマイチ「こう言う時に使う」
とか「こう言う場合の為にある」とか言う感じが掴めず胸が気持ち悪くて
どうしても我慢なりません。
ハァ?とか言わないで教えてもらえると本当に嬉しいっす。
381ドンタコス:02/11/05 13:48
空配列って、@hoge = ( ); みたいなやつ??
だとしたら、それは空っぽなので、特に用途はなくて、
ゴミがたまった配列をリセットするときに使うわけじゃよ。
382棄教者 ◆egKIKYO7cg :02/11/05 17:45
算数の授業で
0はどういうときに使う数ですか
と質問するのに似ているな。

----
嘲笑している訳じゃなく、マジレスなのでそこのところよろしく。
ハァ?
程度低いスレ。
WebProgに引きこもって出てくるな。
糞言語板とかできねぇかな。
Perl,HSP,Delphiとかを隔離すれば少しはましになるだろうに。
バカにしながらこのスレを粘着質にチェックしている
基地外がいるスレはここですか?
ああそうか。

Perl とか HSP とか、そーゆー効率の悪い言語を使ってる人たちの
立場で考えてみる必要もあるのか。
そして、るbyスレにはたいした書き込みしない。>からあご
rubyがそんなにすばらしいなら、perlスクリプトに対応する
rubyのソースを逐一見せてくれたまえ。そうしてくれりゃ
こっちも比較のしようがあるもんだ。
>>388
書けないんだよ。rubyは知らないから。放っといてやれ。
391デフォルトの名無しさん:02/11/05 21:41
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Perl
392デフォルトの名無しさん:02/11/05 21:46
今夜のお祭りはここですか。
rubyist@カラアゲうまうま←かわいそうな奴

ガンバ!!
>糞言語板
真っ先にRubyが隔離される予感。
>>394
おまえとカラアゲ君だけ隔離されれば、それでじゅうぶん。
カラアゲ君、よっぽど悔しかったんだろうな。名無しになって暴れてるぞ。
追いつめると何するかわからんから困るよな。
397デフォルトの名無しさん:02/11/06 10:18
パターンに変数が含まれるパターンマッチで
変数にメタ文字が含まれてしまう場合、何か良い方法はあるのでしょうか。

ex. $foo = "aaa?bbb" のとき "aaa?bbb" =~ /$foo/ をマッチさせる方法

"aaa?bbb" =~ /\Q$foo\E/

こうすると、展開されないYO!
399デフォルトの名無しさん:02/11/06 10:43
>>398
おお!ありがとうございます!!
400デフォルトの名無しさん:02/11/06 20:38
複数行にわたる文字列を一行に納めたいのですが、
たとえば"aaa\tbbb\nccc"と"aaa\\tbbb\\nccc"を相互に変換する関数ってありますか?
401デフォルトの名無しさん:02/11/06 20:43
Perl って何って読むんですか?
402400:02/11/06 20:46
Pearlと同じく、パールって読むらしいよ。
日本人に聞き取れないだけで発音はちょっと違う。
404400:02/11/06 21:09
$str =~ s/([\\\t\n\r])/\\$1/g;

一応エスケープ処理は書いてみました。
でも120%車輪の再発明っぽい気がしてきて背筋が寒くなるので、
誰か情報ください。
405400:02/11/06 21:31
質問です。
"aaa\\tbbb\\nccc"→"aaa\tbbb\nccc"
こういう時の処理って、どうやったら正規表現一発でできるのですか?
406400:02/11/06 21:35
%escapelist = {
'\\\\' => '\\',
'\\t' => '\t',
'\\n' => '\n',
'\\r' => '\r'
}
s/(\\\\|\\t|\\n|\\r)/$escapelist{$1}/g;
こうですかね?
407400:02/11/06 22:30
できたには出来たけど。。。
やっぱり車輪の再発明の予感。
$str = "aaa\nbbb\tccc\\ddd\\\\eee";

%reescapelist = (
'\\' => "\\",
'\t' => "\t",
'\n' => "\n",
);
%escapelist = (
"\\" => '\\',
"\t" => '\t',
"\n" => '\n',
);
print "first:\n" . $str . "\n";
$str =~ s/([\\\t\n])/$escapelist{$1}/g;
print "escape:\n" . $str . "\n";
$str =~ s/(\\\\|\\t|\\n)/$reescapelist{$1}/g;
print "reescape:\n" . $str . "\n";
409デフォルトの名無しさん:02/11/07 22:22
くだらないネタではあるんだけど、

CPANってなんて読むんだ?

しーぱんでいいのか?
うぜぇ
どうでもいいだろ
ばーか
クパンに決まってるだろクパンに
412デフォルトの名無しさん:02/11/08 01:08
シパン!
宇宙刑事CPAN
クパーン逮捕だ〜
415デフォルトの名無しさん:02/11/08 10:05
オライリージャパンのサイト見ると
「プログラミング Perl 改訂版」とあるのですが、
アマゾンで調べると、さらにVolume1とVolume2があるらしいのです。

前者が古くて、あとから二冊に分かれたとかなんでしょうか?
近くの本屋にはオライリーはあってもプログラミングPerlはないので確認できず、なのです。

中身全くわからずに二冊買うのはちょっと勇気いるので、
現状わかる方教えてくださいまし。。。
>前者が古くて、あとから二冊に分かれたとかなんでしょうか?
そのとおり
417ドンタコス:02/11/08 12:00
二冊に分かれたのが最新のなんだよ。PODの話とかがかいてある。
一冊のは古いの。

オライリーのサイトはなんだかヘンだね。
二冊のが出る直前には予約ページみたいなのもあったんだけど、
それを引っ込めて、古いのがそのまま載ってる。
418415:02/11/08 15:07
そうでしたか。。。
二冊に分かれるくらいだから結構詳しいのでしょうか。
大変そうだけど役に立つだろうし、気長に読んでみますです。

丁寧にありがとうございました。
419Perlな名無し@一年生:02/11/08 15:26
私もオライリーのことでなんなんですが、
"はじめてのPerl"を一通り読んで、
「これってホントに"はじめて"なんかい〜?!」
っと思いました。
Perl全体からすれば初めても同然なんだろうけど、
いきなり(ではないのですが、)読むにはつらいです。

特に"Cの関数と同じく…"という表現がなんども出てきて、
その都度、「C知らんねん!!」と心の中で叫びました。
C知らないでPerlやるのはどんなもんか、っていうのが世間一般なんでしょうか?

プロセスとかも使ったことはあったのですが、
あたかも"プロセスぐらい知ってるよね?"といった感じでした。
確かにそういう断り書きはあったのですが…。

Perl理解するには他の分野の知識も必要だと思うのですが、
大体どのような流れで学んでいけば良いと思われますか?
420棄教者 ◆egKIKYO7cg :02/11/08 16:29
>>419
その本は Perl が初めての人向けの本なので UNIX とか C とか
そういうのは一般教養だという前提に立っています。
他の参考書見たら?
推薦するのは>>167で紹介した本。

Perl 勉強するなら初めは Windows2000/XP がインストールされたマシンの
電源の入れ方と切り方が分かっていればいいんじゃないの?
俺は当時、「初めてのPerl」を呪った。Cを知らない俺には難しすぎる内容。表題に偽りありってやつだ。
しかも金が無かったから、別のPerl本が買えなかった。後悔と絶望が心を埋めた。
で、しかたがないから一週間かけて、「初めてのPerl」に書いてあることを表にしようと思った。
そう、こんな感じでひたすら書いていったんだ。

my $hoge = @_; #@_は引数のリスト。スカラーとリストの代入。最初の要素だけが取れる。
my $hoge = shift; #shiftを使う方法。@_がひとつずれるので注意。
my ($foo, $bar) = @_; #リストとリストの代入。3つめ以降は取れない。
......

7日目の夕方。全部書き終わったとき、「初めてのPerl」の偉大さを悟ったよ。
そして、やっとたまったバイト代で、俺は「プログラミングPerl」を買ったのさ。
>>421
その表を売り出せ。再帰的再生産とでも言うのだろうか。
>>421
そのアプローチは正解ですな。あらゆる勉強の基本は写経です。
所詮人間の脳は泥臭い肉の臓器。泥臭い方法でしか知識は身につきません。
しかし7日で写経してしまうとは、あんたは真面目な人ですな。高学歴?
>>409
スィーペェン
C P A N
ツェーペーアーエン
>>425
中学校もでてない、からあげ君がドイツ語使ってる
明日、雪だな。
ぷぷっ妄想逞しいな(わら
もうすぐ「PerlからRubyへの移行ガイド」という本が出るよ。
Perl->Pythonの本は既にピアソンから出てるし。

Rubyist >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Perler
プログラマという商売は特に保守的になってはいけないよね。
「PHP/Javaで出来ることはPerl+DBIで出来る」なんていう馬鹿は
「XMLで出来ることはLispで出来る」と言っている人と
同レベルだと思う。
さらなる高みを目指すならRubyを学ぶべき
XMLで出来ることはLispで出来るとおもうんだが。
↑pppppppppppppppppppppppppppppp

やっぱ世間はクズの集まりなんだろうか
Lisp=XML と公言するのがはずかしいという認識すらない。
UNIX天動説厨房といえる。多少なりともXMLを勉強したなら
namespaceとかencodingとかの重要性がわかってもよさそうだが。
XMLが世間で普及しない訳だよな、これは。
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Lisp >>> Perl
当り前のことを今さらですが、Rubyは、すばらしい言語です。
ところが、あのコンピュータ界の癌細胞というべきアニオタの白豚Larryが作成したPerlは何でしょうか。
あまりにも、醜悪かつ悪質かつ脆弱ではありませんか、欠点だらけで、もはや言語としての体をなしていません。
また、Perlコミュニティの対応は、完全秘密主義かつ傲慢ではないでしょうか。
できれば、Perlような粗悪品を使いたくはありません。
しかし、まわりを見渡すとみんなPerlです、そうなると粗悪品を使わざるえないです。(特に仕事ですと)
なぜでしょうか?
Perlは、書籍の数が多いのです、簡単に使えるのです、たいしたことをしなければですが(わら
Perlは、Linuxでいえばタコ以下の人々に広く使われているのです。
Perlユーザを嘲弄し、排除してゆくのがわれわれRubyistの務めではないでしょうか?
そのための場として2chにおいて長らく活動してきた結果、「Perlは糞」
「Ruby以外の言語は糞」という認識は定着し始めてきたように思います。
同時に、GUIがなければ何もできない窓厨房の玩具であるDelphiスレッドにも執拗な攻撃を加え、
Delギコという生意気な固定を追い出すことにも成功しました。(かなり前ですが

これからもRubyの輝かしい未来のために活動を続けて行きたいと思いますので、さらなる声援と愛顧をお願いします。
オーノー
ワタシ、ニホンゴワカリマセ〜ン
>>426で相手してやったんで図にのちゃったな。
みんな、カラアゲは、放置しろ。
>プログラマという商売は特に保守的になってはいけないよね。
not保守的==荒らし
のから揚げくんてすてきだなぁ(藁。
435デフォルトの名無しさん:02/11/09 01:20
Perlのなにが良いかって、「そりゃインチキだろー」って
とこがたくさんあるとこ。
>>419
『はじめてのPerl』が書かれた頃には、現在のように、Web関係で広
まって、419や429のような知能の低いうすらバカがPerlを使うことに
なるなんて想像もできなかったのかな。
>>436
ウスラ馬鹿でもUNIXを勉強していた、が正解。
生きた証拠が漏れや喪前。
作るなら、スクリプト言語板じゃないの?
PerlもRubyもPythonも一緒になれるし、
なんなら、隔離されてどっか逝ってしまったJavaScriptも混ぜられる。
どうよ?
ruby > perl
だとしても
perler > rubyist
は間違いないな。
440ドンタコス:02/11/09 09:43
カラアゲ君は本当にRubyをすばらしいと思ってるのかねえ??
文章もよく読むと「?」だし、
さらに一生懸命このスレにカキコしてるし。

俺がRuby最高、Perl糞って思ってたら、
こんなスレに出入りする時間も惜しいと思うけどな。

ほんとはRubyが大嫌いなやつなのでは?
もしくはまともなスクリプト言語を設計したいワナビーの能無し君が
Ruby作者にジェラシー感じてとか。
(ボクのほうがみんなに注目されるべきだ、みたいな)
>>440
君の考えは正しいと思うが、もう放置しようや。
>>440
そんなのPerlユーザの自作自演に決まってるだろ。
ホントにゲスな奴等だな。お前らって
Ruby6saikou!
なかよくしなよ
どうせスクリプト同士
目くそ鼻くそだよ
445デフォルトの名無しさん:02/11/09 23:21
なかよくしなよ
どうせスクリプト同士
目くそ鼻くそだよ


446 :02/11/09 23:59
メインスクリプトに*.libをrequireしてPerlを走らせる、
requireせずにそのコードをメインスクリプトに記述してPerlを走らせる。

どちらが速い? 前者はrequireする分、遅くなるだべか?
当たり前だろヴォケ
>>446
そりゃrequireした方が遅いには遅いでしょうが、大したことはありません。
そこまでタイミングがシビアなプログラムならば、そもそもperlで書いてはいけません。
449デフォルトの名無しさん:02/11/10 07:26
実行中に、スクリプトに宣言が無いモジュールを読めるPerlは神。
450デフォルトの名無しさん:02/11/10 09:46
スカラー変数内のバイナリデータのサイズを得ることはできないでしょうか?
文字数ならlengthでいけるのですが。。。

一度保存してstatで取得すればよいのですが、それだとサイズ取得が
保存後になってしまって、ちょと困るのです。

どうかアドバイスをくださいです。
そのための/tmpだ。
452 ◆hMJAPH9PWA :02/11/10 11:28
>>450
'\0'の事を言っているなら、テキストだろうとバイナリだろうとlengthで問題ないはずだけど。
453デフォルトの名無しさん:02/11/10 13:20
>>450
binmode(FH); でデータ取得して、length
454デフォルトの名無しさん:02/11/10 13:54
今まで<STDIN>から読み取った後にchompをして
末尾の改行処理を行っていたのですが、
chompが削るのはLFだけなんでしょうか?
バイナリ見たらCRだけ残ってたのですが…う〜む。

あと、末尾処理を\r\n,\r,\nの三つで行うことがあると思うのですが、
どのコードが送られてくるかは何によって決まってるんでしょうか?
サーバーのOSか、それともクライアントの方が関係してるんでしょうか?

ちなみに私のOSは例によってWindowsです。。。
>>454
chop ならちゃんと削ってくれない?
456デフォルトの名無しさん:02/11/10 14:31
どうしてprint関数は

print $hoge;

って括弧がいらなくて、私のつくた関数は

myfunc($hoge);

って括弧がいるですか?

予め定義されている場合は()は要らないだろ。
順序を変えてみろ
基地外でてきたから他行こ。Perlスレはたくさんあるでよ。
低レベルな話題はどこへ行っても相手にされないよ。
>>454
chompはその時の$/に入っている値を削る。このデフォルトが\nだ。
\r\nを削りたいなら、chompを呼ぶ前に$/にセットすれ。
どのコードが来るかは、そりゃ出力するプログラムで定義されているように来る。
Windows上でprint "moge\n"; と書けばその通りに送ってくる。

>>456
perlの仕様だ。ほとんどの組み込み関数は演算子のように使えるようになっている。
しかし分かりにくい時もあるので漏れはわざと括弧をつけている。
ちなみに括弧が必要かどうかと、その関数が「予め定義されている」か
どうかは関係ない。
↑perlsubでも読んだら?知ったか低脳馬鹿
463456:02/11/10 20:15
ここの人って、レベルが低いですね(わら
464デフォルトの名無しさん:02/11/10 21:06
しかしノイズが多いな
465 ◆hMJAPH9PWA :02/11/10 21:36
>>462
括弧無しでの関数呼び出すとき、その関数が実際に定義されている必要は無いよ。
宣言されている必要はあるけどね。
プログラマって、社会人になっても精神的にはまだ子供な人が多いんですよ
引数を省略すると$_を引数にとるような関数を自作するには、
どうしたらいいですか?
$_使えばええんとちゃうん?
>>468
分かりました。ありがとうございました。
470デフォルトの名無しさん:02/11/11 01:19
>>470
$_ はグローバル変数だから、だと思う・・・
もしかしてSTDINに対してseekってできないの?

while ( <> ) {
print tell( STDIN ) . "\n";
}

ってやったら全ての行で -1 が返ってきてるみたいなんだけど…。
473 ◆hMJAPH9PWA :02/11/12 17:59
端末に繋がっている場合にseek/tell出来ないだけなんじゃ。
ていうか<>って<ARGV>の省略形なんでSTDINとは微妙に違うよ。
>>472
できますたよ。< で適当なファイルを読ませてみなされ。
一行ごとにカラムの数がちゃんと表示されますたよ。
475472:02/11/13 12:33
あわわ。重要なことが抜けてた。すまぬすまぬ。

472のソースをhoge.plとすると
$ cat nantoka.txt | hoge.pl
とすると -1 が返ってくるのです。

474さんの通り
$ hoge.pl < nantoka.txt
だとうまく行くのは確認しています。
こういうものなのかな?。
>>475
#!/usr/bin/perl
open(MOGE, "cat test |");
while ( <MOGE> ) {
print tell(MOGE) . "\n";
}

でもだめですた。

perldoc -f tell:

The return value of tell() for the standard streams like the STDIN
depends on the operating system: it may return -1 or something else.
tell() on pipes, fifos, and sockets usually returns -1.

ということなので、パイプでは使えないんじゃないですか?
477472=475:02/11/14 16:36
>>476
やっぱりだめなのかー。
情報さんきうでした。

っつーか手元の環境の perldoc あたりの ver が古くて
perldoc -f tell
しても >>476 の結果が出てこない。
鬱だ。
>>477
man lseekでもしてみろ。
479デフォルトの名無しさん:02/11/15 11:06
質問です。
パターンにマッチした文字列は$&に入ると聞いたので
$string="1234+()";
while($string =~ /[1-9][0-9]*/g ){
$&+=1;
print"$&";
}
としても1235は表示されませんでした。
1235と表示されるようにするにはどうすればいいですか?
マッチした文字列を整数として扱うというのはできますか?
それネタ? うちのPerlでそれを実行すると

Modification of a read-only value attempted at a.pl line 3.

こういうエラーになるんだけど。
ちなみにこうすれば1235が表示される。

while($string =~ /[1-9][0-9]*/g ){
 $a = $&;
 $a+=1;
 print"$a";
}
$& に代入することはできない。
482 :02/11/15 15:56
質問させてください。
私はperl 5.8.0を使用しています。

$smtp=Net::SMTP->new('localhost');
$smtp->mail("test");

とやっているのですが、
Can't call method "mail" on an undefined value at ./test.cgi line 9.
といわれてしまい、動いてくれません。
newに失敗しているのでしょうか?
どのように対処したらよいのでしょうか。

>>482
私のところも5.8.0だけどそのコードでエラーは出ないね。
まさかとは思うが、use Net::SMTP; を忘れているとか?
いや、それならnewで引っかかるか。
いろいろと会って謝りたいことがあるのだけど、
東京に出られないので(人ごみ恐怖症、躁鬱病、突然の意識不明などなどを
発症してしまっているので。入院も7割くらいの確率でする予定)
重症です(苦笑)
精神障害者手帳の申請をする予定。
ただ単にlocalhostにメール鯖が立ち上がってないだけだろ

>newに失敗しているのでしょうか?
当たり前だろヴォケ
486デフォルトの名無しさん:02/11/15 19:50
質問です。
ある日付から1ヵ月後の日付を取得したいのですが、どのようにすればよいのでしょうか。
localtime(timelocal($ss, $mm, $hh, $d, $m, $y)+24*60*60);
で1日後は取得できるのですが、1ヵ月後が分かりません。
お願いします。
487クレクレモード:02/11/15 20:34
ちなみにそれって、1月30日の「一ヵ月後」は2月28 or 29日になるってこと?
488デフォルトの名無しさん:02/11/15 21:55
>>487
1月30日の「一ヵ月後」は2月28日ですが…1ヵ月の定義が変な感じしますね…。
1月29日の一ヵ月後も2月28日になってしましますね。
集計のためのプログラムなのですが1日〜月末までを1ヵ月にすることにします。
とりあえず解決です。くだ質ですまん。
# ところで>>486って実際どうやればいいんでしょうかねぇ?
489クレクレモード:02/11/15 22:17
もしやと思ってちょっと調べてみたら、
CPANにDate::Calcっていうモジュールがあり、
http://search.cpan.org/dist/Date-Calc/Calc.pod

こういう関数を使うと楽らしいが、
($year,$month,$day) = Add_Delta_YM($year,$month,$day, $Dy,$Dm);

1/28〜1/31の一ヵ月後が2/28でいいなら、
ちょこっとif文とかを書き連ねて場合わけしたほうが速そうだ。
490デフォルトの名無しさん:02/11/16 01:00
>>480
>>481
どうもありがとうございました。
ネタではないです。
491デフォルトの名無しさん:02/11/16 05:17
Perl言語で、(x+1)の2乗やら、(x+y)*(x+2y) などといった
計算を行うにはプログラムはどうすればよいでしょう?
もちろん2乗は「(x+1)**2」なんて事は承知してますが、
このまま計算するとモロにエラーw(当たり前)
ちなみに欲しい出力結果として、
前者は「x^2+2x+1」後者は「x^2+3xy+2y^2」。

分かる方お願いしますm(_ _)m
492デフォルトの名無しさん:02/11/16 06:27
>>491
記号処理をやらせたいわけだろ?
どうすればいいってどういうことだ?
そういうプログラム書けばいいだろ。
>>489
おお!すっきりしました。
サンクス!(おそレスすまそ
494デフォルトの名無しさん:02/11/17 21:24
>>492
そのプログラムが分からん^^;
モジュールとか使うのかな?
495もまずにパピコ:02/11/17 22:11
$_="(x+y)*(x+2y)";

s/\((-?[0-9]+|[1-9]*[a-z]+)\+?(-?[0-9]+|[1-9]*[a-z]+)\)\*\((-?[0-9]+|[1-9]*[a-z]+)\+?(-?[0-9]+|[1-9]*[a-z]+)\)/($1)*($3)+($1)*($4)+($2)*($3)+($2)*($4)/g;

print ;
496デフォルトの名無しさん:02/11/18 03:46
>>495
それだと予め答えの形式がわかってないといけません^^;
例えば
[1+{(x+y+1)^2}{(19-14x+3x^2-14y+6xy+3x^2)}]*
[30+{(2x-3y)^2}{18-32x+12x^2+48y-36xy+27y^2}]
なんて計算はできません^^;
↑が実際やりたい計算w
497デフォルトの名無しさん:02/11/18 04:05
>>496
いつまでも一人で笑ってろ、ボケ!
>>496
自分では何か考えたの?
dcにでも食わせれば?
>>496
おまえ、「計算」の意味知らないだろう?(w
おお。さすがPerlスレ。程度の低い争いが延々と続く(わら
>>491-500
みんな馬鹿(わら
Perlユーザには計算は難しいらしい(わらわら
504デフォルトの名無しさん:02/11/18 06:50
ところでPerlで文字式の計算はできんのか?w
複素数はできるらすぃーが。
>>504
文字式の計算って展開とか因数分解のことか?
>>496
数式を処理する場合、通常以下の方法で行われる。
 式のパーズ
→数式の表現(ツリーなど)
→処理用フィルター(項のまとめ、因数分解、その他)
→出力

この過程でPerlの正規表現が役に立つことがあるのは確かだが、これ以上はスレ違い。
アルゴリズムスレとか、より適切なスレがあるだろう。
s/(?!\d)\w+/\$$&/g;
s/\d+(?=\$)/$&*/g;
s/\^/**/g;
tr/\[\{\}\]/(())/;
eval $_;
数式処理は「Math::ematica」モジュールを使うと楽だYO!

http://search.cpan.org/author/ULPFR/Math-ematica-1.108/ematica.pm
>>508
Mathematicaのインターフェースじゃねえか!
>>506
Mathの下にいろいろあるようだ。
eval 式;

じゃダメなのか?
間違えた。変数はすべて一文字か。

tr/\[\{\}\]/(())/;
s/(?!\d)\w/\$$&/g;
s/[\)\w](?=[\(\$])/$&*/g;
s/\^/**/g;
print eval($_), "\n";
ていうか、いいかげん気づけよ!!
こういうのは LISP で書くと楽そうだね。
>>514
まったく同じことを書こうとしていたよ。最近schemeを勉強し始めたばかり
なんだけどね。
やっぱ、Perlじゃ書けないってか。
さすが糞Perl
実習でLispを使って微分のプログラムを書いたのを思い出しますた。
S式を使えばPerlでも楽に書けるかも、と言ってみるテスト。

#しかしそれはPerlで書いたLispインタプリタに過ぎない罠。
ってかPerlなら文字列でごまかしごまかすぃでっち上げるのがCool。
Genericなんか見えやしねー
>>496は氏ね。アルファベットの貞二も無しに語るなヴォケー
交換法則だの分配法則だの作って無理やり通せー
お前ら民足ね
520デフォルトの名無しさん:02/11/19 23:55
初歩ですいませんがperlのifっていうのはどう使うのでしょうか
↓のプログラムっていきなり3つ表示されちゃうんですが
100000000のときに1番目で
90000000のときに2番目で
80000000のときに3番目を表示させたいのですが
どこが間違ってますでしょうか?

$D=100000000;
for($i=$D;$i>=1;--$i){
if ($i =~ $D/10*10) {print $i." 1\n"; }
if ($i =~ $D/10*9) {print $i." 2\n"; }
if ($i =~ $D/10*8) {print $i." 3\n"; }
}
君はどんな参考書を読んでPerlをやっているのかな。

条件式のところの「=~」だけれど、この記号を使うのは、
右辺が正規表現のときなんだよね。
君の条件式だと右辺は数式ジャン?

で、その数式の意味も良くわからないな。

結論から書くと以下のようにすればいいんだけど、
もう少し桁数を少なくして試したほうが速いんじゃないかな。

$D=100000000;
for($i=$D;$i>=1;--$i){
if ($i == 100000000) {print $i." 1\n"; }
if ($i == 90000000) {print $i." 2\n"; }
if ($i == 80000000) {print $i." 3\n"; }
}

ネタっぽい気もしつつ、一応マジレス。
522520:02/11/20 02:34
激しく感謝
人のプログラムを改良しているので
自分よくわかってないのです。
523デフォルトの名無しさん:02/11/20 14:49
よくわかってない人が改良だってさ(w
524sage:02/11/20 17:05
perltkの質問はここでいいでつか?
Win32/Activeperl の環境なのですが
Tk::dirtree でドライブを選択することはできないのでしょうか。
Perlに乱数って有るんでしょうか?
二冊ほど参考書読んだのですが乗ってなかったので・・・・
Perlってのはイージーそうにみえるけど、
「他の言語の経験があるなら」イージーだというわけですね。

乱数は
$x = rand(); で、0以上1未満の乱数が、
$y = rand($z); で、0以上$z未満の乱数が得られます。($zは正の値)

本格的にやるなら、辞書っぽく関数の一覧がでてる参考書を探して買おう。
オライリーのポケットリファレンスは不親切だが安くて薄いよ。
527ほげ:02/11/21 15:25
active perl 5.6を使っています。
nslookupみたいに、ipアドレスからドメイン名を引く関数ってありますか?
それはgethostbyaddrのことじゃな。
529ほげ:02/11/21 16:06
ありがと
530デフォルトの名無しさん:02/11/21 19:07
STDIN からの入力を全て吸い上げるのに、join("", <>) より速く簡潔な方法
があったような覚えがあるんだけど、誰か知ってる?
>>530
これはどう?
@line = <>;
532530:02/11/21 19:12
>>531

単一の文字列にする場合のこと。
(改行を意識すると多分遅い。)
ちなみに、read(STDIN, $s, (1<<31)-1) は Out of memory だった(w
>>532
料理本に書いてある。見てくれ。
534perl始めて3日目:02/11/21 19:50
@unko("ウンコ","マンコ","ウンコ","チンコ","ウンコ");
っていう配列があってさ
ウンコ :3コ
チンコ :1コ
マンコ :1コ
(50音順)
って表示させたいんだがどーすればいいですか?
全角カナ→半角カナ変換て簡単に出来たっけ?
536デフォルトの名無しさん:02/11/21 20:12
Perlスクリプト内部から、他のPerlスクリプトを実行する場合どうすればいいですか?

537ほげ:02/11/21 20:17
>>534
ハッシュを使うとうまくいくかも
538 ◆hMJAPH9PWA :02/11/21 21:10
>>530
これでどう?

$/ = '';
$buffer = <STDIN>;

>>536
system, eval, requireのお好きな方法をどうぞ。
>>526

有難うございます
そうですね辞書っぽいの今度探して買ってみようと思います。
540perl始めて3日目:02/11/21 22:28
同じ名前の人が・・(,, ゚×゚)
>>537
ああ なるほど。
アリガトウ。
541530:02/11/21 22:35
>>538

(・∀・) ソレダ!
>>538
> $/ = '';
> $buffer = <STDIN>;

{
local $/;
$buffer = <STDIN>;
}

のまちがい?
543542:02/11/21 22:43
>>542
> local $/;

あ、漏れは local $/ = undef; って書くけど
perlvar のマネです
544530:02/11/21 23:33
お前ら!なかなか面白い結果になりましたよ。

$ ls -la /kernel
-r-xr-xr-x 1 root wheel 3582788 11/17 20:01 /kernel
$ /usr/bin/time perl -e '{ local $/ = undef; print <>;}' < /kernel > /dev/null
    5.23 real     3.64 user     1.39 sys
$ /usr/bin/time perl -e 'print join("", <>);' < /kernel > /dev/null
    0.17 real     0.14 user     0.03 sys
$ /usr/bin/time perl -e 'while (<>) { print; }' < /kernel > /dev/null
    0.12 real     0.06 user     0.05 sys
$ /usr/bin/time perl -e 'while(read(STDIN, $_, 8192)) { push @a, $_; } print join("", @a);' < /kernel > /dev/null
    0.06 real     0.03 user     0.03 sys
$ /usr/bin/time perl -e 'read(STDIN, $_, 99999999); print' < /kernel > /dev/null
    0.03 real     0.01 user     0.02 sys
$ /usr/bin/time perl -e 'while (read(STDIN, $s, 8192) > 0) { print $s; }' < /kernel > /dev/null
    0.02 real     0.00 user     0.01 sys

(FreeBSD 4.7R + Athlon 1G + メモリ128Mbytes)

$/ を変化させると異様に遅くなる。やはりお手軽な join("", <>) よりも速
くしたい時には read() を使うのがよさそうですな。>>533 も気になるので、
あとで料理本も読んでおきます。
どーでもいいベンチマークだな。
546デフォルトの名無しさん:02/11/22 05:57
>>544
530ってすげー頭弱そうだから、事前に一度ファイルを読み込ませて
おくのすらやってなさそう。

とはいえ、最初のやつだと、領域確保、転写、領域確保、転写、領域確保、
転写……の地獄だから、遅くても不思議ではないが。
547530:02/11/22 07:22
うわーなんかたたかれてるしー?

>>546
当然やってるって。そもそも 544 は時間順にソートしてあるだけだって気づかんの?
つか、検証すれば一瞬でわかるのに。
548 ◆hMJAPH9PWA :02/11/22 10:37
ああそうか。$/はundefでもいいんだっけ。
localはまぁケースバイケースだろうね。

>>544
変数への代入とファイル(/dev/nullだけど)への書き込みを
同列に扱われても、あまり参考にならないんじゃないかな。
それと、/kernelってよく知らないけどバイナリファイルでしょ?
普通はバイナリファイルに対して<>演算子は使わないから、そういう意味でもあまり参考にならないと思うよ。

最後にもう一つ。readで全てを読み込みたいなら、普通はread(FILEHANDLE, $buffer, -s FILEHANDLE)とする。
-sはstat(2)のラッパーで、ファイルやファイルハンドルのサイズを取得する演算子。
549デフォルトの名無しさん:02/11/22 11:08
% command < file
では動くのに
% cat file | command
では正常に動かないスクリプトがあって困っています。

プログラムはメールのフィルタで MIME::Parser で

$parser = new MIME::Parser;
$entity = $parser->read(\*STDIN) or die;

という感じなんですが、パイプで渡すと正常に解釈されません。
(body に Content-type 行が入ってきたり、bodyの一部がヘッダとして解釈されてしまいます)
550デフォルトの名無しさん:02/11/22 12:16
% cat file | command -

でもダメ?
551530:02/11/22 12:26
>>548
> ああそうか。$/はundefでもいいんだっけ。

若干意味が違うようです。

    $/   The input record separator, newline by default.
        This is used to influence Perl's idea of what a
        "line" is. Works like awk's RS variable,
        including treating empty lines as delimiters if
        set to the null string.

> 変数への代入とファイル(/dev/nullだけど)への書き込みを
> 同列に扱われても、あまり参考にならないんじゃないかな。

最適化による影響(perl ではまず無いだろうけど)が出ると嫌だったので、何
らかの処理を入れたかっただけ。まあ length とかの方がよかったのは確かだ
けど、処理時間はほとんど変化しない。(±10%程度)
552530:02/11/22 12:31
>>548
> それと、/kernelってよく知らないけどバイナリファイルでしょ?
> 普通はバイナリファイルに対して<>演算子は使わないから、そういう意味でもあま
> り参考にならないと思うよ。

日頃無茶な <> を使っていて、>>530 の質問もバイナリファイルを扱いながら
だったので。確かに <> を改行の少ない大きなファイルに使うと時間がかかる
というのはこれでよく分かりました。
(最初の例で ltrace を取ったら、realloc の嵐)

> 最後にもう一つ。readで全てを読み込みたいなら、普通はread(FILEHANDLE,
> $buffer, -s FILEHANDLE)とする。
> -sはstat(2)のラッパーで、ファイルやファイルハンドルのサイズを取得する演算子

STDIN が普通のファイル(パイプでもデバイスファイルでもない)という前提を
置いていいなら、もちろんそうする。(条件つきで分岐させるのが一番速いけ
ど、下手をすると >>549 みたいな現象も発生する。)
553549:02/11/22 13:58
>>550
駄目でした。
554549:02/11/22 14:25
ギャア!
すいません。
パイプで渡すと fseek() 出来ないんでした。
555デフォルトの名無しさん:02/11/22 16:03
質問です。2桁の整数値、たとえば
"01","09","01","21"
"01090121"
としたいのです。各値は実は日付で整数演算で日付の
更新を行っていますが、更新されたあとの数字を繋げると
"19121"
のように整数2桁にはなりません。
どうしたらよいのでしょうか?
>>555
$a=1;$b=9;$c=1;$d=21;
$s=sprintf "%02d%02d%02d%02d", $a, $b, $c, $d;
print $s;
557デフォルトの名無しさん:02/11/22 16:20
>>556
ありがとうございます(涙)
558デフォルトの名無しさん:02/11/22 18:27
HOGEディレクトリをモジュール検索パスに追加することは出来たんだけど、そこ以外からのモジュール検索を拒否するには、どうすればいいの?
@INC = ('HOGE');
560デフォルトの名無しさん:02/11/22 19:50
# Perl初心者です。
($dmy,$tel,@rain)= split(/,/,$line);
$ref_rain=\@rain;
$hash_rain{$tel}=$ref_rain;
# これを
$hoge=$hash_rain{$tele[$i]};

for($j=0;$j<155;$j++){
print "$j,$$hoge[$j]\n";
$s=$$hoge[$j];
print outf $j,$s;
print "$j,$s\n";
}

とすると、標準出力には表示できるのですが
ファイルに書き込まれません。どなたかお助けを。
>>560
outf はちゃんと開いて、ちゃんと閉じてるの?
562デフォルトの名無しさん:02/11/22 19:55
>>561 すみません。もうすこし下まで再掲します。
open(out,">$outf") or die "Failed to open $outf \n";
print "Now Printing $outf \n";
# print out "(h)","Rain\n";
$hoge=$hash_rain{$tele[$i]};

for($j=0;$j<148;$j++){
# print "$j,$$hoge[$j]\n";
$s=$$hoge[$j];
print outf $j,$s;
if($s>0){print "$j,s=$s\n"};
}
close outf;
#としております。
>>562
print out $j, $s;

close out;
じゃないの?
564デフォルトの名無しさん:02/11/22 19:58
>>563
ありがとうございます、ってなんて恥ずかしいミス。
..................無駄にサーバの容量使ってしまいました。
逝ってきます................。
565デフォルトの名無しさん:02/11/29 11:13
PerlでWindowsアプリ作る場合、GUIがネックになるのだが
Perl/TKみたいなしょぼいのじゃなくて何かないかねぇ?
566隊長:02/11/29 12:05
565さんにちなんで。

Win32APIをコールして、ダイアログを表示したりしたいのですが、
参考になるプログラムをどなたかご存知ですか?
どこを探ればよいのですか?
>>565
これはどう?
http://www.bahnhof.se/~johanl/perl/Loft/
>>566
たぶんWSHでやったほうが簡単
568565:02/11/29 17:20
>>567
あ、これ前にどっかで見たことあります。
英語苦手だから手出せなかったんだけど、
ちょっと挑戦してみようかなぁ。THX!
569デフォルトの名無しさん:02/12/01 20:20
perl -i.bak ./hoge.pl ARGV0 ARGV1 /moge/*.txt

ってな感じでmoge以下の.txtに.bakでバックアップを取りつつ
ARGV0 ARGV1の引数を渡したhoge.plを適用したいんだけど、
どう記述すれば良いの?
$ARGV0 = shift;
$ARGV1 = shift;
# やりたい処理。
571569:02/12/01 20:32
うーん、駄目ダス。ARGV0 ARGV1 が引数でなく
対象のファイルと解釈されてしまっているです
じゃBEGIN{}の中でshiftしてみ。
573569:02/12/02 11:28
結局駄目ですた。perl のコマンドラインからだと外の解釈の方が早いみたい。
むー、perl内部で対象ファイルを全検索して作業させるか、オプションを書き込んだ
ファイルを別に用意してオプションは内部から読ませるかしないと駄目かなぁ・・・
>>573 どうやってる?

$ cat hoge.pl
#! /usr/bin/perl
BEGIN {
  $s0 = shift;
  $s1 = shift;
}
s/$s0/$s1/;
$ echo hoge > hoge.txt
$ perl -pi.bak hoge.pl o a hoge.txt
$ cat hoge.txt
hage
$ cat hoge.txt.bak
hoge
575569:02/12/02 14:21
おぉ、できたダスよ。丁寧な指導ありがとうです。
576569:02/12/02 14:22
たぶんARGV[0]とか特殊な変数使ったのが駄目だったかもです。
577デフォルトの名無しさん:02/12/02 14:43
メールのmime encodeされたSubject: フィールド(=?iso-2022-jp?B?とかいうやつ)を
decodeするのはどんなライブラリを使えばいいでしょう?
定番Mime-toolsを使おうとして、
ttp://search.cpan.org/author/ERYQ/MIME-tools-5.411a/lib/MIME/Tools.pm
をみると、そのままずばり「how do I decode these encoded strings?」と
太字で書いてあるところがあって、MIME::WordDecoderを使えと書いてあります。
ところがこれは、「more-popular Western byte representations」だけみたいなんです。

iso-2022-jpのものをdecodeするには何を使えばいいんでしょう?
579りゅう:02/12/04 20:04
超初心者で困っています。
マジレスでおながい。(゚Д゚)
サーバーはapacheを使っていて
perlはActiveperlというものを使っています。
そこで以下の簡単な足し算の式が本に載っていたので
やってみたんですけどエラーが出ちゃって、実行
できません、何故でしょうか?
よろしくお願いします。

#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
$number1 = 10;
$number2 = 5;
$answer = $number1 + $number2;
print "$number1 + $number2 の答えは$answerです。;
_END_
>>579

> print "$number1 + $number2 の答えは$answerです。;

"が閉じてないがほんとに本のまま打ち込んだのか?
581りゅう:02/12/04 20:24
>>580
あっここなんですか。( ゚Д゚)ポカーン
はい本のまま打ちこみました。
今、本で確認してみましたけど
閉じてありませんでした。
また何か会ったらよろしくお願いします。
ありがとうございました。
582りゅう:02/12/04 20:29
>>580
言われた通りに修正して更新してみたら
本当にできました。ありがとうございました。
尊敬もんです。(・∀・)カコイイ!
ちなみに書籍名は
「カスタマイズで覚えるまるごとPerl&CGI」
というものです。藁
>>579 >>580
板違い
584デフォルトの名無しさん:02/12/05 23:31
ActivePerl(5.8)で, 4G以上のファイルに対して以下のようなコードがうまく動かないんだけど, バグかな?

open(FH, '>>largefile.txt');
print FH 'a';

printの手前に seek(FH, 0, 2); を加えれば, とりあえず何とかなるけど。
585デフォルトの名無しさん:02/12/05 23:34
>>584
その部分でけじゃなんとも言えないよ
>>584
もしもWin9x系を使ってるなら、ファイルシステム(FAT32)の限界だと思われ。
正規表現でつまりますた。

/a/b c d/e f g/h i j/k l m

という文字列から

b c d

だけを取り出したいので

/^\/a\/(.+)\/.+/

とやって$1を参照すると

b c d/e f g/h i j

とでてしまいます。 どうすればいいんでしょぅか・・・


age
事故レスだけど正規表現でなくてsplitつかえば
即解決なんスね・・・
>>587
後方参照指定を / 以外の文字クラスとするか、非欲張りマッチにする。

/^\/a\/([^\/]+)\/.+/
/^\/a\/(.+?)\/.+/
>>590
すごい。ありがとうございます。
非欲張りマッチなんてしらなかったです。

ためしにググってみたら5件しかヒットしなかったです。
レアなんすかね。
592デフォルトの名無しさん:02/12/06 18:45
なあ、CGIのソース見るとグローバル変数使いまくりなんだけど、
そうした方がプログラムが速くなるとか何か理由があるわけ?
おれには理解出来ないんだけど。
localとmyを一切使わないプログラムってどういうのよ。
>>592
かわいそうなソースしか見てないんだね
594デフォルトの名無しさん:02/12/06 18:48
>>593
やっぱおかしいだろ?おれは何か特別な理由があるのかと
おもってたけど単なるヘタレコードなだけだろ?

まったくいやになるよな・・・
>>594
掲示板やカウンターのCGIで使われている理由。

 厨 の 質 問 を 減 ら す た め

まああれだ、みてて気持ち悪いよな。
なるほど。君頭いいね。localとかmyを使わないでおくと、localとかmyの勉強をしなくてすむんだね。
>>595
なんとなく納得…
598デフォルトの名無しさん:02/12/06 18:57
だってよ、一応サブルーチンに分けてはあるけど
パラメータが一つもねえものしか、ねえんだよ(泣

そしてmyやlocal(これはまあ使わなくてもいいけど、、)
が一つもねえんだよ。。。全ての変数がグローバル変数。

こんなのどうやって直せっていうんだよ。
コードサイズはまあCGIだから多くがHTMLソースだとしても、
それでも2万行ぐらいある。はぁ。。。氏にてゑ
599デフォルトの名無しさん:02/12/06 19:02
いったいどんな本で勉強したらああいったコードが出来上がるわけ?
おれはラクダ本しかもってないが、あれに書いてあるサンプルコードは
ちゃんと関数にはパラメータを渡してるし、スコープもなるべく狭い
範囲に限定するようなものになってる。

糞本書いてるやつは死ね
に、二万行??

厨が書いたんなら、10個に分割できるスクリプトが直列に並んでるだけじゃないのか?
ガンガレ。
CGIとHTMLの本は悲惨な内容のものが多いよ。
CGIだととりあえず動いてしまうから始末に終えないんだよね。

部分的に中途半端に直すよりは、プログラムそのものを理解したほうがはやいと思う。
VBで似たような状況に陥ったけど、そのときは全ての変数について徹底的に洗い上げたよ。
まあyyとかhって変数がグローバルで重要なデータに使われてたりして愕然としたわけだが。
602デフォルトの名無しさん:02/12/06 19:31
PF_INET6

AF_INET6
を使うにはどうすれば良い?

Perlのバージョンは5.6です。
>>591
nongreedy
>>603
thanks.

たしかにnongreedyでググるとたくさんヒットしますね。でも日本語ページはヒットしないな。
日本のperlプログラマのあいだではやっぱりレアなんですかね。
>>604
どうだろな。結構使う機会あると思うんだが。
>>604
普通に使ってると思うが・・・
単語が浸透してないだけじゃないか?
漏れは「最短マッチ」と呼んでる。
http://www.google.co.jp/search?q=%E6%9C%80%E7%9F%AD%E3%83%9E%E3%83%83%E3%83%81&ie=UTF-8&oe=UTF-8&hl=ja&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja
>>606
なるほど

thanks
自分の場合、最短一致だったり…
だから最短マッチじゃ間違っているんだってば。
>>609
「だから」はどこにかかってるんだ?
どこにも正しい間違いの話は出ていないが?
611デフォルトの名無しさん:02/12/08 00:07
CGIの話で申し訳ないんだが、
perl(5.00503)のCGI.pmで

CGI::ReadParse(\%FORM);

とやった後に、$FORM{'〜'}の中身をどうやっても空にすることが
できないんだけどこれって仕様?

CGI::ReadParse(\%FORM); #この時点で$FORM{'url'}に値が入る
$FORM{'url'}='';
print("Content-type: text/html\n\n");
print($FORM{'url'}); #空になっていない。
↑ごめん。やっぱ板違いなので
Web プログラミング板に行って来ます。
undefしてもだめ?
614デフォルトの名無しさん:02/12/08 12:45
greedy:欲張り、貪欲
禁欲マッチ
616デフォルトの名無しさん:02/12/08 15:40
スニーカーぶるーす
617611:02/12/08 17:06
>>613
undefしても駄目でした。

$FORM{'url'}='hoge';

みたいに空以外の文字列だとちゃんと入るのが不思議。
>>617
んー?Perl5.6とか5.8とかで試してみれば?
>>602
Socket6 モジュール入れてみた?
【バージョン】
$ perl --version
This is perl, v5.8.0 built for cygwin-multi-64int


【ソース】
use CGI;
$ENV{'REQUEST_METHOD'} = 'GET';
$ENV{'QUERY_STRING'} = 'url=http://www.google.com';
CGI::ReadParse(\%FORM);

print "1 ",$FORM{'url'},"\n";

$FORM{'url'} = 'change';
print "2 ",$FORM{'url'},"\n";

$FORM{'url'} = '';
print "3 ",$FORM{'url'},"\n";



【結果】
$ perl hoge.pl
1 http://www.google.com
2 change
3
>>620>>617宛てです。

うちのPerl5.8では普通でしたよ。
>>620
5.6.0だと確かにクリアされない。
delete($FORM{'url'});
が必要のようだ。
624デフォルトの名無しさん:02/12/08 18:07
バイナリファイルの編集で、
先頭から何Byte目から何Byteを削除したいときってどうすんの?
625デフォルトの名無しさん:02/12/08 19:11
プ >>616
626 ◆F52DmOxJlc :02/12/08 20:58
>>624
・substr() 使う。
・読み出し書き込みのループの中で「何Byte目から何Byte」は書き込みをスキップ。
>>624
こんな感じでどうだ?
バイナリ値が入ったスカラ、オフセット、長さを指定して
$bar = bin_delete($foo,3,8);
とかで動くはず。
何バイト目は、オフセット指定な
1バイト目だったら0を指定で

sub bin_delete ($$$)
{
 my $bin = shift;
 my $offset = shift;
 my $length = shift;
 my ($result,$bin_length,$i,$j);

 $bin_length = 8 * length($bin); # 8bit char;

 for($i=0;$i<=$offset;$i++) {
  vec($result,$i,1) = vec($bin,$i,1);
 }

 for($j=$offset+$length+1;$j<$bin_length;$i++,$j++) {
  vec($result,$i,1) = vec($bin,$j,1);
 }
 return $result;
}
628627:02/12/08 21:02
すまん、bit単位だった。
vec() のオフセット8にして、あと適当に直せばByte単位で動くよ(多分
>624
MSDOS, Windows系はbinmode()を使うことを忘れずに。
630624:02/12/08 23:56
ん〜。
例えば/tmp/binってファイルがあって、
このファイルの中身が

00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f

だったとします。
このファイルの8byte目から16byteを削って

00 01 02 03 04 05 06 07 18 19 1a 1b 1c 1d 1e 1f

ってデータに書き変えたいんです。初心者ですみません。
>>630
ファイルって考えるから混乱するんだ

イ $hoge にファイルの内容を読み込み
ロ $hoge の8〜16Byte目を削った $fuga を作る
ハ $fuga をファイルに保存

イとハは出来るよな? ただファイル扱うだけだから。

あとは、ロの部分を何とかしてやりゃいい。
$fuga = substr($hoge,0,8); # 0番目から8個(7まで)
$fuga .= substr($hoge,26); # 27番目から最後

これでいいと思うが、substr()がバイトストリームちゃんと扱えるかどうかは自信ない
COBOL風の書式指定で数値と文字列を相互変換するようなモジュールが無いでしょうか?

toFix("9(3)V9(3)", 1.25) → "001250"

toFloat(9(3)V9(3)", "001250") → 1.25

みたいなかんじ。
$fuga = $hoge; # 上記例に合わせて $fugaを用意
substr($fuga,7,16) = undef;

>>630 って9Byte目から16Byteを削ってないか?
634624:02/12/09 00:26
>>630
一回ファイルを読み込んで
編集後の内容を書き込むといったイメージですか?
わかりますた。

635624:02/12/09 00:28
>>633
1番目のByteって1byte目っていうですかね?
それとも0byte目っていうんですかね?
そこらへんよくわかってないんですんません。
>>635
1番目のByteは1Byte目

>>630 の例だと
1Byte目 は '00'
2Byte目 は '01'
(略)
8Byte目 は '07'

9Byte目の'08' からを削ってないかい?

あと、オフセット(一番最初からの位置/距離)は0から数えるよ。
最初(1バイト目)から5バイト : オフセット0, 長さ5
3バイト目から8バイト : オフセット2, 長さ8
8バイト目から16バイト: オフセット7, 長さ16 (>>633の例)

オフセットは「対象の前に幾つデータがあるか?」って考えると分かりやすいかも。
637 ◆F52DmOxJlc :02/12/09 00:40
>>634
>一回ファイルを読み込んで
バイナリファイルって大きさどのくらいだ?
あまり大きすぎるなら全部読み込むのはメモリ的にきついかも。
638624:02/12/09 00:41
>>636
ありがとござます。
おっしゃるとおりです。
seek()とかで0byte目とか指定するから0byteから数えておりました。
>>631
> これでいいと思うが、substr()がバイトストリームちゃんと扱えるかどうかは自信ない
問題ない。
640624:02/12/09 00:47
>>637
容量的には大きくないけど
大きい場合にはいい方法ありますか?
open()で開いて
チョコチョコっと削除して
close()
みたいなやりかたってないんかな?
全部メモリに読み込まずに。
>>640
ブロック単位に、seekして読んではseekして書き込みの繰り返しだろうな。
>>640
・読み出し書き込みのループの中で「何Byte目から何Byte」は書き込みをスキップ。
>>640
あるいは別ファイルに書き出してからコピーするかrenameするか。
644 ◆F52DmOxJlc :02/12/09 01:03
>>640

# m byte 目から n byte を削除として。
open IN, "<source";
open OUT, ">target";
$len = (stat(IN))[7];
for ($i = 1; $i <= $len; $i ++) {
$c = getc(IN);
print OUT $c if ($i < m || $i >= m + n);
}
close OUT;
close IN;

ループで毎回 if で判定するのが気になるならループを二つに分けて間で seek() する。
645デフォルトの名無しさん:02/12/09 18:16
ところで、ラクダ本3版って買うべき? 2版は持ってる
1(要らない)〜5(絶対買うべき) で言うとどの位かねぇ
3
647645:02/12/09 19:21
予想通りの答えだ(w
金に余裕出来たら買うか・・・
648デフォルトの名無しさん:02/12/09 20:11
「オブジェクト指向Perlマスターコース」て訳がだめでつか?やっぱ原書嫁?
649646:02/12/09 20:23
ラクダ本もカワセミ本も読んだことないけどそこそこPerl使えてるよ。
「すぐわかるPerl」から入ってあとはmanの邦訳で。
650645:02/12/09 20:40
俺もそこそこは使ってる
search.CPAN と perldoc だけで何とかなるけど
思想的な部分はラクダ本でも読んでおかないと
651646:02/12/09 20:53
そんなこと言われると俺も読んでみたくなるじゃないか(w
でも2版と3版でそんなに内容変わってるものかな。
>>650
俺は、perl なんてしょせん「そこそこ使えれば十分」な用途にしか使わないから。
ラクダ本とか見たことない。
思想的に他の言語にそんなに違わないと思うけど ? (少なくともそこそこ使える範囲ではね。)
>>632
まずないと思う。
COBOL はあまり知らないのでなんともいえないけど、自分で作ってもそんなに難しくないと思う。
思想:TMTOWTDI
655650:02/12/09 22:18
思想=LarryのJoke いや、まじで

>653
"9(3)V9(4)だったら sprintf("%03.4f"とかして作った後に '.'を消去して
作ってる。
逆は。後ろから3桁の次に '.'を挿入してから数値として評価。

今のところ有効桁数を越えるような桁数が出てこないのと
9(9)
9(9)V9(9)
という2種類しか出てないからなんとかなってるんだけど。
>656
スマソ
後ろから4桁の次、の間違い。
Perlスクリプト内で一旦外部のプログラムを実行した後、
その実行によって得られた戻り値を取得する・・・
といった処理は可能だろうか。
色々調べたんだが結局駄目だった。
659デフォルトの名無しさん:02/12/10 01:44
パターン修飾子の /s と /m の違いがわかるいい例文はないですか?
お願いします。
>>658

$str = `date`;
@str = `ls`;
$exitcode = system('cp foo bar');

とかじゃ無いのか?
>>659

$str = "aaa\nbbb\nccc";
print "/s match\n" if $str =~ /a$/s;
print "/m match\n" if $str =~ /a$/m;

実行してみ
662659:02/12/10 02:12
>>661
ありがとうございます。
わかりますた。m(__)m
>>660
申し訳ないがよくわからん・・・

例えば実行中のスクリプトから"test.exe"を引数"1"を渡して実行する。
"test.exe"では受け取った引数"1"に応じた処理を行い、実行結果を戻り値として
Perlのスクリプトのほうに戻す。
とりあえず受け取った値を出力する。

といったようなことをしたいわけだが・・・。
>>663
system LIST
"exec LIST" とほとんど同じですが、まず fork を行ない、 親プロセスではチャイルドプロセスが終了するのを wait します。
exec の項で述べたように、引数の処理は、引 数の数によって異なることに注意してください。
返却値 は、wait() が返すプログラムの exit 状態です。
実際 の exit 値を得るには 256 で割ってください。
このド キュメントの exec の項も参照してください。
>>663
何言ってるか分からん
test.exe が返す 0(成功) -1(失敗) のようなexit codeを受け取りたいのか
それとも test.exe を実行したときに画面に表示される文字列を受け取りたいのか
どっちだね
666663:02/12/10 04:05
わかり難くてすまん。
どっちと言われれば後者のほうに当たる。
667611:02/12/10 10:37
>>621
ありがとうございます。そうですか、
5.8.0入れてもらうにはレンタルサーバー側に言わないと駄目ですね。

>>622
やはりそうですよね。
$FORM{'url'}=~s/^http:\/\/$//;
とやろうとしたのですがマッチしてもクリアされないん
ですよねぇ。

いた違いなのに答えてくれてありがとうございました。
(かしこ)
>>666
$str = `test.exe 1`;

リストで受け取りたいなら
@str = `test.exe 1`;

基本中の基本だぞ、これを探せない方が難しい
>>667
>>623は見た?
Perl 5.6.0自身のバグなのか、5.6.0のCGI.pmのバグなのかは追い切れてないが。
>>669
ただのハッシュにCGI.pmが関係あるの会?

>>667
$a = $FORM{'url'};
$a =~s/^http:\/\/$//;
FORM{'url'} = $a;
だな。
>>670
>>611,613,617-623

ReadParseでtie(%in,CGI)してるので「ただのハッシュ」というわけでもない
みたいなんだな、これが。
672602:02/12/10 17:23
>>619
>Socket6 モジュール入れてみた?

うん。
OSがFreeBSDなんだけど、/usr/ports/net/p5-Socket6
で普通にmake installしただけ。

use Socket; なのか use Socket6; なのかわからん。

取り敢えず実行すると
Socket: Protocol not supported at file line11
と表示されてしまう。

file line11 は
socket(S,PF_INET6,SOCK_STREAM,0)||die "socket: $!";

どうなんでしょう?
673602:02/12/10 17:26
672のエラー文だけど、
use Socket; でも use Socket6;
でも同じね。
>>673

use Socket;
use Socket6;

ではどうだい?
675 ◆hMJAPH9PWA :02/12/10 20:48
>>CGI.pmのReadParse

CGI.pmのバグだと思う。(私の環境にあった)version 2.752だと問題ないみたい。

でもそのReadParseに渡したハッシュって結局param()メソッドのラッパーにすぎないから、
cgi-lib.plとの互換性以外は無意味な気がする。
値が複数あると一々split /\0/しなきゃいけないから面倒だしね。
676デフォルトの名無しさん:02/12/11 00:42
ある文字列に、任意の文字(正規表現)が幾つ含まれるかを求めるにはどうしたらいいだろうか。

$str に元の文字列、$countに結果を返すとして

1文字の場合
$str = $count =~ tr/A//;

複数文字/正規表現の場合
@tmp = $str =~ m/PATTERN/g;
$count = @tmp;

1文字は多分これが一番短いと思う( $_ は除く)
他の場合は、もっと短く出来ると思うんだが、上手い方法が思いつかない
$count = scalar ($str =~ m/PATTERN/g);
じゃダメだった(なんでだろう・・・)
何か慣用句的な使い方があった様な気もしないでもないんだけど

誰かアドバイスおねがいします
効率/コードの簡潔さ 共に知識不足でこれ以上考えられないっす。
>>676
s///でやれば痴漢した数が帰ってくるはずだけど。。
$count = $str =~ s/PATTERN/$&/g; すりゃ良かったのか・・・
tr使っておきながら「マッチカウントだからm//だ」と思い込んでた自分が恥ずかしい・・・(鬱

スレ汚しスマソ
あるスクリプトからrequireした2つの.plファイルがあって、
片方の中にあるサブルーチンから、
もう片方の中にあるサブルーチンを呼び出したい。

どうすればいいのでしょう?
俺のやり方がおかしいだけなのかな?なんか出来ない。
そのrequireするふたつのplファイルのそれぞれの頭ンとこに
package hoge;
とか
package fuga;
とか書いておいて、
一方からもう一方を呼ぶときにたとえば
&hoge::fuga();
というふうにするんだったと思ったが。

requireする順序に関わらず双方向で呼び合う時にはなにか工夫が要るかも?
# req.pl
require 'a.pl';
require 'b.pl';
a();
# END-----

# a.pl
sub a
{
 print "A.pl\n";
 b();
}
1;
# END-----

# b.pl
sub b
{
 print "B.pl\n";
}
1;
# END-----

>perl req.pl
A.pl
B.pl

問題無いけど?
ありがとうございます。
>>680
名前空間ですか。それは使ったことがありませんでした。やってみます。

>>681
ホントでつか?
683679=682:02/12/11 01:48
できますた。

=cut

=cut

が変なところまで入り込んでました…。
スマソ>>680>>681
684 :02/12/11 02:05
ついでだから補足

a.pl で require 'b.pl';
b.pl で require 'a.pl';
main.p; で require 'a.pl'; require 'b.pl';

としても、ちゃんと1回だけ読んでくれるから問題無いらしい
Cの#includeとは違って、"require"だからね。
あたりまえっちゃーあたりまえか。
全ての*.pmで require "config.pl" して、1回しか読み込まれず、
config.pl内で定義した$CONFIG_HOGEが使えなくて焦ったことがあります。
PHPだと require(), require_once() が別々なんだよな。
後から出来たのに、何故?
include(), include_once() もあるから余計ややこしい
688602:02/12/11 22:11
>>674

でけた。さんくす。
689 ◆hMJAPH9PWA :02/12/11 22:29
Perlで複数回読み込みたいならdo "file" ってのがあるよ。
690デフォルトの名無しさん:02/12/12 11:41
Linux(RH8)にPerl/TkをインストールしたかったのですがCPANから取って来れません。

# perl -MCPAN -e 'install Tk'
ftp.perl.org をDNSに問いあわせています... 失敗しました: ホストが見つかりません

nslookupの結果は
Non-authoritative answer:
ftp.perl.org canonical name = ftp.cpan.ddns.develooper.com.
Name: ftp.cpan.ddns.develooper.com
Address: 142.132.1.82
691デフォルトの名無しさん:02/12/12 12:23
perlのインストールについて
WINDOWS98で、perl(日本語パッチも当てたい)をインストールしようと思っています

あの、perlの本やネットでインストール方法を探したんですが、
www.activestate.com/Products/Download/Get.plex?id=ActivePerl&_x=1
からインストールするようなことは分かったんですが、
WINDOWS98のリンクを押すと、Apixxx.exeじゃなく
InstMsiA.exeのダウンロードが始まってしまって困っています。
どうやってみんな成功したんでしょうか。
まだ日本語パッチファイルもインストール方法を調べないといけないと
いうのに、本体のダウンロードさえも出来ていないのは情けないなと思ってるんですが。
なんとかっていうマイクロソフトの新型インストーラーがあって
まずそれをインスコしてからperl本体を(拡張子msiだったようなきがする)
インスコするんだよ。
でも日本語がどうのっていうんなら、先にそのやり方調べたら?
693デフォルトの名無しさん:02/12/12 13:18
うぉ、嬉しいなぁー692さん、ありがとうございます。
日本語のやつも調べています。日本語の奴は、まずActivePerlをCドライバーの下に
インストールして、そのあとインストールすることがわかりました。
692さんが言ってるなんとかっていうマイクロソフトの新型インストールは
さっき僕が言ってたInstMsiA.exeのことな気がしてきました。
だったらperl本体もさがさないといけないと思って探しているんですが、
ActivePerl 5.8.0 build 804 っていうのがそうですかね。
って思ったんですが、11メガ以上もある。
ソフトってこんなに大きいんですか?!!
君が示したページ、
http://www.activestate.com/Products/Download/Get.plex?id=ActivePerl&_x=1

には「Perlをインストールするのに必要なもの」が書いてあるんだよ。

Windows98の人は、「Windows Installer 2.0以降」が必要ですよ、って。
で上のほうの「General」には、55メガバイトぐらいディスクの
空きスペースが必要だよとも書いてあるね。

日本語のやつのにどういう説明が書いてあるかわからないけど、
バージョンをちゃんと確認しないとね。

5.8.0は結構最近出たやつだよ。
って、5.8.0出たんだな。日本語のファイル名とかちゃんと扱えるだろうか。
ちと心配。
695デフォルトの名無しさん:02/12/12 14:55
質問!!
perlでEXCELのpersonal.xlsマクロを起動方法って
どうやればいいんですか?
誰か知ってたら教えてください。
696デフォルトの名無しさん:02/12/12 15:06
>695
$Excel->Run("マクロ名")じゃだめなわけ?
697デフォルトの名無しさん:02/12/12 15:13
696様
ありがとうございます。でも、それは試したのですが
動かないんですよね。色々検索してもpersonalマクロの起動
方法は見つからないんですよ。
大変困ってます。
698デフォルトの名無しさん:02/12/12 15:19
694さん、おっしゃるとおりでしたよ!
今はそのインストーラをインストールし終わって、これから
本体を探すところです。でも、11Mバイト以上もあるから、かなり時間が
かかりそうですよ!
うち、32キロ回線だから、遅いらしくて…
699デフォルトの名無しさん:02/12/12 17:41
$a = "abc(de)fghi";
$b = "(de)fg";
があったとき、
$a = "abchi"にしたいのですが、
$a =~ s/$b//;
とすると()がまずいのかうまくいきません。
何かいい方法はありますか?
$a =~ s/\Q$b//;
>700
できました!
ありがとうございます。
702デフォルトの名無しさん:02/12/12 20:02
クロージャってどういうときに使うとありがたみがでるもの?
ProgrammingPerl3edにはメンバ関数への参照の作り方のサンプルが
載ってるけど、他には何かあるかな?
703 ◆hMJAPH9PWA :02/12/13 00:12
よくサンプルとして使われる例としては、カウンターメーカーとか。

sub make_counter{
my $count = shift;
return sub{ $count++ };
}
# カウンターを作る
my $counter1 = make_counter(1);
my $counter2 = make_counter(10);
# 使う
print $counter1->(); # 1
print $counter2->(); # 10
print $counter1->(); # 2
print $counter2->(); # 11
704 ◆hMJAPH9PWA :02/12/13 00:14
(続き)
ありがたみは「手軽なオブジェクトの代用品」ってところかな。
上の処理をクロージャなしでやると面倒だし、
Perlの場合はフィールドに対するアクセス制限が出来ないので危険でもある。

{ #まず、カウンタークラスを定義して…
package Counter;
sub new{
my $class = shift;
bless{ count => shift } => $class;
}
sub next{
$_[0]->{count}++;
}
}
# カウンターを作る
my $counter1 = Counter->new(1);
my $counter2 = Counter->new(2);
# 使う
print $counter1->next();
# 後は同じ
>ありがたみは「手軽なオブジェクトの代用品」ってところかな
>Perlの場合はフィールドに対するアクセス制限が出来ないので

なるほど。自分としては状態を持った関数というものをどういう
フウに使えばいいのか分からず考えてました。
オブジェクトが値に関数が付いているのと逆で関数に値がついているというかね。

本にも書いてあるようにLispから拝借した概念ならLisp風のコーディングに
ついて勉強すればいいのだろうけど、どうもそこまでは。。。

もっといろいろと勉強しないとだめですな。どうもありがとうございます。
C風の/*〜*/のコメントとC++風の//〜\nのコメントを同時にファイルから剥ぐ
正規表現を探していますが見つかりません。C風のコメントを剥ぐだけなら
見つかるのですけれど。誰かが作っていても良さそうなものですがご存知ない
でしょうか?お教えください。

おながいします。
>>706

s@//.*$@@;
で良さそうなもんだが
>>706
文字列リテラルなどを考えると、C風のも正規表現だけでは不可能。
ということにしたいんですね?:-)
710デフォルトの名無しさん:02/12/13 12:06
# closureのテスト
# funcの呼び出し。無名関数への参照を取得
# 無名関数の参照呼び出し。
# funcはレキシカル変数を無名関数に渡すためのラッパーとして機能する。
sub func
{
  my $func = shift;
  print "func1 end\n";
  return sub{ my $h1 = $func . shift;
        print "h1 end\n";
        return sub{ my $h2 = $h1 . shift;
              print "h2 end\n";
              return sub{ my $h3 = $h2 . shift;
                    print "$h3 \n";
                    print "h3 end\n";
                   };
             };
       };
}
print "make h1 ref\n";
$h1 = func("aaa ");
sleep(1);
print "make h2 ref\n";
$h2 = &$h1("bbb ");
sleep(1);
print "make h3 ref\n";
$h3 = &$h2("ccc ");
sleep(1);
print "call h3 ref\n";
&$h3("ddd ");
このような関数を作ってクロージャのテストしてみたのですが、
出力がなぜか思うようになりません。
これはなぜなんでしょうか?全てが最後にドバッと出てきてしまいます。
あ、すみません。勘違いでした。失礼しました。
713デフォルトの名無しさん:02/12/13 17:11
気が合うな。クズ。
714706:02/12/14 00:02
>>708

$_にCのソース全てが入っているとして
s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|\n+|.[^/"'\\]*)#$2#g;
でCのコメント削除ができるらしいのです。実際それっぽく動きます。

で、これを//〜\nまでの削除に対応させるべく拡張しようと思っていたのだけれど、
深みに嵌まっていやんな状態になって、車輪の再発明するのもなんだな、と思っての質問です。

ちなみに上の正規表現はこのサイトから拾って来ました。
http://www.tech-web.net/perlmania/perlfaq6.html#How_do_I_use_a_regular_expressio

Jeffrey Friedlレベルのperlハッカーキボン
釣られて見る X-D
>>714
/*〜*/ 式の場合、改行を跨げるから s スイッチつけて
全体一気処理しつつ、最短マッチで置換するのがよさげ。
// の場合は行末までがコメントだから >>707 のが最善。
性質違うから無理に1linerしないほうが簡単では?
#てか、あまり異種コメント混在ってのが美しくない気も…
>>714

>>707 すら理解出来ないのにハカーキボンとか言ってんじゃねぇよ
正規表現勉強してから物言えや
リテラル文字列とかあるからねぇ
突然ですが、環境変数「PERL5OPT」をセットしてあると
Activeperl5.8のインスコ失敗しませんか?(Win版)
スレ違いなら失礼。
なんてセットしてんのよ?
721デフォルトの名無しさん:02/12/14 19:50
wxPerl OSXで動いた人いる?
日本語関係がうまくいかねー
euc、jis、sjis
どれを使えばいいですか?


euc
>>722
euc
>>720
-MWildですが。
726デフォルトの名無しさん:02/12/15 06:27
Perlヲタってソースコードまで見るやつが少なすぎる気がするんだけど気のせい?
727デフォルトの名無しさん:02/12/15 08:05
sub retref{my $val = 'まんこ'; return \$val}
print ${&retref};
こういうのはアリなのかなあ
>>727
わざわざリファレンス返す理由は?
スカラー返してから、必要ならその返り値のリファレンスを取った方が良いと思うけど
クロージャなら >>703 あたりを参照

sub retref{
my $a = 'foo';
return \$a;
}

$b = &retref;
$c = &retref;
$d = $b;
print $$b . "\n";
print $$c . "\n";
print $$d . "\n";
$$b = 'bar';
print $$b . "\n";
print $$c . "\n";
print $$d . "\n";

実行結果
foo
foo
foo
bar
foo
foo
729728:02/12/15 15:35
ごめん、手で打ったら間違った

foo
foo
foo
bar
foo
bar
>>728
結局Dynamic Scopeだろうが、Lexcal Scopeだろうが、
参照カウントを数えて、ゼロになったらGCで
回収するということに変わりはないんだよね?
myはシンタックス上のものであって、
メモリ管理はまた別の話になると見えますね。
print "おにぎり";

この
「おにぎり」って文字列は、
jis ですか?
euc ですか?



>>731
ソースファイルのエンコーディングによる
733706:02/12/15 21:48
態度悪かったですか?すんまそん。

>>707 and >>715
回答していただいたのはありがたいんですが、やりたかったのは>>706に書いた
通り、C風とC++風のコメント混在したソースからのコメント除去なんですよ。

>>708 and >>718
Jeffrey Friedlの正規表現では、リテラル中に含まれる例外への対応が不十分
だと言う事ですか?詳細キボン。

>>716
御意。>>714のスクリプトでは$/ = undef;として全ての行を一気読みして同様の
事を実現していますね。行末は$で実現させないで\nでいけると思います。
仰る通り1linerにする必要は有りません。でもC風のコメントの中にC++風の
コメント開始のトークンが現れたり、その逆もあるし、正規表現で実現させるには
一気にやるしか無いですよね?Cのコメント除去後C++のコメントの除去、もしくは
その反対ではダメなんですよ。(てかこの辺の説明は不要ですよね?)
課題としてはメチャ難しい類に入ると思います。

本来の目的自体はCのプリプロセッサを通すという、真っ当な方法で解決して
しまいました。あとは単なる技術的な興味です。お騒がせさまでした。
(゚Д゚)ハァ?
735デフォルトの名無しさん:02/12/16 00:20
PerlでCのdefineとか
アセンブラのマクロみたいなことってできる?
>>733
>714のREは|で区切って順に
#コメント|文字列|文字|改行|それ以外#
ってなってるんだから、そこに>707を突っ込みゃいいだろ。
737デフォルトの名無しさん:02/12/16 01:14
Socketモジュールを使って inet_aton と inet_ntoa で
ホスト名からIPアドレスを取れるじゃないですか。
その逆のIPアドレスからホスト名を逆引いてくれるコマンド
教えてください。
>>736
そんな簡単な話じゃないような気がする。
それだと //**/ とかに対応できなくない?
>>738
じゃこうかな。mオプションもいるか?
s#/(?:/.*|\*[^*]*\*+(?:[^/*][^*]*\*+)*/)|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|\n+|.[^/"'\\]*)#$1#g;

740デフォルトの名無しさん:02/12/16 02:12
>737
gethostbyaddr
>>738
俺が言えるのは、そんな気の狂った文字列を書くなという事だけだ。
健闘を祈る
742デフォルトの名無しさん:02/12/16 08:09
Perlプログラムが狂気だと?
それは違うな。
正規表現記述にxオプションを使わない奴が狂っているだけさ。
Perlは己の狂気を映す鏡。
己に臆すは臆病者よ。
はははーっ!
このスレは>>742の狂気を映す鏡になりますた。
狂ってるのは
//**/
こういうコメントの事だろ
こういうのはどうだ?
int cxx_comment = 1 //**/ 2
;
>>745
それC99になったら使えねぇよなあ。
正味な話、一発でなんでもOKなコードよりも

・特殊な例を以外は処理出来るコード
・特殊な例を発見するコード
・特殊な例に泥臭く対応するコード

を組み合わせてサクッと片付けることのほうが多い。
>>739
お、できてるっぽいね。
749デフォルトの名無しさん:02/12/16 22:31
掲示板にメール送信機能をつけてみたんですが、題名に日本語が使えず、
メッセージのところも改行が「・」で、「>」が&gt;になったりしてしまいます。
どこをどう直すべきでしょうか?

>>750がソースです
750デフォルトの名無しさん:02/12/16 22:31
#------------------メール送信機能-------------------------#
open(MAIL,"| /usr/sbin/sendmail -t") || &error("送信できません。");
print MAIL <<"_MAIL_";
From: xxx\@xx.xx
To: xxxxxx\@xxxx.ne.jp
MIME-Version: 1.0
Subject: 投稿がありました
X-Mailer: Sendmail
Content-type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

投稿がありました。
名前:$name
題名:$subject
メールアドレス:$mail
ホームページ:$url
メッセージ:$msg
---------------------------------------
投稿者情報
IP:$ip
ホスト:$host
---------------------------------------
_MAIL_
close(MAIL);
#--------------------メール送信機能------------------------#

よろしくお願いします。
>>749-750
jcode.plを知らんのだろうか…
>>751
そろそろ Jcode.pm では(Encodeは知らない)

プロバイダでJcode.pm使えないとか抜かすならWeb板行ってくれ
753749:02/12/16 23:29
やり方がよくわかんないんです
754706:02/12/17 00:30
>>739
流石です。>>738のレスを見てから最大18分で修正&投稿で一発動作。
漏れにはマネできません。

重箱突付く様で恐縮ですが、//〜\\nの対応が未対応ですね。
漏れも>>736のヒントを受けて少し考えて見ました。

s#/\*[^*]*\*+(?:[^/*][^*]*\*+)*/|//(?:\\\n|[^\n])*(?=\n)|("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\n+|.[^/"'\\]*)#$1#g;

確認用のCソースは以下です。

int main(int argc, char* argv[]){
printf("ややこしいコメントの例/*\n");/*
//ここはコメント*/ printf("// /*この文字列はプリントされる*/\n"); // /*
//printf("この文字列はプリントされない\n");*/ /*
printf("*/\n");// */とプリントされる\
ここはコメントだがVC++6.0ではワーニングが発生
return 0;
}

この質問はこれで完了と言う事で有難うございました。
755デフォルトの名無しさん:02/12/17 02:04
indexでは対象文字列から文字列を検索することができますが、
何文字目という位置情報しか得られません。
検索した文字列が存在する位置の座標情報を得る為にはどうしたらよいのでしょうか・・・
座標情報(ぷっ
便座情報
プリプロセッサを選ぶ狂気のコメント
bccでは1,gccでは一度cppに掛けた後コンパイルで0

#include <stdio.h>
#define line add(/,/)
#define in add(/,*)
#define add(s1,s2) s1##s2
int main (){
int i=0;
line;/*
i=1;
in;*/
printf("%d\n",i);
return 0;
}
759739:02/12/17 11:36
>>754
> 重箱突付く様で恐縮ですが、//〜\\nの対応が未対応ですね。
あ、継続するんだっけ。正直、忘れてた。
いまでもワーニングって言う人いるんだ。
グッドウォーニング サー!!
ワーニングでもマクドナルドでも、通じるならいいじゃん。
ワーニングでも通じるけど、内心笑われてるかもよ
fatal はなんとよむのよ?
ふぇいたる?
テキストファイルの1行を消して詰めたいのですが
やっぱり、消したデータをダミーファイルに書いて
新規で作り直してダミーファイルからコピーしないと駄目なのでしょうか?
767 ◆F52DmOxJlc :02/12/18 18:25
>>766
こんなんでいいのかな?

#!/usr/bin/perl

# $ARGV[0] がファイル名、$ARGV[1] が消したい行(0ベース)

exit 0 unless (open IN, "<$ARGV[0]");
@lines = <IN>;
close IN;

$lines[$ARGV[1]] = "";

open OUT, ">$ARGV[0]";
print OUT @lines;
close OUT;

__END__

ダミーファイル云々がよく理解できないよ。
768766:02/12/18 18:39
>>767さん
おお、それです。
ありがとうございます。

769教えて君:02/12/18 19:07
カレントディレクトリの絶対パスを取得するにはどうしたらいいですか?
>>769
ボウヤ、世の中には検索エンジンという便利なものがあるんだよ。
http://www.google.co.jp/
>>769
use Cwd; $cwd = cwd();
772教えて君:02/12/18 20:03
>>771
そういうモジュールがあったのですか,
ありがとうございます。
773デフォルトの名無しさん:02/12/19 06:22
perl5.6のdbmopenで作ったファイルをperl5.8で読み書きしたいのですが、可能ですか?
どうやら仕様が変更されて読み込めない。。。
別に問題はない
775デフォルトの名無しさん:02/12/19 08:10
プラットフォームが違うと読み込めないことがあるよ。
776773:02/12/19 08:22
どうしても読み込ませたい場合には、どのようにしたらいいのですか?
方法があるのでしたらご教授ください!
777デフォルトの名無しさん:02/12/19 08:23
今、サブルーチンを書いています。そこで質問です。
戻り値として何の型が要求されてるのかを知りたいのですが、どうやったらサブルーチン内で判別できるのでしょうか?
778デフォルトの名無しさん:02/12/19 08:33
>>776
互換性のあるDB(YukiWikiDB2など)にそっくり入れ替るスクリプトと、そこからまた新形式に入れ替えるスクリプトを書く。これが確実。
779773:02/12/19 08:36
>>778
YukiWikiDB2というDBですか。初めて聞きます。。
ほかに互換性のあるDBも教えていただけたら教えてください。
780デフォルトの名無しさん:02/12/19 08:51
無知なので、他のDBは知らない。
dbopenで何のDBが開くかは環境依存。大抵はバイナリファイルで実装されたDBが開く。そしてこのファイルは、種類が違うと互換性が無いと思ったほうがいい。
YukiWikiDBはファイルシステムを利用した、dbopenに近いインターフェイス―要するにハッシュみたいに使える―DB。
これは比較的移植性が高いので、バイナリDBの入れ替えをするのに向いていると思って書いた。
781デフォルトの名無しさん:02/12/19 09:47
perl5.8.0のコンパイルをしたんですが、make testで100% okayになりません。
みなさんどのぐらいで妥協していますか?
>>777
> 戻り値として何の型が要求されてるのかを知りたい
if(wantarray){リスト
}elsif(defined wantarray){スカラー
}else{戻り値無し
}
だったと思います。

私も質問です。
以下のように無名 FileHandle を hash にブチ込んで利用したい訳なんですが、、

use IO::File;
$fh{'fh1'}=IO::File->new("> file");
print $fh{'fh1'} "hoge";
close $fh{'fh1'};

知らなかったのですが print $fh{'fh1'} "hoge"; で
$fh{'fh1'} が展開されないようなのです。(汗
これはどうすれば利用可能になりますか?
暫定的な対処として以下のように書いてみたのですが、
もっとスマートな方法があれば教えて下さい。

use IO::File;
$fh{'fh1'}=IO::File->new("> file");
my $fh=$fh{'fh1'};
print $fh "hoge";
close $fh{'fh1'};
783デフォルトの名無しさん:02/12/19 12:54
>>781
オプティマイズレベルを下げたら100%いけました。
>>781
いっつもLocaleあたりで警告喰らって97%ほどで妥協します〜(ヘタレ
>>782

print {$fh{'fh1'}} "hoge";

これで行けるよ
786785:02/12/19 14:57
>>785
> print {$fh{'fh1'}} "hoge";
ぉぉぉおおなるほど。ありがとうございます。(多謝
>>777
wantarray という関数でリストコンテキストかを判定できるが、これで
いいのかな。だめならもうすこし詳細をキボンヌ。
>>787
うが、被ってるよ。はずかしいな。最近navi2chの調子が悪くて更新がうまくできん
のです。スマソ。
>>782
あれ、でも
>if(wantarray){リスト
>}elsif(defined wantarray){スカラー
>}else{戻り値無し
>}
これ変じゃないですか? defined wantarray => Trueならリストでしょう。

漏れはだいたいサブルーチンの最後で
return wantarray ? $scalar : @list;
のようにやります。
790デフォルトの名無しさん:02/12/19 15:22
はじめまして。お聞きしたいことがあるのですが、Javascriptで作った変数をPerlの変数に渡したいのですがどのようにすれば良いのでしょうか?

具体的にはCGIプログラムの中で`./client "Javascriptの変数"`として外部のプログラムにCGIでプリントするHTMLの中のJavascriptで作った変数の値を渡したいのですが。

Javascriptではフォームを作ってそのフォームに入力されてた文字を変数に入れるような動作をしています。

どなたか教えてください。宜しくお願いします。
791782:02/12/19 15:27
>>789
> これ変じゃないですか? defined wantarray => Trueならリストでしょう。
うがーごめんなたい...(;´Д⊂
物凄い勢いでperl書いて腱鞘炎で逝ってきまつ...
>>789
デタラメ書くなよ

リスト: wantarray, defined(wantarray) 共に真
スカラー: wantarray は偽、defined(wantarray)は真
戻り値なし: wantarray,defined(wantarray) 共に偽

戻り値無しのケースを無視したとしても
return wantarray ? @list : $scalar;
だろうに
793782:02/12/19 15:55
>>792
> リスト: wantarray, defined(wantarray) 共に真
> スカラー: wantarray は偽、defined(wantarray)は真
> 戻り値なし: wantarray,defined(wantarray) 共に偽
え〜と、つまり私は間違ってない..のかな?(汗
つか、脳内で書くから駄目なんですね、
今すぐテストしに逝ってきます。お騒がせしました。
>>782 ので合ってるよ
795735:02/12/19 19:51
>>735
自己レス。
Cの#defineみたいなことをするのは
use constant HOGE => 'あああ';
でOKらしいんだけど、引数をつけられるプラグマってない?
つーかプラグマってどうやってつくるんだろうか。
普通のモジュールと何が違うの?


796735:02/12/19 20:08
use xxx HOGE(x,y) {print(x*y);}
みたいなことがしたいのだよ。
なんだこりゃ…?
ActivePerl Build631(5.6.1)でたったいま気付いたのだが、
H'1A を 「getc」で読み込むと、このキャラ以降 undef
(End of File)を返すっぽい…これってやはり仕様?
#なんで今時そんなMS-DOSなことが。追試希望。
##それとも単にdocの読みが甘いだけ?(´・ω・`)
798 ◆F52DmOxJlc :02/12/19 20:32
>>797
binmode してみたら?
関係ないかな。
>>797
VCあたりのランタイムの仕様。
いやなら>>798のいう通りbinmode。

どうでもいいけどH'1Aって何の書き方?
>>792
ああそうですね、スマソ。逆にしてしまった。
>>798
CでのソースをPerlにそっくり移植してテストしてたんですわ…。
ファイルopen後、binmode 切替済状態でこの現象に当たったのです。
getc がスクリプトバグの犯人であることが解かるまで小一時間悩んじった。
とりあえず今はreadにすりかえて回避してますが、美しくナーイ(;;
#Perlではコンソール入力(STDIN)向け?関数だからプラットフォーム依存仕様なのか?
#MSDOSのコンソール入力終了は^Zだし…。(UNIXでは^Dだよね?)
>>801
通常のファイルからでも同じ動作?
build804では\x1aとそれ以降も普通に読み込む
804デフォルトの名無しさん:02/12/20 10:13
>>792
>>777 ではありませんが質問させてください。
サブルーチンの中でreturnしなければ最後に評価された式が返され、return;
だけだとundefもしくは()が返されたんじゃないかと思うんですが、perlで
「戻り値なし」というのはどうやるんでしょうか。またサブルーチンを呼ぶ
際に左辺の変数で受けなければ戻り値は消えるはずで、どういうシチュエー
ションで「戻り値なし」を区別しなければならないのでしょうか。
805デフォルトの名無しさん:02/12/20 10:50
Windows上で作成したプログラムで

open(FILE, "<tst.dat");
@data = <FILE>;
close(FILE);

foreach (@data)
{
chomp;
}

foreach (@data)
{
print $_;
}
↑のように書いてRedhatLinuxにあげて実行したら表示されません。
プログラム上に改行コードを含めて実行すると表示されるのに別ファイルか
ら読み込むとできないんですが…。知ってる方いたら教えてくださいお願いします。
open(FILE, "<tst.dat");

open(FILE, "tst.dat");

つーかWebProg板でしゃぶっとけ
807名無しさん@Vim%Chalice:02/12/20 12:13
>>806
> open(FILE, "<tst.dat");
> open(FILE, "tst.dat");
どっちも正しいと思うぞ。

>>805
何がしたいのか全くわかりませんので説明して下さい。
コードを見ると読み込んだファイルの“改行を取って”
標準出力するんですか?一行になりますよ?
それでもイイのであればこうするのが良いかと。

open FH,"hoge.dat";
print chomp while <FH>;
close FH;
808デフォルトの名無しさん:02/12/20 12:29
>>807
そのとおりです。m(__)m
”標準出力に改行無しで出力させたいんです”

お答え頂いてありがとうございます。
でも、807さんのを実行してみたら「1」が行数文出たんですが、
これって環境のせいでしょうか?
chompは、なんか本には、戻り値が「取り除いた文字数」と書いてあるんですが
本が間違ってますかね?
809 ◆f7mhnEfPcU :02/12/20 12:44
>>808
> でも、807さんのを実行してみたら「1」が行数文出たんですが、
ごめんなさい。その通りです。寝ぼけました。

chomp and print while <FH>;

でどうですか?
810ASM.NET:02/12/20 12:46
HTML::Paserのイベントで呼ばれるサブルーチンに
引数を渡したり戻り値を受け取ったりすることはできない?
グローバルな変数で処理しろってか?使いづらっ!
>>808
>>807殿が誤っておられます。環境のせいではなく仕様です。
perl -p -e 'chomp;' filename
とやれば用件を満たすのではないかと思います。
812デフォルトの名無しさん:02/12/20 13:17
809さんと811さんに教えていただいたのをやってみたんですが、
両方とも駄目でした。
1文字も出力されません。
一応、プログラム中に「改行を入れた変数」を取り除いたり、
文字列と「改行コード」を「.」で連結させて表示させたりは
可能なんですが、取り除いてからの「配列での1行出力」が
できないんですよ…。1行であれば回しちゃっても構わない
んですが、それの表示もできません。
どうか宜しくお願いします。
813807:02/12/20 13:35
>>811
> perl -p -e 'chomp;' filename
その手がありましたか...
普段使わないので完全に忘れ去っておりました。

>>812
ん〜おかしいな。。
>>811
つーか改行取りたいだけならtr -d '\012'だけどな。
>>812
シェルとその設定によっては、
最後に改行を入れないと表示されないことがあるようです。
私のzshではそうなります。

>>814
私はawk, sed, trなどは全てperlで代用しております。
perl で、定期的(数秒おき)に処理をしたいのですが、スマートなやり方がわかりません。
とりあえず書いてみたコードは、見た目通り動かない上に、迷惑極まりないポーリングなので
このあたりも何とかしてみたいのですが、何かヒントを頂けないでしょうか。

$event=0;

sub alarm_handler {$event++; $SIG{ALRM} = \&alarm_hander;};
$SIG{ALRM} = \&alarm_handler;

alarm 1;
while(1) {
while ( $event <= 0 ) {$event;}; $event--;
print "tick ";
alarm 1;
}
なんでsleep使わんの?
818816:02/12/20 15:51
>>817
例えば、10秒おきに処理をしたいけど、その処理に5秒位かかるので、
素直にsleep 10 とかすると、何秒おきかわからなくなるかな?
となると、イベントでなんとかしないと?と思って、こうしました。

でも、sleep で眠って、時間になったら fork すればいいのかな?
早速やってみます。
>>810
HTML::Parser より HTML::TokeParser のほうが楽。
>>816

pipe を使う方法。
--
pipe R, W;
$SIG{ALRM} = sub { syswrite(W, 'o', 1); };
while (1) { alarm 1; if (sysread(R, $tmp, 1) > 0) { print "tick "; } }
--
W は non-blocking mode にした方が良い。
sysread のエラー処理もやっておくべき。

821816:02/12/20 16:19
>>817
最終的には sleep + fork でうまいこといきました。

試しに作ってみた失敗作の駄目っぷりが尋常でないので晒します。
笑ってやって下さい。
# 当の本人も、コンピュータも固まりました。

while(1) {
if($pid=fork) {
sleep 1;
} elsif (defined $pid) {
print "tick ";
}
}

# 3:57PM up 41 days, 25 mins, 1 user, load averages: 215.88, 65.60, 24.73
# こんなにロードアベレージをあげたのは始めて。
822816:02/12/20 16:26
うまいこといったほうです。
while(1) { if($pid=fork) { sleep 1; }
elsif (defined $pid) { print "tick "; exit; } }
>>821
ワラタw
>>810
頭がワリィーのがもろ三重だな。オブジェクトだよ、object
825816:02/12/20 17:32
>>820
pipe の勉強から始めます。
ありがとうございます。
826ASM.NET:02/12/20 18:27
>>810
なるほど、そっちも検討してみます。
ちなみに、HTML::Parserのイベントで呼ばれるサブルーチンへ
引数を渡したり戻り値を受け取ったりすることはできませんか?

>>824
>頭がワリィーのがもろ三重だな。オブジェクトだよ、object
なんですかこの頭の悪い生き物は?(w
827ASM.NET:02/12/20 18:28
>>819の間違いだった。
うわ、分かってないな(w
使ったことないけど、perldoc HTML::Parser を
サラッと読んだ感じでは event のコールバック
プロシージャを定義するだけなんじゃないか?
と思った。呼出元の object も捕捉できるようだし…。
CODEを引数として受け取るようなサブルーチンを作りたいんだけど、上手くいかない。
やりたいのは

foo { some code; } $bar, $baz;

みたいに、第一引数にCODEを受け取るモノなんだけど
これは sub foo(&@){ } で出来た。
この foo を

foo $bar, $baz;

のように、CODEを省略してもOKな様にしたい。
引数の受け取り方は sort みたいな感じ。

別に明確な目的がある訳じゃなく
出来るなら試してみたいって程度なんだけど
831デフォルトの名無しさん:02/12/20 23:33
>>830
第2引数以降が“リファレンスでない”のが確かなら、

sub foo {
unshift @_, sub{ "dummycode" } if ref $_[0];
my( $somecode, $bar, $baz) = @_;
###
}

見たいに判定して引数リストそのものを右へずらしてしまえば?
#ref の返値がコードリファレンスか確認すればなお良いかと。
832デフォルトの名無しさん:02/12/21 00:38
$a = 301.4 * 400;
$b = int($a);
print "\$a=$a \$b=$b \n";

を実行すると
$a=120560 $b=120559
と結果が表示されます。これって仕様なのでしょうか。
小数点以下切り捨てをしたいのですが、1足りなくなる場合があって困ってます。
>>796
>>284-285

>>830
sub foo {
 my $code = ref $_[0] eq 'CODE' ? shift : sub { ... };

>>832
($b) = $a =~ /(\d+)\.?/;
834824:02/12/21 01:37
>>826
頭の悪い生き物だが、あんたよりはマシと思われ(w
こんな風に使うんだよ
use HTML::Parser;
$p = HTML::Parser->new();
$p->parse_file('test.htm');
print $p->{CHECK_A},"\n";


sub HTML::Parser::start {
my ($self,$tagname,$attr,$attrseq,$text) = @_;
$self->{CHECK_A}++ if $tagname eq 'a' ;
}
835ASM.NET:02/12/21 01:55
>>834
直接メソッド書き換えるのなんかどうかと思わん?
836デフォルトの名無しさん:02/12/21 03:02
Ruby Wayっつー本に、

「オブジェクト指向Perlマスターコース(ピアソン)」
では2種類のポリモルフィズムを解説している。
1つは継承を使ったポリモルフィズム、
もう1つはインタフェースポリモルフィズムだ。

と書いてあります。
んで、インタフェースポリモルフィズムってなに?
>>835
お利口さんなコメントだな。ホントのお利口さんなら添削するもんだがな(w
834はスタブを直接書き換えて何が悪かろうというもんだ。
あんたの気にいるように書き換えてやろう。
package MyParser;
$p = MyParser->new();
$p->parse_file('test.htm');
print $p->{CHECK_A},"\n";
package MyParser;
use base 'HTML::Parser';
sub start {
my ($self,$tagname,$attr,$attrseq,$text) = @_;
$self->{CHECK_A}++ if $tagname eq 'a' ;
}
1;

新式では次のように汁
use HTML::Parser;
$p = HTML::Parser->new(api_version => 3,
start_h => [ \&my_start, "self,tag" ]);
$p->parse_file('test.htm');
print $p->{CHECK_A},"\n";

sub my_start{
my ($self, $tag) = @_;
$self->{CHECK_A}++ if $tag eq 'a' ;
}
838名無しさん@Emacs:02/12/21 12:58
perlccとperl2exeでは、何が違うのでしょうか?
大橋巨泉のパールウッシッシー
840 ◆hMJAPH9PWA :02/12/21 18:32
>>836
「ジェネリックプログラミング」と呼ばれる手法の基本になる考え方…かな。
「xという処理をするyというメソッドを持っていなければならない」という"インターフェイス"によってポリモーフィズムを実現するのがインターフェイスポリモーフィズム。
例えば:

package Foo;
sub new; # 実装は省略
sub print_me;

package Bar;
sub new;
sub print_me;

package main;
my @coll;
foreach my $class(qw(Foo Bar)){
# これも一種のインターフェイスポリモーフィズム
# FooとBarは互いに関係ないが、同名のコンストラクタを持つ為思った通りに動く
push @coll, $class->new();
}
foreach my $o(@coll){
# print_meというインターフェイスによってポリモーフィズムを実現する
$o->print_me();
# @collに入っているのが何か知らなくてもいい。
}

バイナリファイルをコピーするやり方を教えてください。
842 ◆F52DmOxJlc :02/12/22 02:49
>>841
#!/usr/bin/perl

# $ARGV[0] がコピー元、$ARGV[1] がコピー先。

open IN, "<$ARGV[0]";
binmode IN;# 念のため。
open OUT, ">$ARGV[1]";
for ($i = 0; $i < (stat(IN))[7]; $i ++) {
print OUT getc(IN);
}
close OUT;
close IN;
__END__

ファイルの存否とか open の可否とかのチェックは自分で付け加えておくれ。
>>842
ありがとう。感動しますた。
844デフォルトの名無しさん:02/12/22 14:37
>>842
binmode OUT をド忘れしてらっしゃいませぬ?
#そのままでは出力時に(Win)\n->CRLF、(Mac)\n->CRに化けそう。
入出力両方にbinmodeかけるのがアンパイかと。
845デフォルトの名無しさん:02/12/22 14:43
emacsでperl-mode使ってるんだけど、
これって正規表現が絡むと色づけがおかしくなるよね?
みなさん気にしないでプログラミングしてるのかな?
>>845
エスケープして逃げるなあ。
あとコメントで止めるとか。($a =~ s/\d+/"/; # ")

まあ使いにくいことは確かだね。
ヒアドキュメントのインデントもおかしい
>>845-846
cperl-modeを使っている。perl-modeよりは改善されている。
>>847
>>846の例はcperl-modeでもダメなようだが。
>>847
Windows上でemacs使ってるんだけど、
cperl-modeいいです。ありがとう。
850デフォルトの名無しさん:02/12/23 11:03
windows2000にActivePerl5.6(build633)を入れて使ってます.

漢数字を半角数字に置換したいのですが,
$list =~ s/一/1/g;
は置換できるのに,
$list =~ s/十/10/g;
とすると"Unrecognized character"とエラーを吐かれます.

調べると"十"の2バイト目が"\"とコードが重複(0x5C)してるのが原因だと分かったのですが,
これを回避する方法が分からず前に進めません.
何か良い策は無いでしょうか・・


とりあえず試してみたことは

(1) シングルクォートでエスケープする.→ $list =~ s/'十'/10/g;
結果)エラーは出なくなったが置換してくれない.

(2) コード,変換するデータ共にeucで処理する.
require "jcode.pl";
&jcode'convert(*list, "euc");
$list =~ s/十/10/g;
&jcode'convert(*list, "sjis");
こんな感じのコードをeucで保存して実行.
結果)エラーは出なくなったがそれまで置換出来てたもの("一"とか)すら置換出来なくなった.


windowsでperlを使うこと自体間違ってるのでしょうか。゜(゚ ̄∩ ゚̄)゜。
851_:02/12/23 11:14
>>850
Jperlパッチを当てるか、Perl5.8 を使うのが無難に思うけど…。

これ自体が間違い: $list =~ s/十/10/g;
s/// は s""" と等価。つまり変数が展開されるし
\エスケープも解釈される。だから '\' を含む文字
がおかしくなる。かといって単純に
こうする「$list =~ s'十'10'g;」わけにもいかない。
( \' がエスケープ解釈されてエラーになる)
そこでちょっと面倒だけどこういう定義をする。

$str = q/十/;
$list =~ s/$str/10/g;

(q/.../ は '...' と等価でかつ \\ \' 以外はエスケープされない)
当然だけど Webフォームやファイルから直接 $str に
代入するほうが手間が少ない。スクリプト中に直接
SJIS漢字文字列を埋め込む行為が面倒の原因。
こんなのは?
$test = "十\";
$test =~ s/十\/10/g;
print $test;
854850:02/12/23 12:54
>>852
こんなに早く解決していただけるとは思ってませんでした
どうもありがとうございます.
perlは動けばいいやみたいな場当たり的使い方しかしてこなかったので
基本的知識が欠落してました.(´Д`;)
本当に感謝ですm(_ _)m
855850:02/12/23 13:05
>>853
最初"十"の真ん中に"\"入れるのはどうしたらいいのかなって考えたんですが
なるほど後ろに"\"付けるのは気づかない発想でした( ̄□ ̄;
856852:02/12/23 19:04
>>855
「十\」とかって書き方は、簡単な対処なんだけどその文字
コードを事前に知ってないとできないのが難だったり。
(他には“表”とか“ソ”とか。まあ暗記すれば良いが)
#nkfしてソースをEUC他に変換することもできないし…。
なので自分は迂遠な例をあげたの。お好みによってどうぞ。
EUCにしたら良いのに・・・と思ってはいても
Shift-JISで、気付かずに使ったりするんだよね。

─ソ欺圭構蚕十申能表暴予栃饅表能
貼噂兔x欺曾箪禄浬喀媾彌拿杤歃濬
畚秉綵臀藹觸軆鐔鷭xЫ\

ところどころ重複してるかも知れんけど、コンくらいあるね。
858853:02/12/23 20:42
>>856
そんなわけで>>852に賛成。
859デフォルトの名無しさん:02/12/23 23:46
PerlってCみたく文字列を1文字単位でアクセスできないんですか?
できますよ?
どのようにやるのでしょうか?
リファレンスに見当たらないのです。
>>859
文字列分解の基本は二種類。

1.substr で1文字ずつ抜き取る。(BASIC風)

$str = "abcd";
for ( $i=0; $i < length $str; $i++ ){
print "[", substr( $str, $i, 1 ), "]";
}

2.split で配列にバラす。(こっちのが優速)

$str = "abcd";
for $i ( split //, $str ) { print "[$i]"; }
# あるいは @array = split //, $str; で配列変数へ

>>861
この場面で“リファレンス”って台詞が出てくるってことは
文字単位でのキャラクタ値が欲しいのかしら?(ヨミすぎ?)
だとしたら2の変形で split の変わりに unpack を使うといい。

@array = unpack( "C*", $str );
#配列の各要素は、文字単位でのASCIIキャラクタ値。(結果としてC言語に近い)

いずれにせよこういう処理ではリファレンスの出番はないですが。
(あれは間接参照ではあるがアドレスではないので、Cのポインタと等価ではない)
>>862
ワラタ
上手いな
865859:02/12/24 01:26
>>862
とても丁寧な説明ありがとうございます。
いままで文字列のコピーを使いまくってたけど、これって
もしかしたら参照をやり取りするのに代えたらパフォーマンス
上がるかな?
>>866
定数文字列なら、巨大になるほどリファレンスに替える価値はあるよ。
(文字列演算が絡むなら、なんでもかんでもリファレンス化とはいかないが)
効果が高いのはサブルーチンやメソッドに文字列引数を渡す場合とかとか?

&foo( \$a, \$b ); # 事前にプロトタイプ宣言すれば foo( $a, $b ) とも書けるが。
テキスト中の"「","」"で囲まれた中の改行のみ削除(他の改行は残す)
したいのですが、うまい記述方法はありませんでしょうか?
869perl勉強厨:02/12/24 13:35
>>868
s/(".*?)\n(.*?")/$1$2/g
じゃ駄目かな?

ツッコミ宜しくです。m(__)m
>>869
"じゃなくて「のことをいっているんだろ
>>869
.*?ってなにさ。
*は前の文字の0回以上の繰り返し
>>870
そのとおり、会話文のカギ括弧「」の方でつ・・・。
print $1 while(/(「(.*?)」)/gs);
で会話文だけ抜き出すところまではできたのですが、
ここに含まれる改行のみ削除するところで???となってます。
873869:02/12/24 14:40
>>870
し、知ってるさ...(涙
勘違いなんてしてないです...ハイ。

>>871
シマツタ..
. は“改行を除く”任意の文字でしたね。
改行もマッチすると思いこんでますた。

s/(「.*)\n(.*」)/$1$2/g;

文字コード直接書いた方がイイかな?
...ていうか思いきり間違ってるような気がする。
addParseFiles("control/warperauth.txt", \%partyWarperAuth, \&parseDataFile);

というサブルーチン呼び出しを行ったときに、2番目と3番目の引数は
どんな型のデータが渡されるのですか?サブルーチン側では
my $file = shift;
my $hash = shift;
my $function = shift;
となっているからスカラー値だとは思うのですが、なぜにわざわざ\%とか\&見たいな
プレフィックスらしきものをつけるのでしょうか?バリバリ初心者ですまない。
875874:02/12/24 15:35
自己解決しました。
メモリ領域参照のためのリファレンスだったのですね。スレ汚しすみませんでした。
>>873
「AAA
BBB
CCC」
のような文の場合がアウトでつ・・・。
>>873
s/「.*?」/$&=~tr(\n)()d/mge;
878デフォルトの名無しさん:02/12/24 23:11
>>876
てゆか、データソースはなによ?
改行入りですべて変数に入っているのか?

さっき1行ずつ読んでその処理するのを書いていたけど、
"「"があったら状態遷移して、"」"までchompして.してたなり。

しかし日本語には、"「"と"」" がバランスしていなければイケナイ
という理由はないという幻惑的な罠もあったり。

879デフォルトの名無しさん:02/12/25 03:48
return <<\"EOF";
<!DOCTYPE HTML PUBLIC>
EOF
みたいなかき方はできないものかな。ようは関数内に書き込まれた
文字列定数への参照を戻り値として使いたいところなのですが。
880デフォルトの名無しさん:02/12/25 03:58
return \(<<"EOF");

EOF
これで上手く動きました。参考にしたのは下のドキュメントです
http://www30.cds.ne.jp/~yukinaka/eureka/notes/perl_memo.html#heredoc
881デフォルトの名無しさん:02/12/25 10:31
$str = "abc「123\n456\n789」def";
$str =~ s/「[^「]*\n[^」]*」//g;
print $str;
exit;

>abcdef
882デフォルトの名無しさん:02/12/25 13:21
[^<マルチバイト文字>]ってやって地獄の底でのたうつ人って多いよね。
>>878
ちょいと事情がありまして、
---8<---
while(<>){$text .= $_;}
$_ = $text;
s/\r\n/\n/g;
s/(「.*)\n(.*」)/$1$2/g; # 869氏提案
s/\n/\r\n/g;
print $_;
---8<---
なスクリプトに、
---8<---
てすと
「A

A」
「BBB!
 」
「CCC「D」CCC
 」
おわり
---8<---
なSJISテキストを食わせて一括整形したいのでつ。
884デフォルトの名無しさん:02/12/25 14:09
$str = "abc「12\n34「AB\nCD\nEF」\n56\n78」def\n";
while ($str =~ s/「(.*?)\n([^\x00]*?」)/「$1$2/) {};
print $str;

>abc「1234「ABCDEF」5678」def
885デフォルトの名無しさん:02/12/25 14:24
$str = "abc\n「12\n34「AB\nCD\nEF」\n56\n78」d\nef\n";
1 while $str =~ s/(「.*?)\n([^\x00]*?」)/$1$2/;
print $str;

>abc
>「1234「ABCDEF」5678」d
>ef
>
886デフォルトの名無しさん:02/12/25 14:34
$str = "abc\n「12\n34「ほげ\nほげ」999「AB\nCD\nEF」\n56\n78」d\nef\n";
1 while $str =~ s/(「|「)(.*?)\n([^\x00]*?)(」|」)/$1$2$3$4/;
print $str;

>abc
>「1234「ほげほげ」999「ABCDEF」5678」d
>ef
>
$str = "abc\n「12\n34「ほげ\nほげ」\n\n」\n999\n「\n888\n「AB\nCD\nEF」\n56\n78」d\nef\n";
1 while $str =~ s/(「|「)([^(」)|(」)]*?)\n/$1$2/;
1 while $str =~ s/\n([^(「)|(「)]*?)(」|」)/$1$2/;
print $str;

>abc
>「1234「ほげほげ」」
>999
>「888「ABCDEF」5678」d
>ef
>
888デフォルトの名無しさん:02/12/25 16:19
# sjis '「' = 0x8175 '」' = 0x8176 'u' = 0x75 'v' = 0x76
# euc '「' = 0xA1D6 '」' = 0xA1D7 '「' = 0xD6 '' = 0xD7
require 'jcode.pl';
$str = "abc\n「12\n34「ほuvげ\nほuvげ」\n\n」\n999「\n\n\n\n」\n「\n888\n「AB\nCD\nEF」\n56\n78」d\nef\n";
&jcode'sjis2euc(*str);
1 while $str =~ s/(\xA1\xD6)([^\xA1\xD7]*?)\n/$1$2/;
1 while $str =~ s/\n([^\xA1\xD6]*?)(\xA1\xD7)/$1$2/;
&jcode'euc2sjis(*str);
print $str;
>>883
書き忘れ。
perlのversionは
This is perl, v5.6.1 built for cygwin-multi
でつ。

>>884-887
お疲れ様でした。
が、それでは>>882様のご指摘どおり、
地獄の底でのたうつことになってしまいます・・・。
# sjis '「' = 0x8175 '」' = 0x8176 'u' = 0x75 'v' = 0x76
# euc '「' = 0xA1D6 '」' = 0xA1D7 '「' = 0xD6 '' = 0xD7
$str = "abc\n「\n1\n2\n3」「12\n34「ほu\nvげ\nほuvげ」\n\n」\n999「\n\n\n\n」\n「\n888\n「AB\nCD\nEF」\n56\n78」d\nef\n";
1 while $str =~ s/(「)([^\x81\x76|\x00|\x00]*?)\n/$1$2/;
1 while $str =~ s/\n([^\x81\x75|\x00|\x00]*?)(」)/$1$2/;
print $str;
$str = "abc\n「\n1\n2\n3」「12\n34「ほu\nvげ\nほuvげ」\n\n」\n999「\n\n\n\n」\n「\n888\n「AB\nCD\nEF」\n56\n78」d\nef\n";

while ($str =~ /(「|」)/) {
if ($str =~ s/^([^\x00]*?「)([^\x00]*?)(」)//) {
$a = $1;
$b = $2;
$c = $3;
$b =~ s/\n//g;
$s .= $a . $b . $c;
}
if ($str =~ s/^([^\x00]*?)(」)//) {
$a = $1;
$b = $2;
$a =~ s/\n//g;
$s .= $a . $b;
}
}
$str = $s . $str;
print $str;
892デフォルトの名無しさん:02/12/25 19:20
Perlの省略は
日本語のそれと同じ。
893デフォルトの名無しさん:02/12/25 22:04
>>882
>[^<マルチバイト文字>]ってやって地獄の底でのたうつ人って多いよね。

(?:(?!<マルチバイト文字>).)

かな?
先輩に基本だとか言われた記憶が……
>>893
をを〜良い事を教えてもらった!
ありがとうございます
まだ意味は良くわかっていませんけれど

(?!)
こういう表記も使えるのですね…感謝
>>883

$/ = undef;
$_ = <>;
close(IN);
s/\r\n/\n/g;
s/\\/\r/g;
s/(「[.|\r]*)\n([.|\r]*」)/$1$2/g; # 869氏提案
s/\r/\\/g;
s/\n/\r\n/g;
print "$_";

--------sample text-------------
てすと
「―

Ы」
「\噂浬欺
圭構蚕文!

「十申曾箪「貼」能表暴予禄兔

「喀媾彌拿杤歃濬畚秉綵臀
藹觸軆鐔饅鷭xx」
おわり
さほど大きくない複数のファイルがあり、
その中身を hash にぶち込んで置いて後で使いまわそうとか考えているのですが、
私が考えたモノがどうもピンと来ないのです。もしよりスマート(で美しい)な方
法があれば、ご教授頂けませんでしょうか。
# ここをこうすると激しく読みやすいyoとか
# ここをこうするとコード短縮だ!とか(^^;
# 出直して来ぃ!とか

%filedata=();
@filelist=qw(hoge.dat fuga.dat foo.txt);
foreach(@filelist){
  open FILEHANDLE,"$_";
  @{$filedata{$_}}=<FILEHANDLE>;
  close FILEHANDLE;
}

# 利用例
print foreach @{$filedata{$filelist[1]}};
print ${$filedata{$filelist[2]}}[3];
@array=split /,/,${$filedata{$filelist[0]}}[0];
897デフォルトの名無しさん:02/12/26 02:38
>>896
とりあえず "->"記法使えよ。
$filedata{$filelist[2]}->[3]
898896:02/12/26 02:49
>>897
> とりあえず "->"記法使えよ。
> $filedata{$filelist[2]}->[3]
それだーーーーーーー!!!!
(多分恐らくきっとそうだと思うんですが)それが使いたかったんです。
ありがとうございます。m(__)m
# 1文字軽減できますた。(自己満

うーむ、、心なしか美しくなったような気がします。o┤*´Д`*├o
他に何かありませんでしょうか。何か見落としている気がするのですが..

# 真利用例
print foreach @{$filedata{$filelist[1]}};
print $filedata{$filelist[2]}->[3];
@array=split /,/,$filedata{$filelist[0]}->[0];
899デフォルトの名無しさん:02/12/26 03:02
ActivePerl 5.8.0 build 804をインストールして、
GD.pm(http://www.vector.co.jp/soft/dl/win95/util/se134215.html)
を使おうとしたのですが、PerlCRT.dllが見つからないといわれます。

調べてみたのですが、(http://homepage1.nifty.com/yito/namazu/gbook/20020508.1835.html)
ActivePerlを再インストールしても、状況はかわりません。
どうすればよいのでしょうか。
>>895
s/\r\n/\n/g;
みんなこうやって書いてる?
s/0x0D0x0A/0x0A/g;
と書かない?
掻きません。
>>900
> s/\r\n/\n/g; 
> みんなこうやって書いてる?
> s/0x0D0x0A/0x0A/g; 
> と書かない?
最近は余り意味が無いように感じてきたので、
私は \r\n で書いてます。

改行が間違いなく CRLF という場合を除いては
s/(\r\r\n|\r\n)/\n/g;
と、書いてる事が多いかもです。

# s/\r\r\n/\n/g;
# s/\r\n/\n/g;
# とした方が処理が早いんだっけか。
# 眠くてなにも考えられん..
>>902
\nって

Windows系だと0x0D0x0Aで
UNIX系だと0x0Aで
Mac系だと0x0D

だと思ってるんですが、これは私の認識違いでしょうか?
904903:02/12/26 04:31
追記でう。

私は>>903と思ってるので、

\r\nだとWindowsで動かした時には0x0D0x0D0x0Aで
Linuxで動かした時には0x0D0x0Aになってしまう

と認識してます。
(昔これではまった記憶があるのですが。。。
最近は状況が異なるのでしょうか?)
範囲指定演算子の .. と ... の違いが分かんないっす
というか、... って5.6からなのかな?
.. の方は

while(<>){  print if /hoge/ .. /fuga/; }

こんな感じで使ってたんだけど、...は動作がどう違うんだろう
>>904
Unixなperl を使用して、Windows上で作成されたファイルを扱うときは
\r\n にしなきゃダメだと思われ
perlインタプリタの環境と、対象ファイルの環境が一緒なら
\n で、それぞれの環境に合った上手い処理をしてくれるはず。
>>906
Win上では入力の場合は改行コードはバイナリとして入力され
出力の場合はテキストとして出力されるので
その結果入力されたWinの改行コードは\r\nだが
(これが\nに変換されれば問題ないが、そうならない)
出力された場合は\nが\r\nになってしまい
何もしないと\r\r\nとなってしまう事を言ってるのだと思われ
by ActivePerl 5.22
>>906
>perlインタプリタの環境と、対象ファイルの環境が一緒なら
>\n で、それぞれの環境に合った上手い処理をしてくれるはず。
だからこそ、環境依存の\nを使うより環境非依存の0x0A(0x0D)を使った方が
いいんじゃないかと思っているのですが。
例えばUNIXな"0x0A"を Windows上で s/\n//g しても消えないですよね?

試しにこんなもの作ってみました。

open(IN, "LF.txt");
$_ = join('', <IN>);
close(IN);

s/\n//;

print;
間違えました・・・(鬱氏
-------------------------
open(IN, "LF.txt");
$_ = join('', <IN>);
close(IN);

s/\r\n//;

print;
-------------------------

です。LF.txtの中身は 文字"a"と改行です。
で、改行コード LF(UNIX)・CRLF(Windows)の2種類で試してみました。
910結果です:02/12/26 06:47
実行環境はWindowsです。

$ perl hoge.pl | dump # LF(UNIX形式)

Addr 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 2 4 6 8 A C E
-------- ---- ---- ---- ---- ---- ---- ---- ---- ----------------
00000000 61 a

$ perl hoge.pl | dump #CRLF(UNIX形式)

Addr 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 2 4 6 8 A C E
-------- ---- ---- ---- ---- ---- ---- ---- ---- ----------------
00000000 610a a.

このように s/\r\n// だと、Windows上で実行した時に s/0x0D0x0D0x0A//となってしまうので
よろしくないと思ったのです。
連続投稿ごめんなさい。
>>907
>その結果入力されたWinの改行コードは\r\nだが
>(これが\nに変換されれば問題ないが、そうならない)
>出力された場合は\nが\r\nになってしまい
>何もしないと\r\r\nとなってしまう事を言ってるのだと思われ
揚げ足取るつもりじゃないですが、何か変です。
UNIXでもWindowsでも改行コードは\nです。
でも、\nの実際のコードが"0x0A"なのか"0x0D0x0A"なのかの違いがあるのです。
>>908
文字コードなんてもの自体が環境依存なので
>環境非依存の0x0A(0x0D)
と思ってる点で、すでに間違いだから考え直した方が良いよ
>>911
違うって
試しにWin上でbinmode使って出力してみ
>>912
どういうことですか?0x0DはどのOSでも0x0Dじゃないですか?
>>913
binmode(STDOU)でも結果は同じです。
そうじゃなくて、s///でマッチさせる時に\nを使うと、
0x0Aになるのか0x0D0x0AになるのかはOS依存だからマッチに失敗する時があるといいたいんですが。
(Macほったらかしですけど)

916デフォルトの名無しさん:02/12/26 07:10
質問です。
現在Perlの-cオプションを使って構文チェックをしているのですが、このとき、絶対にコードを実行させないようにしたいのです。
暫定的に'BEGIN'や'END'を含むコードを弾くようにしてみたのですが、これでコードは確実に実行されなくなりますか?
それとも、もっと簡単な方法があるのでしょうか?
>>915
そう言う事を言いたかったのね…だったら
open(IN, "LF.txt");
の後で
binmode(IN);
で試してみ
テキストモードで入力すれば0x0d0x0aにマッチするけど
バイナリモードで入力すれば0x0aでマッチするから
ちなみに0x0AはどのOSでも0x0Aだが
それが改行コードとは限らないので
その結果正しく動くとは限らない
(極端な話0x0Aが数字の"1"等であっても構わない)
>>917
binmodeしようが何をしようが、\nの実際のコードがOSによって変わるのだから、
例えばbinmode入力が"0x0A"であった場合(UNIXのファイルを読む場合)、
s/\n// によって改行が消えるのはUNIX系だけです。Windows系ではそもそもマッチしません。
同様に s/\r\n//だとUNIX系でもWindows系でもマッチしません。

また、binmode入力が"0x0D0x0A"であった場合(Windows系のファイルを読む場合)、
Windows系ではs/\n// によって改行が消えますが、UNIX系では\r(0x0D)が残ってしまいます。
同様に s/\r\n//だとUNIX系では消えますが、もWindows系ではマッチしません。


>>918
そうなんですか。。。ASCIIに従うコード体系を使っていれば0x0Dが復帰で0x0Aが改行だと思っていたのですが。。。
#ところでこれ、話ずれてません?
>>918
これって本当?
>>919
ちゃんと試した?
これは多分UNIXとの互換性を考えて出来たシステムだと思うけど
少なくともActivePerl 5.22ではbinmodeで入力したファイルの
改行コードは\nでも\r\nでもマッチするように出来てるよ
確か、これは何かの本(思い出せないけど)にのってた話だったんだけど
もし試して駄目だったら、一時的なバージョンだったのかな…?
922921:02/12/26 07:49
>改行コードは\nでも\r\nでもマッチするように出来てるよ
もちろん\nの場合は0x0dが残ります
>>919
MACは0x0Dが改行で0x0Aが復帰
>>921
なるほど。そうだったのですか。
うちは
$ perl -version
This is perl, v5.6.1 built for cygwin-multi

なのでActivePerlは知りませんでした。

ところでActivePerl では

print scalar(split(//,"\n"));

の結果はどうなりますか?
925マカ ◆F52DmOxJlc :02/12/26 09:03
今の Mac は UNIX だから 0x0A が改行なんだが…。
すいません。自分で話を大きくしておいて恐縮ですがスレ違いですね。
誰かが↓に投げてました。(私じゃないですよ。マルチポスト断固反対!)

***すれ立てるまでもない質問はここで 第28刷***
http://pc3.2ch.net/test/read.cgi/tech/1040473175/274-

ですので、この話題は終わりということで。>>924も忘れていいです。
失礼しました。
927デフォルトの名無しさん:02/12/26 11:53
perlのdumpを使って、coreを吐かせるのはいいんだけど
undumpってのはどうやって入手するん?

ftpサイトから持ってきたundump.cをコンパイルしようとしたんだけど、
makeできなかったし。

ちなみにOSはSunOSの5.6らしい
928デフォルトの名無しさん:02/12/26 17:12
$aaa = \'aaa';
$str = \"aaa is $$aaa\n";
print "$$str\n";
$aaa = \'bbb';
print "$$str\n";
こういうコードを書いてみたのですが、二つのプリント文は同じ結果を返します。
おそらく$strに文字列のリファレンスを代入する時点で、一時オブジェクトを
生成してしまうようですが、これを避ける方法はありませんか?
やりたいこととしては、任意の時点において文字列の中身を自由に差し替えたい
のですが。。。やはり文字列集合として、配列として構成しなくてはならないですかね
929デフォルトの名無しさん:02/12/26 18:13
>>928
求めているものと同じかどうかは分からないが。

$aaa = 'aaa';
$str = 'aaa is $aaa';
eval "print \"$str\n\"";
$aaa = 'bbb';
eval "print \"$str\n\"";
930デフォルトの名無しさん:02/12/26 18:13
>928
やりたいことがよくわからないが、出力のデフォルト文字列をテンプレートとして
置換をかけてはいかんか?


$str = "aaa=_Change_String_";

print chg_prin($str, "aaa");
print chg_prin($str, "bbb");

sub chg_print
{
shift $a = $_;
shift $b = $_;
a =~ s/_Change_String/$b/;
return a
}


931デフォルトの名無しさん :02/12/26 18:13
>>928

$strcode = '\"aaa is $$aaa\n";'; # (*)

$aaa = \'AAA';
$str = eval $strcode;

print $strcode, "\n";
print $str;

(*)でquoteに"..."を使うと
$strcode = "\\\"aaa is \\\$\\\$aaa\\n\";";
みたいな感じになる。
あと、他の別解としてソフトリファレンスとか。
932デフォルトの名無しさん:02/12/26 18:16
すごいなあ。重婚かよ。
やっぱりevalをつかうしかないですかね。
なんとなくevalは遅いというイメージがあって
使いたくないので、リファレンスの配列という形にして
やることにします。どうもありがとうございました。
934デフォルトの名無しさん:02/12/26 18:46
G(3);
sub G{
my $a=shift;
if($a>0){
G($a-1);
print"$a\n";
G($a-1);
}print" \#$a\n";
}
この処理の流れが良く理解できません
アドバイスなどお願いします
ただ再帰的にG()を呼び出してるとかじゃなくて?
936934:02/12/26 19:13
吐き出される結果を見て
途中から流れ方が分からなくなります
forループなんかだとprintかましまくったら
結構すぐわかるんですが。。
おなじところで二度も再帰呼び出ししてるからどっちか消せば見通しよくなるんじゃない?
それと再帰呼び出しは引数に対する終了条件をよく考えておく。
この関数は単純だからただ一つの引数0が入ってきたら再帰呼び出ししないっていう
単純なもの。がんばってね。
938934:02/12/26 20:57
実はjavaを勉強中でして『ハノイの塔ゲーム』って
ところでこのソースを使うんですが演算はperlの方が
簡単に検証出来るかと思いまして
 #0
1
 #0
 #1
2
 #0
1
 #0
 #1
 #2
3
 #0
1
 #0
 #1
2
 #0
1
 #0
 #1
 #2
 #3
この吐き出される順序がどの様になってんのかと?
939デフォルトの名無しさん:02/12/26 21:20
                                稚内  国後
                             札幌旭川網走
                              十勝根室
                            函館 室蘭

                             青森
                            秋田岩手
                            山形宮城
                        佐渡  新潟福島
                         富山群馬栃木
          島根鳥取兵京都福井石川長山(゚∀゚)茨城
長佐福岡 山口広島岡山庫大奈滋賀岐阜野梨東京千葉
崎賀熊大分          阪良三重愛知静岡神奈川
   本宮崎  愛媛香川  和歌山
   鹿児島  高知徳島          大島
沖縄                    小笠原
だったら君、まずやるべきはハノイの塔の解き方の研究じゃないかな。
M-x hanoiとやってごらん。段数が多すぎて目が回るときはC-x 3 M-x hanoiだ。
941934:02/12/26 22:15
いやだからどこで値が保持され
どこで吐き出されるのかをしりたい
流れです 流れ〜。。

>>939
ワラタッ
(´-`).。oO(単に再帰が理解できてないだけかも…)
943 ◆F52DmOxJlc :02/12/27 00:03
>>934
G() を展開してフローチャート書けば?
G() を3回再起呼び出しすると $a = 0 になって if がスキップされる。
944934:02/12/27 01:27
チャート書いて出直してきます
 頭痛て〜
>>934
まぁあれだ。マルチポストは止めとけ。
>>928
素直に printf を使うべきでは…?

$aaa = \'aaa';
$str = \"aaa is %s\n"; # <-- %s に変化部が入る
printf $$str, $$aaa, "\n"; # <-- 変化部を与える
$aaa = \'bbb';
printf $$str, $$aaa, "\n"; # <-- 変化部を与える
>>934
表示にインデントを付けてみたけど、これなら解かりやすい?
再帰関数や二分木のデバッグ表示に良く使う手…。

my $ind = 0; # <--インデント(再帰呼出)の深さ
&G(3);
sub G{
my $a=shift;
$ind++;
if($a>0){ # (引数がゼロのときは再帰呼出をしない)
&G($a-1);
print "\t" x $ind, "$a\n"; # ( x は文字列リピート演算子 )
&G($a-1);
}
print "\t" x $ind, " #$a\n";
$ind--;
}
948946:02/12/27 12:30
あー少し間違いた。printf の第3引数"\n"はこの場合何の役にも立たんわ(^^;
949934:02/12/27 13:32
マルチポスト すんません
だいぶ理解できてきました
950デフォルトの名無しさん:02/12/27 18:10
$random = 0;
while($random == 20){
$random = int( rand(100) ) + 1;
print "$random<br>";
}
print "$random<br>";

このプログラムを実行するとどうもwhile文の中をスルーしているみたいなんですが
どこかプログラムがおかしいのでしょうか?

プログラム的には$randomが20になったらループから抜けるプログラムです。
冬休み
>950の頭がな。
while()の使い方勉強し直したほうがよさげ。
>>950
板違い
>>950
while判定式の真偽の意味をキチンと理解してないからだろうなぁ…。
そのコードでは、ループは一度も実行されないのが正しいぞ?w

希望するループの脱出条件は「20になったら」であるから──

$random = 0; # <-- ゼロ初期化されている=20では“ない”
while ( $random != 20 ) { # <-- 20では“ない”時はループせよ

または、

until ( $random == 20 ) { # until=while とは真偽判定が逆の命令
インターネット上のファイル(.html)が存在するかどうか
インターネット上のファイルのオープン

で困っています。if(-e $URL)やopen(FILE,$URL)でいいんですか?
956デフォルトの名無しさん:02/12/27 21:16
そろそろ正月だし、おめでたいなぁ
>>955
それではムソ。いくつか方法はあるんだが…、

1.CPANでその種のモジュールを探してきてインストールする(具体名忘れた、スマソ)
2.(UNIXでなら外部コマンドの) wget などを利用して読み込む

open FILE, "wget $URL|" or die;
binmode FILE;
$data = join '', <FILE>; close FILE; # (エラー処理やタイムアウトは知らん)

3.自力で低レベルコーディングするw

この辺がサンプルになるとオモワレ。
ソース?: ttp://multix.jp/download/perl/httpget.cgi
実行例?: ttp://multix.jp/cgi-bin/httpget.cgi
959 ◆hMJAPH9PWA :02/12/28 09:27
>>899
perl5.8.0は以前のバージョンとバイナリ互換がないので、
XSを使ったモジュールは5.8.0用にビルドされたものじゃないと動かないよ。
それが5.8.0に対応するのを待つか、他のを探すか、自分でビルドするしかないね。
960950:02/12/28 13:00
>>954
恥ずかしい。すごく簡単なことだったんですね。
あんな簡単な事も丁寧に教えてくださってありがとうございます。
とても参考になりました。
>>958
ありがとう。HTMLなんだけど、やっぱりバイナリとして開いたほうがいいのかなぁ。
use LWP::Simple;

my $url = 'http://pc3.2ch.net/test/read.cgi/tech/1033688230/l50';
my $text = get $url;
$text =~ s/<br>/\n/ig;
$text =~ s/<dd>/\n/ig;
$text=~ s/<.*?>//sg;
$text=~ s/</</g;
$text=~ s/>/>/g;
print $text;
exit;
963デフォルトの名無しさん:02/12/28 18:35
955さんではないのですが、似たようなプログラムで悩んでいます。
htmlを取ってきた後、そこに含まれるURLを取り出してリスト(txtとか)に
するにはどうしたらいいでしょう。
更にはそのリストを使ってたくさんのサイトを巡ってプレーンテキストを
収集するプログラムが作りたいのですが・・。
根本的にチグハグな>>961がいるスレはここですか?
965デフォルトの名無しさん:02/12/28 19:08
>>822 みたいに fork を使いたいのですが、 >>822 のままだと
1秒毎にゾンビプロセスが残ります。
fork の最後に exit してるのに何故でしょう?
>>964
うん…。萎えるよねぇ。

>>963
とりあえずHTMLを取ってくる方法は>>958>>962
参考にしていただくとして、例をあげると、

$/ = undef; # (次の行のための細工)
$_ = <>; # 仮に標準入力からHTMLテキストを頂くとして
s/\s+/ /g; # 邪魔な改行や連続空白を整理
s{(src|href)\s*=\s*"?([^"]+)"?}{ # それっぽい所を抜き出す
push @urllist, $2; "";
}eg;
print "$_\n" foreach (@urllist); # 標準出力へ書き出す

注:相対URLの絶対アドレス化までは面倒見てないし、
空白を含むような変態アドレス(爆)にも対応してないし、
リンクタグになってないURLも無視している。

あとはこの処理結果を更に再帰的にやってみる?(無限ループしそうだが)

>>965
waitpid 関数のドキュメントも参照してみたらどうだろう?
967963:02/12/28 20:04
>>966
標準入力から渡したのはちゃんと抽出できました。
この$_ = <>;をソケット先の読み込んだのにしてあげれば良いのですね。
試行錯誤してみます。
組み始めて1ヶ月くらいなので解からないことばかりで^^;
ありがとうございます><
use LWP::Simple;
use HTML::LinkExtor;

my $url = 'http://www.google.com/intl/ja/';
my $p = new HTML::LinkExtor(\&want, $url );
$p->parse(get $url or die "filed:get $url");
exit;

sub want
{
my($tag, %links) = @_;
$tag = lc $tag;
return unless $tag eq 'img';
print $links{ src }, "\n";

}
<Table></table>の中に<table></table>といくつか入っているのですが、
そと側の<table.にマッチさせるにはどうしたらいいdねすか?

「<table>の開始タグと終了タグを一致させたい」みたいな
970963:02/12/28 22:01
>>968
すごい。。相対的なURLもこれだけでOKなんですね。
末尾に/がないものや.cgi等も持ってきちゃう場合は
削除や書き込まないようにすればいいのでしょうか。
>>970
ちょこっとでいいからソケットプログラミングやってみると良いと思われ。
便利なライブラリを使うとすぐできちゃうけど、
それだと基本が身につかないから応用ができないよ。
972デフォルトの名無しさん:02/12/28 23:24
>>971
始めてから1箇月でこの程度の才能無しにアドバイスしても
無駄だと。
そんな程度でageるやつもどうかと。
974デフォルトの名無しさん:02/12/29 20:27
Net::SCP 使ってファイル転送したいのですが、認証がうまくいかないようです。
RSA1? RSA2? どれを使えばいいのでしょうか?
検索してみても有効な結果が見つかりませんが、perldoc以外のサンプルコードありませんか?
975デフォルトの名無しさん:02/12/29 22:15
<a href="ここ">ここ</a>(ここ)
上の「ここ」の部分を取得したいのですが、色々な例外を考えて
いくとどうも上手くマッチさせることができません。
考えなくてはならないことは
・タグの中には余計な要素があるかもしれない
・最後の要素と閉じタグの間には文字があるかもしれない
・最後の要素はないかもしれない

これを考えていき(\nはないものとして)
/<.*?a.+?href=\"(.+?)\".*?>(.+?)<\/.*?a.*?>.*?(\(.+?\))?/ig
としてみたのですが、最後の要素と閉じタグの間に文字があると
例えあっても、最後の要素がないことになってしまいます。

この場合にはどのようにするのが適当でしょうか?
何でも . を使うな。
977 ◆F52DmOxJlc :02/12/29 22:28
>>975
/<.*?a.+?href=\"(.+?)\".*?>(.+?)<\/.*?a.*?>[^(]*(\(.+?\))?/ig
これでどうだ?
.*? を [^(]* に変更。
( 以外の何かの0回以上の繰り返し。
978977:02/12/29 23:08
>>976 >>977
ご指摘ありがとうございます。 . で表しすぎているということに
気付きました。
> /<.*?a.+?href=\"(.+?)\".*?>(.+?)<\/.*?a.*?>[^(]*(\(.+?\))?/ig
これを試してみたのですが下の
<a href="xxx">xxx</a><a href="xxx">xxx</a>(xxx)
全体にマッチしてしまいます。上の文字列に対しては
2回マッチするようにしたいのですが、
少し考えてイメージとしてはこんな感じなのですが
/<[^>]*?a[^>]+?href=\"([^\"]+?)\"[^>]*>(.+?)<\/[^>]*?a[^>]*?>[^(?:<a)]*?(\([^)]+?\))?/i
[^(?:<a)]←この <a という文字列以外にマッチという部分が
実際は上手く表せません。
何か良い手はないものでしょうか。
979975:02/12/29 23:09
>>978 の名前を間違えて977にしてしまいました
.*?ってさ、.*とどう違うの?何か違うのか?素人考えでスマンが。

<[^>]?a だと <!DOCTYPE html PUBLIC (略) Tradi...のaなんかにもマッチしてしまわないか?
<a で良いと思うんだけど。

あと、hrefの値に"があると分かっているの?
場合によっては "が'になっているかもしれないし。
981975:02/12/30 00:00
/<[^>]*?a[^>]+?href=\"([^\">]+?)\"[^>]*?>(.+?)<\/[^>]*?a[^>]*?>(?:(?:<(?!a))|[^<])*?(\([^)]+?\))?/i
試行錯誤してこのような形になりました。これでも
</a>と(xxxxx)の間に文字があると失敗してしまい上手く取得することができません。

>>980
>.*?ってさ、.*とどう違うの?何か違うのか?素人考えでスマンが
<[^>]*a[^>]
のように書き始めてしまうと<a href="a.html">でa.htmlのaまで
マッチしてしまい、上手くいかないと思い<[^>]*?aで書き始めました。

><[^>]?a だと <!DOCTYPE html PUBLIC (略) Tradi...のaなんかにもマッチしてしまわないか?
これは hrefの段階でマッチが失敗するので大丈夫だと思います。

>場合によっては "が'になっているかもしれないし。
確かにその通りでした。("|')?のようにして上手くしのぎたいと思います。
982975:02/12/30 00:02
激しく嘘を書いていました。

>のように書き始めてしまうと<a href="a.html">でa.htmlのaまで
>マッチしてしまい、上手くいかないと思い<[^>]*?aで書き始めました。

これはまたhrefでマッチが失敗するので大丈夫ですね・・・
<a target="top" href="xxxxx">の場合にtargetのaにマッチしてしまうため
<[^>]*?a
として書き始めました。
983デフォルトの名無しさん:02/12/30 00:08
……むりに一発ですべて取得しなくても……
HTML/SGML/XML系タグパースは無茶苦茶難しい。
どこかで妥協しないと泥沼確定。正規表現は万能に近いが得手不得手はある。
#特に iso-jis や Shift_JISコードが混じってると余計に死ねるw

>>980
/.*?/ の?は最短マッチフラグ。普通“.*”は最長一致(貪欲マッチ)だが、
最初に検索条件を満足したところでストップ(break)をかけるために使う。

$_ = "1,2,3,";
print $&, "\n" if /.*,/; # 1,2,3, <- 最後まで全部当たってしまう
print $&, "\n" if /.*?,/; # 1, <- 最初に当たったところで止まる

このフラグはどんな量指定子にも使える。
?? +? *? {n}? {n,}? {n,m}? といった具合。(続に言うPerl拡張)

/<[^>]?a/ だけど、昔はともかく現在は
タグ開始を示す“<”の直後に空白や改行を入れるのは
イリーガルなはずなので、/<a/ で充分だろうなぁ。
逆にタグ内や“=”の前後、“>”直前の空白&改行挿入とかは許されるので
そういうのまで考えてくと本当にキリがない。
素直に既存のモジュールから使えそうなのを探したほうが楽よ。
#それでも「(>_<)」といった顔文字があると動作が狂いやすいが…。
985975:02/12/30 01:25
>>984
確かにこのままでは無理そうなので、妥協して
aタグ以外を取り払ってからマッチさせることにしました。

s/<\/[^a][^>]*>//ig;
s/<[^a\/][^>]*>//ig;
/<a\s*href=\"(.+?)\"[^>]*>(.+?)<\/a>\s*(\(.+?\))?/i;

特定のサイトのを取ることができればよかったので、
とりあえずは上手く動かすことができました。
986デフォルトの名無しさん:02/12/30 02:23
質問です。

「1〜36の数字があって、その中からランダム数字を選んでに10対のペアを作る。
 ただし、選ばれる数字(この場合には全20個)には同じ数字が含まれてはならない。
 (つまり一度選ばれた数字は2度と選ばれないということ。)」

さて、どうやったらいいですかねえ?
配列を使うということくらいしか思いつかない。
ちゃんと確かめてないし眠いしチャット中の相手の返事町の間に考えたものですが。
for ($i = 1; $i <= 10; $i++) {
$x = int(rand(36));
if (!$a{$x}) { $a{$x} = 'hoge'; }
}
@a = %a;
for ($i = 1; $i <= 10; $i++) {
$x = int(rand(36));
if (!$a{$x}) { $a{$x} = 'hoge'; print "$a[($i -1)*2]\t$x\n";}
}
988987:02/12/30 03:02
絶対動かないなこれ。スマソ
10満開ぐらい動かせば奇跡的にうまくいくかもしらんけど。
ttp://www.din.or.jp/~ohzaki/perl.htm#Mail
メールアドレスもまじめにやるとこんな感じになっちまうらしいしな。
990 ◆F52DmOxJlc :02/12/30 07:22
>>987
出勤前で時間がないので考え方だけ。
・配列に 1 - 36 を格納。
・int(rand(36)) で一つを決定。
・決定した数字を配列から消す。これで配列の要素が一つ減る。
・以下 int(rand(35)), int(rand(34)), int(rand(33)) ...

次スレ、
Perlについての質問箱 3箱目
http://pc3.2ch.net/test/read.cgi/tech/1041205885/l50
>>987
>>990を参考に作ってみた

srand;
@card = (1 .. 36);
$pair = 10;
@result = ();
for($i=0;$i<$pair; $i++){
 ($p1) = splice(@card,int(rand(@card)),1);
 ($p2) = splice(@card,int(rand(@card)),1);
 push(@result, [$p1,$p2]);
}

foreach $in (@result){
 print $in->[0], ":", $in->[1], "\n";
}

一時変数使わないようにしたり、リファレンス止めたり色々出来るけど
分かりやすい基本形って事で
>>984
最短マッチね。さんくす。

そーいや、Perlって「独自拡張」があるんだね。

#旧スレですまん
994986:02/12/31 02:37
>>987,990,992 (同一人物含む?)
さんくす。

> ・決定した数字を配列から消す。これで配列の要素が一つ減る。

の実現の仕方がよく分からなかったんだよなあ。
>>992のコードよく読んで勉強しまつ。
995992:02/12/31 05:10
>>994
$index = int(rand(@card));
($p1) = splice(@card,$index,1);
分けると分かりやすいかも
996
九百九十七
998 ◆F52DmOxJlc :02/12/31 20:06
ん?カウントアップか?
998
1000get.
1000?
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。