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

このエントリーをはてなブックマークに追加
936デフォルトの名無しさん:05/01/15 21:21:20
>>935
>3.
は実際に Want.pm を試して確認したんだろうな?
937935:05/01/15 21:39:42
>>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
>>936 >>937
これだよね?
誰か、解析、よろしく。
http://search.cpan.org/src/ROBIN/Want-0.08/Want.pm
939デフォルトの名無しさん:05/01/15 22:42:09
>>937
>Want.dll は、多分コンパイル済み中間コード?かな?(まさかネイティブコードでないよね・・・)
そのまさかでそ。Want.cなんてものついてるし
940デフォルトの名無しさん:05/01/15 23:27:27
941デフォルトの名無しさん:05/01/15 23:56:42
ひとり言…。
やれやれ、呼ばれているサブルーチンから、
呼び出し先の型を見分けるのか。
perl の中には内部的な型がいろいろあるわけだけどさ、
それは基本的に、ref関数で返されるよね。

SCALAR
ARRAY
HASH
CODE
GLOB
REF
LVALUE
IO::Handle

ところが、perlにおけるすべての値は、SV(スカラー値のこと)から
派生したクラスのメンバーとして扱われる。
すべての値は、実はC言語の SV*ポインタ ということらしい。
うーむ、ややこしい。
ただ、ref で見分ければ十分じゃないのかなぁ。
942935:05/01/16 00:19:14
>>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 においてカナーリご不満だったご様子だ。
943941:05/01/16 00:46:54
>>941 の補足。
おっと、まだまだ実は内部的な型があるんだね。
IV (内部的整数型)と NV (内部的な浮動小数点数型)とか。
SV (内部のスカラー型)がすべての型の親クラスらしいが、
AV(内部の配列型) CV(内部のサブルーチン型)
GV(内部のグロブ型) HV (内部のハッシュ型)
IV (上で書いた通り)NV (上で書いた通り)
PV (内部的ポインタ値)RV (リファレンス型)
これらはみんな、C言語でtypedefされた型らしい。
ふーん。型がないように見えるperlも
本当はこれだけ型があるわけか…
944941:05/01/16 00:59:36
あらあら、プログラミングperl第3版p626〜627
にはもっと詳しく書いてあった。
そこには、I32 とか I16 とか、
UV U32 U16 とかもある。
いずれの型も p@erlgutsドキュメントに記載されている
Cの関数によって操作することができると書いてあるよ。
そして、
perl を拡張するには、C関数との結合部を作るために、
これらの型について知らねばならないとあるな。
Cとの結合のためには、XS と XSUB かい。
ああ、その前にC言語…。ふー。
945デフォルトの名無しさん:05/01/16 01:05:11
うざ
946デフォルトの名無しさん:05/01/16 01:25:34
>>945
面白いのがお望みなら、
rubyスレにいけよ。
もう、大笑いできるぞ。
俺は、JavaでUMLとかは飽き飽きしたので、
オブジェクト指向はしばらくはいいけど。
しかし、Cはちょっとおもしろそうだな。
947デフォルトの名無しさん:05/01/16 01:37:47
>>946
確かに ruby スレは大笑いできる傾向にある。
やはり、ruby には perl ほどのトラップがないから、ヒマをもてあますあまり
ネタに走ったり布教活動始めたりするからだろうね。
948デフォルトの名無しさん:05/01/16 02:40:13
「今日知ったPerlの知識」
というスレでも作って、初心者が、みんな知ってることを
自慢気に開陳しても嘲笑されたりうるさがられたり
しないようにするという解決法を提案します。
949デフォルトの名無しさん:05/01/16 03:26:25
>>948 読んだ >>941 はきっと >>942 のことだと思い、
>>942 はきっと >>941 のことだと思って改善せんねこりゃあ ┐(´д`)┌
950デフォルトの名無しさん:05/01/16 04:01:11
92 :デフォルトの名無しさん :05/01/16 03:58:57
Effective Perlを買ってきたが、なんじゃこの訳?

ともかく文のリズムが悪くて読みづらいのはがまんするとして、どうにも
意味が取りづらい文が大杉(原書は読んでないが、たぶんオリジナルは
普通にわかりやすい文だと思う)。おそらく自分でも意味が分からずに
訳しているのだろう。どっかの大学の英文科に安い翻訳料でやらせたのモロばれw

まぁコンピュータ関連の翻訳の程度なんて元からひどいのがおおいが、
オライリの近藤嘉雪氏の訳がこなれているだけに、つい比較してしまう。

まず「序言」読んだ瞬間に、翻訳者の程度の低さがわかってしまう。
ここに出てくる「英語(English)」は、こういう文脈の場合「国語と訳せ」
というのは翻訳のごく初歩。完全に素人。ひさしぶりに糞翻訳読んで腹がたった
951デフォルトの名無しさん:05/01/16 04:50:25
翻訳なんかに期待するから……と、大学院時代に翻訳バイトで
飯食ってた私は思ふ……

だってね〜
翻訳会社に行って6人くらいで黙々とUNIXの本の翻訳を校正してるわけよ(大声)!!
それで、他の人がUNIX用語の日本語訳の慣習を無視した訳語に修正しているから、
なんだと思ったら、私以外、「UNIXって何?」っていう連中だったのよ(絶叫)!!

952932:05/01/16 09:49:32
>>933
マルチバイト文字は調べて大体分かってきたんですけど、
後半のところがよく分かりません。

>Perlは文字列リテラル中に\xHHがあると、それを1バイトの文字に展開する。

のところで、"\x50"→"P"となるのは分かるのですが、
何故"P"→"\x50"となるのでしょうか?

あとあまり関係ないかもしれませんが、
print "\x83P";
では「ケ」になりますが
print "\x83PPP";
では「ケPP」になりました。
953デフォルトの名無しさん:05/01/16 10:06:32
>>952
Pと書いたファイルを、バイナリで見てみると 50 になっている。
一方向の問題ではなく、等しいのですよ。 P = \x50
そもそも、キャラクタなんていうものは人が理解するために割り当てている物。
普段使うテキストファイルだって、実際には内部では0と1の集まり。
Pと書いたファイルは、プログラムでは\x50と認識しているだけ。

後半の所は、P = \x50を理解した後に試すと解るが、
83 50 50 50 というバイナリのファイルをエディタで見る、若しくはケPPPというファイルをバイナリで見れ。
954941: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*);
955941:05/01/16 11:42:31
>>954 は、これが分からんと、
want.pmの謎を説く基礎になるんじゃないか、
ということだからな。
初心者なんで、優しく頼むぞ。ボケ
956941:05/01/16 11:52:58
待ってんだけどな。

早くしろ。ボケ
957デフォルトの名無しさん:05/01/16 12:28:15
>>952
まずテキストデータをバイナリデータとして見ることもできる。
\x83 \x50 というデータをそのまま扱ってもいいし、
SJISで頭から「ケ」と読んでもいいし、
前半だけ\x83のままで置いといて\x50が「たまたま」「P」に対応してるから置換えてもいい。

例えば2chでメル欄に「sage」と入れると上がらないだろ。
メル欄に「sage」(=\x73 \x61 \x67 \x65)があるかどうかを探してるわけだ。
そして「都age」をバイナリデータで表すと「\x93\x73 \x61 \x67 \x65」。
\x73\x61\x67\x65が入ってるので上がらない。
958デフォルトの名無しさん:05/01/16 12:42:26
まだでるの?
959デフォルトの名無しさん:05/01/16 12:42:49
ガッツだぜ〜
960デフォルトの名無しさん:05/01/16 15:08:43
チラシの裏 という言葉を初めて使いたくなった
961デフォルトの名無しさん:05/01/16 15:14:08
便所の落書き
962デフォルトの名無しさん:05/01/16 17:19:55
質問です。
Perlを使っている人はあまりGUIを作りたいとは思わない(そういう用途には使わない)のでしょうか?
wxPythonというものの存在を知ってちょっと検索してみたのですが、
wxPerlというものもあるけど、あまり盛り上がってないというか、日本語でその話をしている所がほとんどなさそうです。
どうしてでしょうか。
963デフォルトの名無しさん:05/01/16 17:28:35
Perl/Tkが有名だから。
964デフォルトの名無しさん:05/01/16 17:33:40
なるへそ。同等以上の事ができるんですね?
厨な質問にお答えいただきありがとうございました。
965デフォルトの名無しさん:05/01/16 17:37:16
>同等以上の事ができるんですね?
それは、知らん。
オライリーから本でてるし、情報得やすいことは確かだろうが。
966デフォルトの名無しさん:05/01/16 18:01:19
>>966
Javaとの比較しか分からんけど、
イベントとかの扱いは、問題にならないほど簡単みたいだったよ。
(だった、というのは、ちょっと試しただけだからだけど。
 JavaはRADの支援がないと、とてもやってられないと思う)
ただ、日本語もいちおう扱えるみたいだけど、
まだまだ問題があるみたい。
967デフォルトの名無しさん:05/01/16 19:47:57
質問です。

perlで、LWP::UserAgentモジュールを使って特許庁のHP
http://www2.ipdl.ncipi.go.jp/begin/be_search.cgi?STYLE=login&sTime=
から、特許の検索を自動化しようとして、次のコードを書いてみたんですが

use LWP::UserAgent;
use HTTP::Request::Common qw(POST);

my $url = 'http://www2.ipdl.ncipi.go.jp/begin/be_search.cgi';
$times = time();
$times = $times . '000';
my %formdata = (STYLE => 'search', S_WORD1 => '画像処理', R_TYPE1 => '02', BE_SEARCH => '検索実行', sTime => $times);
my $req = POST($url, [%formdata]);
$ua = LWP::UserAgent->new;
$ua->agent("Mozilla/8.0");
$res = $ua->request($req);
print $res->content;

本来なら50012件ぐらい、ヒットするはずが
「初心者向け検索」というタイトルの真っ白なエラーページに
飛ばされてしまいます。フォームデーターは完璧だと、思うのですが
もし解析できるかた、解決できる方いらっしゃったらhelp!
968デフォルトの名無しさん:05/01/16 19:59:35
HTTPDの機能を持つライブラリとかありますか?
POPfileとか、あれどのように実現してるんでしょうか?自前で組んでるんですか?
969デフォルトの名無しさん:05/01/16 20:06:11
>>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
の例文に習ってこんな感じでいーんじゃないの?
970デフォルトの名無しさん:05/01/16 20:11:38
>>969
あらやだ、
my $url = 'http://www2.ipdl.ncipi.go.jp/begin/be_search.cgi';
が抜けてたorz

ちなみに漏れの名前で検索したら出てきたyo. orz
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から
検索したときのように結果が返ってこないんです。うーん……
973デフォルトの名無しさん:05/01/16 20:24:48
>>971
まずまともに検索できるブラウザでどういうやりとりを
してるか調べて、それをなるべく忠実に再現するのが
一番じゃないかな。

ありがちなのは

(1) refererをチェックしている
(2) agentをチェックしている
(3) クッキー食わないとだめ

あたりか。
974971:05/01/16 20:30:47
>>973
refererの設定の仕方を調べてみます。

それでもダメなら
etherealを使って調べてみようと考えました。

もしだれか、「perlから検索通ったぞ!」って方、いたらば
こうやりなっせ、とレスください。
yahooとかgoogleとかだったらフォームをpostできるのに...
特許庁のバカーン 俺の技術の無さバカバカーン 。・゚・(ノД`)・゚・。
975デフォルトの名無しさん:05/01/16 20:55:37
>>973
http://www2.ipdl.ncipi.go.jp/begin/be_search.cgi?STYLE=login&sTime=
ブラウザー(mozilla)からを開いて、食べたクッキーを全部消してreloadし、
検索実行したら、
「クッキーないよ!」というエラーメッセがでました!!
これが原因かも... 微妙にperlからpostしたときとエラーメッセージが異なりはしますが...
(「サーバーが混雑してます」のようなメッセージが出ます。)

レスありがとうございました。
976デフォルトの名無しさん:05/01/16 21:00:50
977952:05/01/16 21:16:47
バイナリエディタで見てみると確かに 80 50 50 50 になっていました。
P = \x50 というのは理解できたつもりなのですが、
何故「\x83P」とすると「\x83」と合体して1つの文字になるのかが分かりませんでした。

それで父に聞いてみたんですが…(すみません(汗))
(Shift JISの)「83」というのが2バイト用のコードなので
その次の1バイトも足されて1文字になる、みたいなことを言ってました。
2バイト用のコードというものの具体的な範囲はちょっと分かりませんが、
その範囲内の値であれば同じような動作をするということみたいですね。

…父はPerlは知らないので、もしも何か間違っていればまたご指摘下さい。
この度は色々とありがとうございました。
978デフォルトの名無しさん:05/01/16 21:41:33
>>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 ぐらいは入れたほうが良いかも。)
979デフォルトの名無しさん:05/01/16 22:17:25
こんな時にはやっぱりWWW::Mechanize
980デフォルトの名無しさん:05/01/16 22:32:57
>>977
> 何故「\x83P」とすると「\x83」と合体して1つの文字になるのかが分かりませんでした。
何故って、表示端末が「\x83\x50を受け取ったら」「"ケ"を表示する」って設定されてるから。考えすぎ。
981デフォルトの名無しさん:05/01/16 23:04:57
>>976
 ありがとうございます!!libwwwってクライアントだけと思ってました。。。
982デフォルトの名無しさん:05/01/16 23:07:09
>>975
my $ua = LWP::UserAgent->new(
agent => qq|mozilla/8.00|,
cookie_jar => { file => "./.cookies" }, # これを追加して・・・
);
my $res = $ua->get(sprint qq|http://www2.ipdl.ncipi.go.jp/begin/be_search.cgi?STYLE=login&sTime=%d|, time);
$ua->cookie_jar->save; # 久喜を保存するとよいかモナー
983デフォルトの名無しさん:05/01/16 23:25:15
文字コード板に行ったほうがいいよな
984デフォルトの名無しさん:05/01/17 00:42:11
>>977
>2バイト用のコードというものの具体的な範囲はちょっと分かりませんが、
>>933
>1バイト目が81〜9F、E0〜FCなら次のもう一バイトとあわせてひとつの文字になる。
985デフォルトの名無しさん
もうそろそろ誰か次スレ立てれ