>>935 >3.
は実際に Want.pm を試して確認したんだろうな?
>>936 確認した。疑う気持ちはわかるんだが(漏れも信じられんので)、@{foo()} と %{foo()} が区別できるのよ。
基本的に
>>915 が言った通りだなんだが、完全なサンプルを示すと
use Want;
sub foo() {
if (want('ARRAY')) {
return [1, 2, 3];
} elsif (want('HASH')) {
return { foo => 17, bar => 23};
}
}
my %hash = %{foo()};
print "$hash{bar}\n"; # 23 と表示される。
my @array = @{foo()};
print $array[2]; # 3 と表示される。
Want.pm をインスコすると、Want.dll というモジュールが付いて来るんだがこの中で怪しいことをしてるらしい。
Want.dll は、多分コンパイル済み中間コード?かな?(まさかネイティブコードでないよね・・・)
938 :
デフォルトの名無しさん:05/01/15 21:57:56
>>937 >Want.dll は、多分コンパイル済み中間コード?かな?(まさかネイティブコードでないよね・・・)
そのまさかでそ。Want.cなんてものついてるし
941 :
デフォルトの名無しさん:05/01/15 23:56:42
ひとり言…。
やれやれ、呼ばれているサブルーチンから、
呼び出し先の型を見分けるのか。
perl の中には内部的な型がいろいろあるわけだけどさ、
それは基本的に、ref関数で返されるよね。
SCALAR
ARRAY
HASH
CODE
GLOB
REF
LVALUE
IO::Handle
ところが、perlにおけるすべての値は、SV(スカラー値のこと)から
派生したクラスのメンバーとして扱われる。
すべての値は、実はC言語の SV*ポインタ ということらしい。
うーむ、ややこしい。
ただ、ref で見分ければ十分じゃないのかなぁ。
>>940 ほーこれが噂の perl エクステンションですか・・・
ここらへんの話は私は不勉強なので、私個人はぼちぼちやるつもり。
他の質問とかレスとかある方は「話の腰を折るんじゃ・・・」とか気にせずドゾー。
今のところ、次のことがわかっちる。
1. v5.6.1 built for MSWin32-x86-multi-thread (Win32 環境の ActivePerl)では、ppm install Want.pm でインスコがオールOK。
で、次のことを実施した。
1.
ttp://search.cpan.org/CPAN/authors/id/R/RO/ROBIN/Want-0.08.tar.gz をダウソして解凍。
2. v5.8.5 built for cygwin-thread-multi-64int (Cygwin) で perl Makefile.pl 実行。
3. Makefile ができたので、make。
4. Want.c ができた。
Want.c 解読完了予定はマターク未定。今日はもう寝る。
>>941 > ref で見分ければ十分じゃないのかなぁ。
それだと
>>912 が言った方法(つまり
>>935 の 2.)になるので、
>>910 の要求仕様を満たさないっぽい。
>910 は >913 においてカナーリご不満だったご様子だ。
943 :
941:05/01/16 00:46:54
>>941 の補足。
おっと、まだまだ実は内部的な型があるんだね。
IV (内部的整数型)と NV (内部的な浮動小数点数型)とか。
SV (内部のスカラー型)がすべての型の親クラスらしいが、
AV(内部の配列型) CV(内部のサブルーチン型)
GV(内部のグロブ型) HV (内部のハッシュ型)
IV (上で書いた通り)NV (上で書いた通り)
PV (内部的ポインタ値)RV (リファレンス型)
これらはみんな、C言語でtypedefされた型らしい。
ふーん。型がないように見えるperlも
本当はこれだけ型があるわけか…
944 :
941:05/01/16 00:59:36
あらあら、プログラミングperl第3版p626〜627
にはもっと詳しく書いてあった。
そこには、I32 とか I16 とか、
UV U32 U16 とかもある。
いずれの型も p@erlgutsドキュメントに記載されている
Cの関数によって操作することができると書いてあるよ。
そして、
perl を拡張するには、C関数との結合部を作るために、
これらの型について知らねばならないとあるな。
Cとの結合のためには、XS と XSUB かい。
ああ、その前にC言語…。ふー。
うざ
946 :
デフォルトの名無しさん:05/01/16 01:25:34
>>945 面白いのがお望みなら、
rubyスレにいけよ。
もう、大笑いできるぞ。
俺は、JavaでUMLとかは飽き飽きしたので、
オブジェクト指向はしばらくはいいけど。
しかし、Cはちょっとおもしろそうだな。
>>946 確かに ruby スレは大笑いできる傾向にある。
やはり、ruby には perl ほどのトラップがないから、ヒマをもてあますあまり
ネタに走ったり布教活動始めたりするからだろうね。
948 :
デフォルトの名無しさん:05/01/16 02:40:13
「今日知ったPerlの知識」
というスレでも作って、初心者が、みんな知ってることを
自慢気に開陳しても嘲笑されたりうるさがられたり
しないようにするという解決法を提案します。
92 :デフォルトの名無しさん :05/01/16 03:58:57
Effective Perlを買ってきたが、なんじゃこの訳?
ともかく文のリズムが悪くて読みづらいのはがまんするとして、どうにも
意味が取りづらい文が大杉(原書は読んでないが、たぶんオリジナルは
普通にわかりやすい文だと思う)。おそらく自分でも意味が分からずに
訳しているのだろう。どっかの大学の英文科に安い翻訳料でやらせたのモロばれw
まぁコンピュータ関連の翻訳の程度なんて元からひどいのがおおいが、
オライリの近藤嘉雪氏の訳がこなれているだけに、つい比較してしまう。
まず「序言」読んだ瞬間に、翻訳者の程度の低さがわかってしまう。
ここに出てくる「英語(English)」は、こういう文脈の場合「国語と訳せ」
というのは翻訳のごく初歩。完全に素人。ひさしぶりに糞翻訳読んで腹がたった
翻訳なんかに期待するから……と、大学院時代に翻訳バイトで
飯食ってた私は思ふ……
だってね〜
翻訳会社に行って6人くらいで黙々とUNIXの本の翻訳を校正してるわけよ(大声)!!
それで、他の人がUNIX用語の日本語訳の慣習を無視した訳語に修正しているから、
なんだと思ったら、私以外、「UNIXって何?」っていう連中だったのよ(絶叫)!!
952 :
932:05/01/16 09:49:32
>>933 マルチバイト文字は調べて大体分かってきたんですけど、
後半のところがよく分かりません。
>Perlは文字列リテラル中に\xHHがあると、それを1バイトの文字に展開する。
のところで、"\x50"→"P"となるのは分かるのですが、
何故"P"→"\x50"となるのでしょうか?
あとあまり関係ないかもしれませんが、
print "\x83P";
では「ケ」になりますが
print "\x83PPP";
では「ケPP」になりました。
>>952 Pと書いたファイルを、バイナリで見てみると 50 になっている。
一方向の問題ではなく、等しいのですよ。 P = \x50
そもそも、キャラクタなんていうものは人が理解するために割り当てている物。
普段使うテキストファイルだって、実際には内部では0と1の集まり。
Pと書いたファイルは、プログラムでは\x50と認識しているだけ。
後半の所は、P = \x50を理解した後に試すと解るが、
83 50 50 50 というバイナリのファイルをエディタで見る、若しくはケPPPというファイルをバイナリで見れ。
954 :
941:05/01/16 11:36:22
>>948 では、ベテランのお前が、これを説明せいや。
楽勝でわかるんだろ。え?!(まあ、俺でもなんとなく分かるけどな)
PERLGUTSより SV の操作
SV は、1 つのコマンドで生成し、値をロードすることができます。
ロードできる値の型には、整数 (IV)、倍精度 (NV)、文字列 (PV)、
その他のスカラ (SV) があります。
これらを行なう、4 つのルーティンは:
SV* newSViv(IV);
SV* newSVnv(double);
SV* newSVpv(char*, int);
SV* newSVsv(SV*);
です。 「既に存在する」スカラの値を変更するために 5 つのル
ーティンがあります:
void sv_setiv(SV*, IV);
void sv_setnv(SV*, double);
void sv_setpvn(SV*, char*, int)
void sv_setpv(SV*, char*);
void sv_setsv(SV*, SV*);
955 :
941:05/01/16 11:42:31
>>954 は、これが分からんと、
want.pmの謎を説く基礎になるんじゃないか、
ということだからな。
初心者なんで、優しく頼むぞ。ボケ
956 :
941:05/01/16 11:52:58
待ってんだけどな。
早くしろ。ボケ
>>952 まずテキストデータをバイナリデータとして見ることもできる。
\x83 \x50 というデータをそのまま扱ってもいいし、
SJISで頭から「ケ」と読んでもいいし、
前半だけ\x83のままで置いといて\x50が「たまたま」「P」に対応してるから置換えてもいい。
例えば2chでメル欄に「sage」と入れると上がらないだろ。
メル欄に「sage」(=\x73 \x61 \x67 \x65)があるかどうかを探してるわけだ。
そして「都age」をバイナリデータで表すと「\x93\x73 \x61 \x67 \x65」。
\x73\x61\x67\x65が入ってるので上がらない。
まだでるの?
ガッツだぜ〜
チラシの裏 という言葉を初めて使いたくなった
961 :
デフォルトの名無しさん:05/01/16 15:14:08
便所の落書き
質問です。
Perlを使っている人はあまりGUIを作りたいとは思わない(そういう用途には使わない)のでしょうか?
wxPythonというものの存在を知ってちょっと検索してみたのですが、
wxPerlというものもあるけど、あまり盛り上がってないというか、日本語でその話をしている所がほとんどなさそうです。
どうしてでしょうか。
Perl/Tkが有名だから。
なるへそ。同等以上の事ができるんですね?
厨な質問にお答えいただきありがとうございました。
>同等以上の事ができるんですね?
それは、知らん。
オライリーから本でてるし、情報得やすいことは確かだろうが。
966 :
デフォルトの名無しさん:05/01/16 18:01:19
>>966 Javaとの比較しか分からんけど、
イベントとかの扱いは、問題にならないほど簡単みたいだったよ。
(だった、というのは、ちょっと試しただけだからだけど。
JavaはRADの支援がないと、とてもやってられないと思う)
ただ、日本語もいちおう扱えるみたいだけど、
まだまだ問題があるみたい。
967 :
デフォルトの名無しさん:05/01/16 19:47:57
968 :
デフォルトの名無しさん:05/01/16 19:59:35
HTTPDの機能を持つライブラリとかありますか?
POPfileとか、あれどのように実現してるんでしょうか?自前で組んでるんですか?
>>967 use LWP::UserAgent;
my $ua = LWP::UserAgent->new(
agent => "Mozilla/8.0",
);
my %formdata = (
STYLE => 'search',
S_WORD1 => '画像処理',
R_TYPE1 => '02',
BE_SEARCH => '検索実行',
sTime => time * 1000
);
my $res = $ua->post( $url, \%formdata );
print $res->is_success ? $res->content : 'Error.' ;
http://search.cpan.org/~gaas/libwww-perl-5.803/lib/LWP/UserAgent.pm の例文に習ってこんな感じでいーんじゃないの?
971 :
デフォルトの名無しさん:05/01/16 20:14:11
>>969 うーん...だめみたい。
他に誰か特許庁のHPから特許検索を自動化したことある人いないかな…?
972 :
デフォルトの名無しさん:05/01/16 20:16:21
>>969 use LWP::UserAgent;
my $ua = LWP::UserAgent->new(agent => "Mozilla/8.0");
my %formdata = (
STYLE => 'search',
S_WORD1 => '画像処理',
R_TYPE1 => '02',
BE_SEARCH => '検索実行',
sTime => time * 1000
);
my $url = '
http://www2.ipdl.ncipi.go.jp/begin/be_search.cgi';
my $res = $ua->post( $url, \%formdata );
print $res->is_success ? $res->content : 'Error.' ;
perlから、以上のコードを実行してみたんですが、普通にwebから
検索したときのように結果が返ってこないんです。うーん……
>>971 まずまともに検索できるブラウザでどういうやりとりを
してるか調べて、それをなるべく忠実に再現するのが
一番じゃないかな。
ありがちなのは
(1) refererをチェックしている
(2) agentをチェックしている
(3) クッキー食わないとだめ
あたりか。
974 :
971:05/01/16 20:30:47
>>973 refererの設定の仕方を調べてみます。
それでもダメなら
etherealを使って調べてみようと考えました。
もしだれか、「perlから検索通ったぞ!」って方、いたらば
こうやりなっせ、とレスください。
yahooとかgoogleとかだったらフォームをpostできるのに...
特許庁のバカーン 俺の技術の無さバカバカーン 。・゚・(ノД`)・゚・。
975 :
デフォルトの名無しさん:05/01/16 20:55:37
977 :
952:05/01/16 21:16:47
バイナリエディタで見てみると確かに 80 50 50 50 になっていました。
P = \x50 というのは理解できたつもりなのですが、
何故「\x83P」とすると「\x83」と合体して1つの文字になるのかが分かりませんでした。
それで父に聞いてみたんですが…(すみません(汗))
(Shift JISの)「83」というのが2バイト用のコードなので
その次の1バイトも足されて1文字になる、みたいなことを言ってました。
2バイト用のコードというものの具体的な範囲はちょっと分かりませんが、
その範囲内の値であれば同じような動作をするということみたいですね。
…父はPerlは知らないので、もしも何か間違っていればまたご指摘下さい。
この度は色々とありがとうございました。
>>971 次のリクエストで通ったよ。というわけで、UA や Referer チェックは今のところしてないらしい。(Set-Cookie 時は知らん。)
クッキーはずすとだめ。
POST /begin/be_search.cgi HTTP/1.1
Host: www2.ipdl.ncipi.go.jp
Content-Length: 74
Cookie: Name=BE11105876026 StartTime=...(省略)... LADDR=xxx.xxx.xx.xxx;
STYLE=search&S_WORD1=%89%B7%93x%92%B2%90%DF&R_TYPE1=02&sTime=1105877528381
(上のは最低限の例ということで。Connection: close ぐらいは入れたほうが良いかも。)
こんな時にはやっぱりWWW::Mechanize
>>977 > 何故「\x83P」とすると「\x83」と合体して1つの文字になるのかが分かりませんでした。
何故って、表示端末が「\x83\x50を受け取ったら」「"ケ"を表示する」って設定されてるから。考えすぎ。
981 :
デフォルトの名無しさん:05/01/16 23:04:57
>>976 ありがとうございます!!libwwwってクライアントだけと思ってました。。。
文字コード板に行ったほうがいいよな
>>977 >2バイト用のコードというものの具体的な範囲はちょっと分かりませんが、
>>933 >1バイト目が81〜9F、E0〜FCなら次のもう一バイトとあわせてひとつの文字になる。
もうそろそろ誰か次スレ立てれ