1 :
デフォルトの名無しさん :
04/11/28 22:41:14 "The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板
http://pc5.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
http://www.perl.org/get.html ● 2004/11/28現在の最新版: 5.8.5
● 2004/11/28現在の開発版: 5.9.1
5 :
デフォルトの名無しさん :04/11/29 00:00:51
v5.8.6age
お前ら音速が遅すぎ
cpanがどうのいう人は英語がわかるんですか?
>>6-7 それよか、5.8.5→5.8.6の変更点教えれ。
それによってインスコするかどう−か考えるから。
11 :
デフォルトの名無しさん :04/11/29 14:11:26
>>11-12 thanks
結構、バグフィクスありまつね。utf-8の扱いで不正な文字があっても
正常に対応できるようになったとか。漏れなんか、utf-8で多言語扱って
るからバージョンアップした方がいいみたい。
14 :
デフォルトの名無しさん :04/11/29 18:37:20
Linux colinux 2.6.8.1-co-0.6.2-pre6 #58 Sun Oct 24 21:48:46 IST 2004 i686 GNU/Linux Debian GNU/Linux 3.1 colinux tty1 This is perl, v5.8.4 built for i386-linux-thread-multi colinux/Debian で環境構築中です。 CPANからいろいろモジュールをインストしようとしてるのですが、 たとえばJcodeを入れようとすると、 /usr/lib/perl/5.8/CORE/perl.h:380:30: sys/types.h: No such file or directory /usr/lib/perl/5.8/CORE/perl.h:411:19: ctype.h: No such file or directory (延々と続く) などといわれてインストールできません。 他に、Email::Valid::Loose はテストに失敗するようで、 これも駄目でした。 RHL9環境下の This is perl, v5.8.4 built for i686-linux では問題なく インストールできているのです。 最初、makeがないといわれてmakeをいれ、次にccがないと怒られたので gcc入れました。 原因わかる方いらっしゃいますか?
レスしたくないよなあ、こういうの
DebianならDebianのパッケージとして入れればいいじゃん。 なんのためにメンテナーががんばってると思ってんじゃボケ
#apt-get install libc6-dev
指定したURLのHTMLファイルをダウンロードしたいのですが、 wget を使って実現するにはどうすればよいでしょうか。
koko ha perl sure desu.
>19 すいません。>18はperlの話です。
system("wget options...");
>>17 ありがとうございました。
>>16 DebianのパッケージでPerlモジュール入れられるの
知りませんでした。ありがとうございました。
ただ、探すの大変です。
>21 そういうことじゃないです。脳が少ないようなのでもういいです。
>>23 もっとちゃんと説明する必要があるんじゃないの?
>>18 の質問だと、おそらくみんな
>>21 が正解だと思うよ。
>24 みんなって誰と誰と誰ですか? あなたの脳内の人たちですか?
つまんない。
>26 ウワ。逃げやがった。
>>25 まあ私の脳内と思ってもらってもいいけども、
実際、ちゃんとしたレスがもらえて無いじゃない?
はい。あなた含め、皆さんの脳が少ないために ちゃんとしたレスがもらえませんでした。
つまんない。
>30 また逃げやがった。
>21 そういうことじゃないです。脳が少ないようなのでもういいです。
>24 みんなって誰と誰と誰ですか? あなたの脳内の人たちですか?
日時っぽぃ文字列をマッチさせるために以下のようにしました。 $date1 = '(?:(\d+)[-/.](\d?\d)[-/.](\d?\d))'; $date2 = '(?:(\d\d\d\d)(\d\d)(\d\d))'; $time1 = '(?:(\d?\d)\:(\d?\d)\:(\d?\d))'; $time2 = '(?:(\d\d)(\d\d)(\d\d))'; $regex = "^(?:$date1|$date2)(?:\\s+(?:$time1|$time2))?\$"; @dateval = $targetstr =~ m%$regex%; ここで言う「日時っぽぃ文字列」とは ●日付部 ・区切り文字「-/.」があれば桁揃え不要…710/3/10等 ・区切り文字なしなら8桁固定…20041129等 ●時間部 ・区切り文字「:」があれば桁揃え不要…1:1:1等 ・区切り文字なしなら6桁固定…235959等 という定義で、日付部と時間部は1つ以上のスペースで区切って 時間部は省略可とし、日時としての妥当性チェックは 正規表現だけだと閏年判定等で大変なのでこの後の処理で行う予定です。 で、上記コードでマッチング自体はできるのですが、 @dateval[3 .. 5]に何かがキャプチャされてしまいます。 @datevalは年,月,日,時,分,秒になるようにしたつもりなんですがこれはなんでしょうか? #ActivePerl 5.8.3で確認 あるいは他にいい正規表現があれば教えてください。
>>34 たとえば、 (:?$date1|$date2) に着目すると、
$date1 か $date2 のどちらか片方にマッチしたとしても、
そこだけで $1 から $6 まで占めちゃう。
ので、@dateval の内容を取り出す際に、
$1, $2, $3 または $4, $5, $6 のうちのセットされているどちらか一方だけを
とりだして 年,月,日 とするようにすればいいかと。
>>35 > たとえば、 (:?$date1|$date2) に着目すると、
> $date1 か $date2 のどちらか片方にマッチしたとしても、
> そこだけで $1 から $6 まで占めちゃう。
なるほど。
たしかに例えば「2004/11/29 235959」という文字列に対してマッチングさせたら
@dateval[0 .. 2]と@dateval[9 .. 11]にキャプチャされていて
仮に時間が省略されていたとしてもマッチさえすれば
$#dateval=11になっていることも確認できました。
ありがとうございましたm(_"_)m
cpan> i Filter::Simple
Strange distribution name [Filter::Simple]
Module id = Filter::Simple
DESCRIPTION Simplified source filtering
CPAN_USERID DCONWAY (Damian Conway <
[email protected] >)
CPAN_VERSION 0.79
CPAN_FILE D/DC/DCONWAY/Filter-Simple-0.79.tar.gz
DSLI_STATUS RdpO (released,developer,perl,object-oriented)
MANPAGE Filter::Simple - Simplified source filtering
INST_FILE /usr/local/lib/perl5/5.8.6/Filter/Simple.pm
INST_VERSION 0.78
直して欲しいかも。
$VERSION = '0.78';
のままだし。。。
>>37 あれ?CPANのは0.79になっているなぁ。。。
正規表現でのマッチングで、『\S』というのはスペース以外の文字を表しますよね。 これを使って、『半角文字5個分』のマッチングを行いたいのです。 例えば、 :abcde: :fgh__: :ijkl_: :m____: :no___: (_ は半角スペースだと思ってください) のようにコロンとコロンの間に半角文字5個分の領域を取って書いてあるテキストで パターンマッチングを行いたいのですが、:と:の間のマッチングを どのように記述していいのかわからないのです。 \w{5} を使えば:abcde: の部分はマッチングが行えますが、他の4行はダメですよね。 \S{5} を使っても、\Sは『スペース以外の全ての文字』なのでダメだと思います。 全ての文字と、スペースを含めて半角5個分をマッチングさせる方法があったら教えてください。 よろしくお願いします。
すみません。
>>39 の最初の1行は余計です。
\Sを使うことにこだわりはありません。
.....
[\w ]{5}でよいのではないかと思われ。
ありがとうございます!
.................
\sには\tとか\nも含まれるからね・・・
\w{1,5}
テキストデータに表示不可能文字(バイナリ?)が混ざったファイルとテキストのみのファイルを 見分ける手段というのはありますでしょうか? 別にPerlじゃなくたってこれでできるというのがあれば、ポインタでも教えて頂ければありがたいです。
>48 あるかないかと言えばある。回答終わり。 ポインタ?
>>48 jcode.pl の getcode() 関数を使うとできるかも。
>>49 ポインタっていうか、ここ見たらあるから見れとかそういうのでもってことでした。
ちなみに、手間でなければその方法をお教え願えないでしょうか?m(_ _)m
>>50 ありがとございます。
試みてみます。
>>48 $binary = 1 if $str =~ /[\x0-\x8\xb\xc\xe-\x1f]/;
こんな感じかな。どうせ厳密なのはできないし。
>>52 それだと ISO-2022-JP が救えなさそうだけど大丈夫かな?
MS-wordのファイルをテキストファイルにするスクリプト書いた香具師いる?
見てみたら、ドイツ語と日本語混在のDOCてutf-16で書かれてたよ。
>>48 は、ひょっとして同じことやろうとしてるのか。
>>55-57 情報、どもども。
とりあえず、wv(うぉーunix対応)ダウソしてみまつた。
これまで、xdoc2txt(free)つーのと「なんでもテキスト屋さん」
(share)つーの試して未丹やけど、日本語はうまくいくんだが、
ドイツ語特殊文字がぜんーぶダメポだったんよ。
でけたら、いつか報告始末ね。(今日は忙し)
あ、わっしが作ったword2txt.plも結構行けますたよ。英語とか独語 だけだと。何つうかな、記号類(機種依存文字かな)をいちいち指定 しないとダメポですたが。
あちちち、wvてwindows用だた。unixでこいうのあれば、 OpenOffice入れなくて済むのにぃ。
リッチテキストファイルの表の部分を カンマ区切りかタブ区切りかぐらいにしてくれるツール無い? perlで作ったやつ一人くらい居そうな気がするんだが
あるけどおまえにはやらん
初歩的な質問で恐縮なんですが・・・ foreach (@abc) { と foreach (@$abc) { の違いって何でしょうか? 前者は 配列 abc の各要素毎の処理で、 後者は 変数 abc で示された文字列の名称の配列の各要素毎の処理、 という理解であってますか?
後者は$abcという変数に格納された「配列へのリファレンス」が示す配列の各要素 @{$abc}の省略記法です。ラクダ本のリファレンスの章を読んでみると分かりやすいと思います。
>>65 あえがとうございます。
リファレンス、ですね。
勉強してみます。
67 :
デフォルトの名無しさん :04/12/02 06:52:06
あのー、ウインドウズでPerlができるソフトは何があるのでしょうか。
69 :
デフォルトの名無しさん :04/12/02 07:49:09
$ua = LWP::UserAgent->new;
$ua->cookie_jar($cookie_jar);
$ua->timeout(600);
$request = POST("
https:// 〜hogehoge〜/" ,[%form_data]);
$res = $ua->request($request);
$_ = $res->content;
上で'500 read failed:'って帰ってくるんですけど、対処方法はないですか?
timeoutは意味をなしていない見たいだし。
いや、Win32::Guiだ
71 :
デフォルトの名無しさん :04/12/02 11:20:48
use strict; $c=4; ではエラーになる(当然)のに、 use strict; $a=4; ではエラーにならないのはなぜですか? $aを$bにしても同じです。
sort() によって使われるという理由で $a と $b はこのチェックの適用外という特別扱い
っていうかperldoc見ると普通に理由書いてあるぞ ちゃんと読め
あれ? DBDにSQLserver用のドライバありませんでしたっけ? 前に見た記憶があるんですが..私の記憶違い?? CPANさんやーいorz
75 :
デフォルトの名無しさん :04/12/03 11:37:17
のーびすな質問です。 CPAN って、どう読めばいいのでつか?
76 :
デフォルトの名無しさん :04/12/03 11:46:22
77 :
デフォルトの名無しさん :04/12/03 15:53:49
どちらの板が正式なのかわからなかったので、両方に質問します ハッシをまだ使いこなせていません。例えば、 一つのファイルは、 106 1473 106 764 1762 48 1762 38 1762 91 と、左の数字に対して、いくつかデータがあって、もう一つのファイルは、 106 30 1762 50 と、左の数字に対して一つしかデータがないものがあった時に、 これを、 106 1473 30 106 764 30 1762 48 50 1762 38 50 1762 91 50 のようにハッシュをつかって表示させるのはどうやればいいのでしょうか?
ループ{ $hash[$file1_leftvalue} = $file1_rightvalue; } ループ{ printf("%d %d %d\n", $file2_leftvalue, $hash{$file2_leftvalue}, $file2_rightvalue); }
79 :
デフォルトの名無しさん :04/12/03 17:18:59
質問します @NEW1 ← 1データ @NEW2 ← 2データ ・ ・ @NEW100 ← 100データ が入っており これを if (!open(OUT,">$ufile")) print OUT @NEW1; close; if (!open(OUT,">$ufile")) print OUT @NEW2; close; と別のファイルに出力します。@NEWの数が多いので 下記のようにループでやろうと思うのですが、print 分の@NEWの記載方法がわかりません @NEW1 @NEW2 **** @NEW100 のようにカウントを用いたいのですがうまく認識してくれませんでした。 お願いします。 foreach my $num(1..100){ $ufile = $UDATA_DIR_C[$num].; if (!open(OUT,">$ufile")) { &error('個人ファイルが書き込めません'); } print OUT "@NEW$num"; ← これではだめでした close(OUT); }
80 :
デフォルトの名無しさん :04/12/03 17:22:40
if (!open(OUT,">$ufile")) print OUT @NEW1; close; if (!open(OUT,">$ufile")) print OUT @NEW2; close; 同じファイルに出力しているようなのですが?・・・
81 :
デフォルトの名無しさん :04/12/03 17:23:39
>>80 $ufile = $UDATA_DIR_C[$num].;
としているので、違うファイルです
82 :
デフォルトの名無しさん :04/12/03 17:26:19
print OUT eval("\@NEW$num");
ソフトリファレンス使って print OUT "@{'NEW'.$num}"; とすればその部分はいけると思うけど、全体見直した方がいくない?
ネタだと思う
86 :
デフォルトの名無しさん :04/12/04 01:48:37
質問します 配列の中の空白をとる置換をしようとおもうのですが @NEW =~ tr/ //; だと置換が行われないようです。一レコードづつ置換しないとだめでしょうか?
>>86 YES.
tr/ //d for @NEW;
>>86 おまえはスクリプトが完成するまで質問し続ける気かね
作ってくださいスレへ行け、と。
質問の
>>77 と
>>79 を見る限り
最初はハッシュ要素に配列入れようとしてたが、方法が分からずに
>>79 みたいな変な実装になってるんだろう
>>78 は全然間違った回答してるしw
91 :
デフォルトの名無しさん :04/12/04 09:53:07
92 :
デフォルトの名無しさん :04/12/04 10:57:10
質問します foreach $num (0 .. $#STOCK) { $line = $STOCK[$num]; ($WORD,$PRON,$MEAN,$LVL,$CAT1,$CAT2,$YOBI1,$YOBI2,$YOBI3,$YOBI4,$YOBI5) = split(/@@@/,$line); $line2 =$WORD.'@@@'.$CAT1.'@@@0@@@'.$CAT2.'@@@0@@@'.$YOBI1.'@@@0@@@'.$YOBI2.'@@@0@@@'.$YOBI3.'@@@0@@@'.$YOBI4.'@@@0@@@'.$YOBI5.'@@@0@@@'."\n"; #カテゴリーごとにユーザファイルを分割する if ($CAT1 > 100 && $CAT1 < 200){push(@NLINE,$line2);} } @STOCKの内容を取り出して、条件に合えば、@NLINEに吐き出すのですが、 一行目が AAAAAAA だとするとちゃんとはいるのですが、2レコード目以降 BBBBBBだとすると先頭に半角の空白が入って@NLINEにはいってしまいます 具体的には AAAAAA BBBBBBB CCCCCCC です。直前(PUSHする前の)$line2のダンプを取ってみても空白は、まったくはいっていないので pushをすると自動的に空白がはいってしまうようです。なぜでしょうか?
93 :
デフォルトの名無しさん :04/12/04 13:57:22
>>92 前スレ866さん、出番です(笑)
866 名前:デフォルトの名無しさん 投稿日:04/11/23 19:26:38
>>864 どっかで
print WRITE "@value";
とかやってんだろ。
>>92 おまえはスクリプトが完成するまで質問し続ける気かね
Sir! No! Sir! Sir! 完成後も続けます! Sir!
96 :
デフォルトの名無しさん :04/12/04 14:21:17
質問箱なんだからはよおしえれ
改行コードじゃないの
>>97 んや、半角の空白
どう考えてもおかしい pushする直前にダンプしてもはいてないけど、push後にははいっている
perl5のバグかな
そんなしょーもないバグがあるはずないんですけど。 '@@@0@@@'."\n"; を '@@@0'."\n"; ではだめですか?
100 :
92 :04/12/04 14:47:55
>>99 どうもです、今試したんですが
なぜかうまくいきました・・・ サンクスです
が理由がわかりましぇん
どうでもいいが、 foreach $num (0 .. $#STOCK) { $line = $STOCK[$num]; なんてやるぐらいならはじめから foreach $line (@STOCK) { にしろよ。$numそこでしか使ってないからいらないだろ。
見てて吐き気のするコードだなおい
ほんとにどうでもいいです。
104 :
92 :04/12/04 15:10:30
解決したからまあいいや
週末はこのスレはreadonly それがPerl流
106 :
54 :04/12/04 18:26:16
書き込めるけど読めません。chmod間違えてませんか。
>>105
Perl6の正規表現ってやばすぎですよね。
間の悪い時にくだ質御免。 while(open(IN,<*.txt>)) { みたいなファイルの開き方しちゃった時、 ループ内で「今開いとるファイル名」を得る方法ってありませんでしょか。 前もって$filename = glob("*.txt"); とかするより楽な方法が、なんかあるんじゃないかと気になって眠れない。
>>108 そんなファイルの開き方しちゃダメです。@負荷増大
opendir Dir_entry, './' or die;
for (grep /\.txt$/, readdir Dir_entry){
open IN, '<', $_ or last;
...
}
とか。
そうなんですか。ありがとうです。 ひとつひとつ横着せずにやりますか。
while(<*.txt>)) { open IN $_; my $file = $_; とか
ループの最後でちゃんとcloseしてれば問題ない気がするが
えっと、ワイルドカード(<*.txt>、glob(*.txt))が負荷を掛けているってことですので、、、
114 :
デフォルトの名無しさん :04/12/05 13:06:26
115 :
デフォルトの名無しさん :04/12/05 13:47:38
117 :
デフォルトの名無しさん :04/12/05 23:32:40
質問します。 Win32のActivePerl5でドライブのレディ状態を調べたいのです。 if ( &drive_ready_check( 'A' ) ){ print "Aドライブはレディー状態です\n"; }else{ print "Aドライブはノットレディー状態です\n"; } という感じで使いたいのです。 よろしくお願いします。
>>118 早速の返答ありがとうございました
やってみます
>>116 Parse::RecDescent(以下、P::RDと呼びます)はnew() モジュール・メソッドを使って新しい文法を作ります。
各P::RD文法は、P::RDクラスにブレスされたオブジェクトになり、文法中の各ルールはメソッドとして、
アクションを起こすために使用します。P::RD文法は構文解析プロセスに統合された 一部として、
それぞれのルールにアクションを関連付けます。これは非常に重要なことです。
Perl 5では構文解析は自分自身へのイベントであり、アクションは、大都会に至る道すがら、
遠くからでも猫を混乱させることが証明されている拡張構文を使って轢き殺した、路上轢死体のようなものです。
この違いにより、一致が検出された時に何かが起こるようにするという点で、
P::RDはPerl 5の正規表現よりもずっと効果的なものになります。
翻訳されてても読めません、先生。
よく使うサブルーチンがいっぱいあって、いちいちコピペするのが面倒なんですが、 その場合は routine.pl に全部入れておいて、呼び出す方のファイルに require "routine.pl"; と書けばいいだけなのでしょうか?
>>122 そだね"1;"を忘れないように。
ってかファイル名気持ち悪いので複数形に汁
もおプログラミングするのツカレタ・・・・
ありがとうございました。 できたのですが、最後の1は何か意味があるのでしょうか。よく理解できません。
>>125 perlfunc(1)のrequireの項よめ。
初期化コードの実行がうまくいったことを示すた
めに、ファイルは真を返さなければなりませんから、真を
返すようになっている自信がある場合を除いては、ファイ
ルの最後に "1;" と書くのが習慣です。 実行文を追加す
るような場合に備えて、"1;" と書いておいた方が良いで
しょう。
A | ON 1.500000 | OFF 4.000000 | 2.500000 A | ON 2.300000 | OFF 3.400000 | 1.100000 C | ON 0.400000 | OFF 8.200000 | 7.800000 B | ON 4.100000 | OFF 5.500000 | 1.400000 と言うような行が書かれているデータファイルを読み込んで、一番右側の数値でソートし、 A | ON 2.300000 | OFF 3.400000 | 1.100000 B | ON 4.100000 | OFF 5.500000 | 1.400000 A | ON 1.500000 | OFF 4.000000 | 2.500000 C | ON 0.400000 | OFF 8.200000 | 7.800000 といった出力することはできるでしょうか? if ( $_ =~/(A|B|C) \| ON (\S+) \| OFF (\S+) \| (\S+)/) の$4でソートをするというのはなんとなくわかるのですが、ソート結果出力を その値がある行全体を表示して出力する、というやり方がわからないのです。 どなたかわかる方いらっしゃいましたら教えていただきたいです。 よろしくお願いいたします。
>>127 先に分解するんじゃなくてソートするときに分解したら
>>127 ほれ。
sub get_sortkey ($) {
return $1 if shift =~ /(?:A|B|C) \| ON \S+ \| OFF \S+ \| (\S+)/;
# ちなみにこのフォーマットならこっちのほうが良いかも
# return $& if shift =~ /[\d\.]+$/;
return 0;
}
my @sorted = sort {get_sortkey($a) <=> get_sortkey($b)} @src;
print map { $_->[ 0 ] } sort { $b->[ 1] <=> $a->[ 1 ]} map { [ $_ , m/ (\S+)$/ ] } <>;
>>128 ,
>>129 ,
>>130 ありがとうございます。
>>129 さんの方法を組み込もうと思っているのですが、せっかく教えていただいたのに
使い方がイマイチ理解できません・・・。
>>127 の時点で考えていたことは、
sub sort
{
$i = 0;
while ( $_ = <FP> )
{
if ( $_=~ /(A|B|C) \| ON (\S+) \| OFF (\S+) \| (\S+)/ )
{
$value[$i] = $4;
}
$i++;
}
}
@value_sort = sort {$a <=> $b} @value;
print WRITE @value_sort;
というような考えだったのです。
>>129 さんの最後の行をこの関数sortの中に入れて、関数 get_sortkey を
関数sortの外に記述する、といった感じなのですか?
せっかく教えていただいたのに理解できずに申し訳ないです。
勉強を続けなくては…。
>>131 そもそもsort関数が、perlで用意されてるのをご存じか?と、訊きたい。
$a<=>$bってやってるじゃん。つかこの辺の仕組みで誤解して悩んでる気がする
>>127 に近い形で書くとすると
use strict;
my @value;
while( <> ) {
if( /(A|B|C) \| ON (\S+) \| OFF (\S+) \| (\S+)/ ) {
push ( @value , [ $4, $_ ] );
}
}
@value = sort{ $a->[0]<=>$b->[0] } @value;
print $_->[1] foreach( @value );
…あんま変わらんか
Perl6ってもうすぐ出るんですか?
>>1 を見る限りでは、もうすぐという感じなのですが。
136 :
デフォルトの名無しさん :04/12/07 11:39:33
ここで質問に答えてる人ってすごいスキルあるよね すれ違いだけど どんな本読んでるか教えて おれのは、CGI&PERLポケットリファレンス、perl&CGI入門ゼミナール
>>136 とりあえずその本捨てろ、O'Reillyの本を読め
後、スキルあるんじゃないぞ、これ位は普通
ていうか最近質問のレベル低すぎる
少なくとも
>>137 を見る限り、一部回答者のレベルの低下ぶりにも
目を覆いたくなるほどのものがある。
スコープを抜けるときは必ずこれを実行する、みたいな、 ファイナライザみたいなのはできるでしょうか? たとえば、ネットワーククライアントで、 処理中に途中で例外が発生して return しようすると、 そこで勝手に自動的に close() してくれる、みたいな感じのができるといいのですが。
use Error qw(:try) とか使えば?
141 :
デフォルトの名無しさん :04/12/07 13:30:35
>>137 O'Reilly って洋書ジャン
翻訳で挫折しそう 俺の場合は汎用機やってたか
そっちの言語は分かるが、perlの省略した形やデータ属性がないことに違和感を感じるね
142 :
デフォルトの名無しさん :04/12/07 13:41:42
オライリーでぐぐれ
143 :
デフォルトの名無しさん :04/12/07 14:26:41
75でつ CPAN の読み方を知りたいっす.....
144 :
デフォルトの名無しさん :04/12/07 14:33:28
>>139 オブジェクトにはデストラクタを指定できる。
例えば、IO::Fileなどは自動的にcloseしてくれるし、
CPANで配布されているオブジェクト指向モジュールはその辺適当に始末してくれる事がおおい。
自分でやるにせよ、生のハンドルは使わず、オブジェクトで包んで使うのが無難だな。
>>143 しーぱん
これからPerlかPHPを勉強しようと思っている学生です。 なんだかPerlよりPHPのほうが強力、という記事をよく見ます。 (CGIに限ってのことかもしれないですが) ここに現れる皆さんはPerlの熟練者の方達ばかりだと思いますが、 そのような方達がPerlを現在も使っているのはどんな理由からですか? 学生の僕には、 ・Unix系のOSには最初からPerlが入っているから ・PerlのCGIで作られたホームページが多いから といったような、「使っている人が多いから」くらいしか思い浮かびません。 熟練者の方から見て、PHPと比べたPerlの利点・欠点を教えていただければうれしいです。
>>146 レベルどうこう以前にこういう質問の方が嫌なんだが。すぐ荒れるし。
PerlとPHPでは出自がちがう。
sed awkといったフィルタ言語の流れで生まれたのがPerl。
そのテキスト処理能力があまりに強力なので、CGIに多用された。
PHPはWebサーバー上での使用を念頭に入れて開発された。
そういう場での使用にかなり特化されたつくりをしている。
CGIでPerl使う気にはもうなれんという人がいても別に不思議じゃないが
ターミナル上での書き捨てスクリプトつくるのに俺はPHP使う気にゃなれんし
そういう事例で言語自体の出来を云々するのはオロカ。
オロカな比較は実に多いので気にする必要なし。
てか、言語同士比較してるよりなんでもいいから使ってみ。
あとPerl、PHPの両刀使いも多いよ。 それぞれ得意、不得意があるからケースバイケースで使い分ける。 荒れるのはPHPしか出来ない奴がPHP至上主義で刃向かってくることが 原因である事が多々ある。
149 :
デフォルトの名無しさん :04/12/07 17:31:17
>>141 http://www.oreilly.co.jp/books/perl/ 初めてのperl 正・続 と クックブックがお勧めかな。
続のオブジェクト指向の記述はわけわかだけど
(リファレンスの使い方の記述は分かりやすいんだけどね)、
クックブックのは比較的分かりやすい。
(ほかで、オブジェクト指向の入門的知識を仕入れてないとダメだけど。
オブジェクト指向が分からんと、もうモジュールもまともに使えないし)
高いけど、オライリーの本をやらないと、結局、ダメだと思うよ。
ありがとうございます。 知らなかったとはいえ、荒れる要素を含む質問をしてしまい、申し訳ありません。 これから活用したいと思うスレが荒れるのはイヤなので回答はもう結構です。 回答してくださったお二方、どうもありがとうございました。
151 :
デフォルトの名無しさん :04/12/07 17:36:46
webでデータベースとしてシステムを構築することだけ考えても、 本当は、mod_perlとDBIを備えるperlの方がより強力なんじゃないの? (宣伝文句と違い、PHPはmod_perlより早いわけじゃないし、 DBIなら裏のデータベースが変わっても、らくらく対応だし。 ボラクルでもどんとこい!) それ以外の用途では、基本的にperlじゃないとやれないし。
PHPはマーケティングが上手い 企業対個人って時点で当たり前なんだけど。
>>146 打ち切った後の回答で悪いが
どちらかではなくて両方覚えるのがイイよ
(同時じゃなくていい、好きな方を先にやって残りを後から)
そして、自分で考えて使い分けるのがいい
これまた打ち切った後の回答で悪いが、
>>146 は
PerlとPHPのどっちを先に勉強したほうがいいのか、ということじゃないか?
それこそどっちが活躍の機会が多いか、とかのような感じで。
ワシ的にはPerl。
なぜなら、やはり今ではPerlでCGIを使っているシステムが多いから。
別にPerlの使用用途はCGIだけじゃないが。
>>140 ,
>>145 レスありがとうございます。
>>145 さんのは DESTROY ってやつですね。
これがまさに探していたものでした。これでうまくいきました。
ありがとうございました。
Webで使うから って理由をベースに考えを進めるよりは 手軽な言語 → Web でも使える って流れで考えた方が良いと思うが
cygwin上にてperlの運用と勉強をしようとしています 使おうとしているソフトの中の一機能として、Win32::GUIが必要だとあるのですが、 そのパッケージなどを探してみると、ActivePerl用のPPMパッケージ等しか見つかりません perlが何たるかもわかっていないところに問題があるとも思いますが、 導入方法に関して取っ掛かりをつけていただけないでしょうか
ありがとうございます CPANというものを使ってやってみようと思います
>>149 オーレイってシリーズもんでよく書店にあるやつだねー
高くて見てなかったので、見て見ます サンクスコ
オライリーと読め!!!
162 :
デフォルトの名無しさん :04/12/07 23:29:20
flock関数で、LOCK_SHを指定する意味って何なんでしょうか?
なんで、ファイルよむためだけにロックする必要があるんでしょうか?
>>161 私もオーレイってよんでます。
むしろ、日本語読みすると、オーレイのが正しいしぃ。
164 :
デフォルトの名無しさん :04/12/07 23:41:06
perlのstat関数で、ファイルのタイムスタンプを取得すると、 $hoge = stat($time)[9] print $hoge で、23424545のような、意味不明な数字の文字列がでてくるんですが、 これを、年月日時分秒のようにわかりやすい形にするにはどうしたらいいんしょ?
>>162 読むだけ同士ならいくつ同時に読んでもなんともないが、
書き換えをする奴が混ざると書き換え途中の変な状態を
読むかもしれない。なので読むだけの奴はLOCK_SHを、
書き換えする奴はLOCK_EXをそれぞれ使うのが普通。
>>162 O'Reilly自身がオライリーって表記してるんだから...
るby>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ぺrl
169 :
デフォルトの名無しさん :04/12/07 23:51:01
>>164 そのコード通るか?
localtime でググれ
171 :
デフォルトの名無しさん :04/12/07 23:52:05
172 :
デフォルトの名無しさん :04/12/07 23:53:09
173 :
デフォルトの名無しさん :04/12/07 23:57:23
こうしなきゃ $hoge = (stat($time))[9]
どうでもいいがファイルを表す変数に $timeという名前をつけるのはいかがな ものかと。
175 :
デフォルトの名無しさん :04/12/08 00:52:01
プロセスを標準エラー込み込みでオープンする場合 open PIPE, "command 2>&1 |"; とか書いたりしますが、標準入力と標準エラーを別々のハンドルで分けて 開くのってどうやったらよいのでしょうか?
ipc::open3
>>176 ありがとうございます。
open3でググってみました。waitpidという言葉がところどころ見えるのですが
これは自分でwaitしなくてはいけないと(すればよい)と考えればよいですよね。
>>158 Cpanでインストしようとしたら
GETはできたのですがmakeの時点で
Writing Makefile for Win32::GUI
Makefile:339: *** ハャホ・オュケ讀遉、、ニ、、、゙、ケ。」テ貊゚。」
/usr/bin/make -- NOT OK
というエラーが出てしまいます
化けてて読めない…orz
# --- MakeMaker xs_c section:
.xs.cpp:
$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && $(MV) xstmp.c $*.cpp
179 :
デフォルトの名無しさん :04/12/08 11:43:11
if($resec[3] eq 0){ print"$resec[3]"; } という文を実行すると、$resec[3]の内容が表示されてしまいます。 @resecの4番目の要素は、pq370という文字列です。 これはなぜなんでしょうか。
181 :
デフォルトの名無しさん :04/12/08 12:06:04
>>178 > Writing Makefile for Win32::GUI
> Makefile:339: *** ハャホ・オュケ讀遉、、ニ、、、゙、ケ。」テ貊゚。」
> /usr/bin/make -- NOT OK
> というエラーが出てしまいます
>
化けの部分は、
Makefile:339: *** 分離記号を欠いています。中止。
だわ。
if($resec[3] eq 0){ なにしてんの? if($resec[3] eq '0'){ if($resec[3] eq ''){ if($resec[3] == 0){ どれ?
183 :
デフォルトの名無しさん :04/12/08 12:11:29
185 :
179 :04/12/08 12:57:52
eqと==はどのように違うのでしょうか。 文字を==で比較した場合や、数字をeqで比較した場合はどのようなことが内部で行われているのでしょうか。 今回の場合は、@resec内には0と文字列の両方が含まれています。
質問があります。 DBI でカラム名(フィールド名)をリストを抜き出す関数ってありませんか? $sth->fetchrow_array で抜き出す配列と同じ順番で出したいのですが..
> DBI でカラム名(フィールド名)をリストを抜き出す関数ってありませんか? 失礼しました。 perldoc 隅々まで眼を読んだらありました。 スレ汚し申し訳ありません。
>>185 ドキュメントや書籍を読もうという気は微塵もないのですか?
>>187 謝るぐらいならどうやればできたかも書けよ
>>181 Makefile.PLやMakefileなどを見て該当部分の空白をタブに置換したりもしてみているのですが、
何度やっても同じエラーでとまってしまいます
また、そのエラーが出ないときは
Couldn't rename Win32-GUI-0.0.558 to /home/UserName/.cpan/build/Win32-GUI-0.0.558:
Permission denied at /usr/lib/perl5/5.8.5/CPAN.pm line 3948
と出て、その下にエラーが続きます
perl Makefile.PL によってMakefileが作られると考えていたのですが、ほかにどこか修正し忘れのような点はありますか?
191 :
179 :04/12/08 13:48:05
じつはおまいらはあんましよくわかってないということがわかりました。もういいです。
>>191 あいにく養護学校に勤務した経験がないもんでね(w
>>190 makeのバージョン(ていうか、実装系)を疑った方がいいかもね
Win系のモジュールの中には、特定のコンパイラに依存しているのとかあるし
>>191 オーレイ一冊買うのすらケチってるとあとでロクなことないですよ
アーライ!!
オーレイ
197 :
デフォルトの名無しさん :04/12/08 15:05:53
perlを始めようと思ってます。 DLしたいのですが、どれをどうDLするかとか何処にも書いてないので 全然わかりません 言葉の意味もまともに分かりません 教えて欲しいのですが、板違いならどこの板できけばいいですか?
198 :
デフォルトの名無しさん :04/12/08 15:07:11
>>197 よ
もろ
>>1 のリンク先にあるぞ。
英語読めないとはいえOSの名前ぐらいわかるだろ。
>>193 さらにいろいろやってみているのですが、
Cpan 上で make Win32::GUIとやるとエラーが出るので普通にBash上で
Perl Makefile.PLとやると、エラーも無くMakefileができました
その後Cpanで install Win32::GUI 等とすると、同じディレクトリ内にtmpというディレクトリが作られ、
そちらに全内容を移動して作業した後に、
Removing previously used /home/UserName/.cpan/build/Win32-GUI-0.0.558
Can't remove directory /home/UserName/.cpan/build/Win32-GUI-0.0.558: Device or resource busy at /usr/lib/perl5/5.8.5/CPAN.pm line 3947
Couldn't rename Win32-GUI-0.0.558 to /home/UserName/.cpan/build/Win32-GUI-0.0.558:
Permission denied at /usr/lib/perl5/5.8.5/CPAN.pm line 3948
となります
自分で消したファイルに文句言われても対処のし様が…
あきらめた方がいいのかとも思うのですが。
>>189 す、すまねーorz
@{$sth->{NAME}}
ここに入ってた
202 :
デフォルトの名無しさん :04/12/08 18:52:18
いっぱいありすぎてどれかわからないです、すみません あとUNIXとか、コマンドプロンプトとかもよくわかりません 教えて君ですっごい申し訳ないです
203 :
デフォルトの名無しさん :04/12/08 18:55:13
連書きすみません UNIXのコマンドラインと、プロンプトの二つがごっちゃになってました
とりあえずスレ違いというのだけは確かです。。。
encodingの使い方がよく分かりません。 use encoding "shiftjis" ってやると、shiftjisでコーディングできるようになったとこまではよかったんですが、 opendir ( DIR, $dir ); my @files = readdir( DIR ); @target = grep {/漢字ファイル名/} @files; ってやっても、望んだファイルが引っかかってくれません。 use open IO => ":encoding(utf8)"; use open ":std"; って入れても一緒でした。 use open IO => ":encoding(shiftjis)"; とすると "\x{0088}" does not map to shiftjis at ... みたいなエラーが山ほど出てきて駄目でした。 ちゃんとUNICODEで入ってきてるっぽいです… やっぱり読み込むたびに手動でUNICODEに変換しなきゃ駄目なんでしょうか?
>>207 LWP::UserAgentでrequests_redirectableを空にしとけばいいんでねーの?
試してはいないが。
>>206 readdir は UTF-8 でなくて生でデータがはいってくるはず。そのままでは
SJIS 文字列にマッチしない(1バイトめと2バイトめがなきわかれになって
いることが length をとってみればわかる)ので、Encode::decode とかを
つかって変換してやればオッケー。
use encoding って一見便利なようにみえて動きがわかりづらいのがいやん。
210 :
デフォルトの名無しさん :04/12/09 12:54:29
PerlのCGIの実行を、拡張子を.cgi以外で実行するにはどうしたらいいのでしょうか。 ヤフーなんかは、拡張子が無いようにも思われます。 どなたかご伝授下さい。
>>210 スレ違い、使ってるWebサーバのスレに行け
Perlのsort関数でローカル配列って使えないのでしょうか? 下記のサンプルソースで Before と After の内容が変わってしまいます・・・。 どなたかご存知な方、ご教授お願いします。 #!/usr/bin/perl &aaa(0); exit; sub aaa { local ($m) = @_; local @ary,arys; push @ary, $m; @arys = sort(@ary); if($m == 0){ print "Before:$arys[0]\n"; &aaa(1); print "After:$arys[0]\n"; } print "$arys[0]\n"; }
イミフメ
local (@ary,@arys);
use strict 'subs' で裸のワードを禁止にするべし。
>>208 できました。
$ua = LWP::UserAgent->new;
@{ $ua->{'requests_redirectable'} } = ();
とし、後は$res->is_redirectでリダイレクトを調べ、$res->header('Location');で全部取得できました。
どうもありがとうございました。
いまどき新しく書くなら常にuse strictでいいと思うけどな。
>>209 readdirってopenと違って :encoding() で指定できないからだろうけどね。>use encodingで対応してない
今更なんだが、
>>133 のソースを理解するにはどの単元を読めばいい?
[変数, 変数] っていう形が全然何を表しているのかわからん・・。
自分のレベル的にはまだオライリ−の『初めてのPerl』読んでる程度。
この本に載ってなかったらどの本のどこらへんを読めばいいのか教えてくれると激しく嬉しい・・・・。
Cygwin で Perl 使っています。
Tkをインスコしようとしたらコンパイルエラーで落ちます。
TK の作者 (Ing-Simmons師) は
http://groups-beta.google.com/group/comp.lang.perl.tk/browse_thread/thread/ 454e0eaa6edebb97/ff475a9a5197ccc4?q=perl%2Ftk+cygwin+%22initializer+elem
ent+is+not+constant%22&_done=%2Fgroups%3Fhl%3Dja%26q%3Dperl%2Ftk+cygwi
n+%22initializer+element+is+not+constant%22%26&_doneTitle=Back+to+Search&
&d#ff475a9a5197ccc4
としてサジを投げています。
私は神になりたいです。根性でTkを脳みそコネコネコンパイルします。
223 :
デフォルトの名無しさん :04/12/11 02:25:06
>>222 ActivePerlを入れてる私は、神ですか?
>>209 ,216
いまさらですがencode,decode使うといけました。ありがd
perlって、読み込んだ文字列がdecode前か後か知ってる癖に、自動で変換とかしてくれないんですね…
これじゃencoding意味ないよ!ヽ(`Д´)ノ
自動を嫌うのがPerlerです
>>225 その根拠は?
$_には自動で値が入るし、数値と文字列の相互変換も自動。
そもそも面倒な作業―特にテキスト処理―を自動化するのにこそ、
向いている言語だと思うが違うか?
いや、CGI作るために使ってる香具師には関係無いか
テキスト処理しか例に出せないのもアレだな
228 :
デフォルトの名無しさん :04/12/11 13:01:13
特定の単語をそれを含むタグとともに削除したいのですが・・ ==「使用上」という単語を含む<TD>〜</TD>までの文字列を削除したい== <TD>・・</TD> <TD>〜使用上〜</TD> <TD></TD> ============================================================ ・下記のパターンマッチを考えては見ましたが、 文章内に T やD があるとマッチしてくれません。 <TD>[^(<TD>)]*使用上[^(</TD>)]*</TD> <TD>〜特定の単語 との間に <TD> という文字列が存在しない、 という設定は可能でしょうか?
s{<TD>.*?</TD>}{}isg;
s{(<TD>.*?</TD>)} { index($1,'使用中')==-1?$1:'' }isge; いまいちか・・・・
>>231 プロフェッショナルな解答みせてくれよ
美しく、効率のいい解答を
>>224 いやだって、decode前のencodingが分かんないから。
分かってればuse openとかで変えられるわけで。
(もっともuse openはグローバルじゃないのが困りモノだけど)
んで、ファイル名に関してはencodingを指定できる場所がない、と。
filenameとかのプラグマを作ってreaddirを上書きすればいいんじゃね?
234 :
デフォルトの名無しさん :04/12/11 14:02:47
>>228 それは文字セット [ ] の使い方間違えてるだけだ
$reg = qr{ <TD> ((?!</TD>).)*? 使用上 .*? </TD> }isx;
$string =~ s/$reg//g;
正規表現、絞込みと再帰が使えたらなあ…
ひとつの正規表現ですまそうとせず s{<TD>.*?</TD>}{index($1,'使用上')? '': $1}g あたりでどうだろうか
ごめん、わかると思うけどeがぬけてら s{<TD>.*?</TD>}{index($1,'使用上')? '': $1}ge
238 :
デフォルトの名無しさん :04/12/11 15:24:41
<<229<<230<<234<<236 ありがとうございました。 <<231 参考に使用している本を教えてくださいな。 <<235 更に正規表現が難しくなるのか・・
>>238 レスアンカーくらいまともに打てないのかね?
>>237 それじゃ、だめなんだって。
で、俺はプロのコードを待ってるんだけどね。念のだめ234もチェックしてみたけど違った。
>>228 s{(<TD>(.(?!<TD>))*?使用上.*?</TD>)}{}sgi
これでどうかな?
今まで出てきたコードはどれも2バイトコードに 1バイトずれてマッチする問題の対策が入ってないな。 use utf8前提ならいいがそうでないなら厳密には まずそう。3文字もあるとそうめったに偶然マッチ することはないけどね(笑) たとえばEUCで1バイト ずれると「藩兢」が含まれるがこんな文字列は今 はじめてみたので実用上どの程度まずいかは疑問。 「使用上」の部分が固定文字列じゃなくてどっか からもらうならちゃんとしなくちゃだけどね。
>>237 カッコが抜けている
indexの見つからなかったときの戻り値は$[-1
s{(<TD>.*?</TD>)}{index($1,'使用上')>=0? '': $1}ge
>>244 $&使うといらないとこでもマッチ結果を保存するようになるから
あきらかにそこしか正規表現がないような使い捨てスクリプトじゃ
ない限りなるべく使わない。
うわ、 $`, $&, $' 使う奴ってホントにいるんだね。 ただのお遊びならかまわんが、仕事がらみじゃ即座にクビだぞ。
247 :
デフォルトの名無しさん :04/12/11 21:38:47
>>242 漏れはてっきり、タグ中の"使用中"も拾っちゃうとか、再帰的なタグが処理できないとか
そういう部分のこと言ってるんだとおもってたよ
プロののくせに、その今更な子供みたいな文句はなんだorz
…大丈夫だよ。ぼくちゃんが心配しなくても、みんな最初にどうにかしてるから
再帰的なタグをとかなんとかいうともはや正規表現お手軽 コースじゃつらいんじゃないかね。HTMLのパースしてくれる モジュール使ったほうがいいと思われ。
文字列から、カタカナ+漢字を抜き出そうとして @conbi = ( $line =~ /^${euc_char}*?($KATAKANAp{2,}$KANJI{2,})/og ); で、うまくいったのですが、後ろの文字をに制限しようとして、 @conbi = ( $line =~ /^${euc_char}*?($KATAKANAp{2,}$KANJI{2,})$back{1}/og ); ではうまくいかず、 @conbi = ( $line =~ /^${euc_char}*?($KATAKANAp{2,}$KANJI{2,})($back){1}/og ); ($back = 'が|の|を|に|へ|と|より|から|で';) としたら カタカナ+漢字 と $backのひらがな1文字が入ってしまいました。 [$back]{1}にしたら$backの内容に関係なくマッチしてしまいました。 1行で表現することは無理でしょうか? #$euc_charのぶぶんは「perlメモ」でeuc1文字にマッチする正規表現です。 $KATAKANApや$KANJIも「Perlメモ」の全角カタカナ、漢字にマッチするものです
$back ='(?: 〜 )'; としたらうまくいきましたorz スマソ...
漢字とかよくわからんけど 先読み (?= ... ) 使えばいいんじゃないか? / なんかマッチさせたい文字列 (?= 後ろの文字 ) /x
>>251 うおおお
すみません
ありがとうございますた・゚・(ノД`)・゚・
perlのデバッガにreadline使ったヒストリ機能欲しいな〜
Tk使って、getOpenFileやchooseDirectoryのウィンドウだけ出したいんですが、 MainWindowが余分に出ちゃいます。 MainWindowを出さずにすませるか、見えなくする方法ってないでしょうか?
>>254 MainWindowを作って隠す、という方法が手っ取り早いかな。
#!/usr/bin/env perl
use Tk;
my $mw = new MainWindow();
$mw->withdraw();
my $target = $mw->getOpenFile();
#以降不要なら$mw->destroy();
256 :
デフォルトの名無しさん :04/12/12 13:57:37
ある処理をして、その結果をクッキー出力してからHTML出力しなければなりません。 仕方がないので、HTML出力するものを文字列として$mojiに保存して、 クッキー出力後に、 print"$moji"; をしています。 結果としては正しい物が出力されるのですが、普通はこのようなやり方をするのでしょうか? また、この方法だとprintf出力ができません。 何かいい方法は無いでしょうか。
Term::ReadKey,Term::ReadLine の二つのパッケージを入れて $PERLDB_OPTS="ReadLine=t" perl -d -e foo.pl これでヒストリ機能が使えるようになりました。一応報告まで。
>>253 readline 先にインスコしてから Perl インスコすれば最初から使えるんじゃなかったっけ?
他のツールでもハマることが多いので、
漏れは OS インスコ後真っ先に入れるもののリストに readline を入れてる。
use strinct; use warnings; foreach my $bar (@list) { next if (-M $bar < 0); #★ print "$bar\n"; } と書くと、Use of uninitialized value in numeric lt (<) at ★の行 とワーニングが出まくるんですが、これは何が原因でしょう? @listにはあるディレクトリのファイルリストが入っています。 $barが初期化されてないって意味だと思うのですが、printできてるので ファイルリストは取得できています。Perlのバージョンは5.8.5です。 よろしくお願いします。
>>255 >MainWindowを作って隠す、という方法が手っ取り早いかな。
>my $target = $mw->getOpenFile();
>#以降不要なら$mw->destroy();
これだと、
my $target = $mw->getOpenFile();
の時点で、getOpenFileが終了するまで実行止まっちゃっちゃうので、
getOpenFileダイアログ出てる間はMainWindowも出てしまいます…
できれば、最初からgetOpenFileダイアログだけを出すようにしたいです。
>>255 とか思ってたら$mw->withdraw();が抜けてました。
これ入れたらいけました。有難うございます。
早とちりしてスミマセンorz
>getOpenFileが終了するまで実行止まっちゃっちゃうので、 止まらなきゃ困るだろ。 >getOpenFileダイアログ出てる間はMainWindowも出てしまいます… でねーよ
ぐふっ
>>260 その-Mってのはなんの目的で入ってるの?
>>260 たぶんカレントディレクトリがファイルリストつくったところとちがうので-Mがundef返してるんだろ。
ディレクトリ補ってフルパスにするか適切にchdirすれ
>>265 こう書くと更新日時がプロセス起動より新しいファイルを弾けるんじゃないですか?
>>266 やってみます
>>223 私はあえてcygwinで動かしたいのです。
変態だな さすがPerllスレ
270 :
デフォルトの名無しさん :04/12/13 08:14:24
Programming Perl 4thはいつでますか?5.10と一緒に発売ですか?
271 :
デフォルトの名無しさん :04/12/13 09:58:24
たまに、関数で hoge_func($) { hogehoge; } とか、 piyo_func($;$) { piyopiyo; } 関数名のあとの、($)とか($;$)ってどういう意味があるのですか?
>>272 いきなり Google の URL 示さなくても "Perl のプロトタイプだYO!" って言えばいいのに。
とりあえず
>>271 はラクダ本を買えってこった。
3巻組になったりしてね。
>>221 で紹介されてたとこ、閉鎖されてる?
ついこないだまでは繋がったのに、、、。
テキスト編集をするためにPerlを少しかじったのですが、面白くなってもっと知りたいと思いました。 今まではネットでPerlを紹介しているページで勉強していたのですが、本気で勉強しようと思ったら、 オライリーの本を買って勉強したほうがいいのでしょうか? 今ちょうど手元に『初めてのPerl』があるのですが、最初のスカラーデータから読み直したほうがいいですか? オライリーのPerl本は色々あるんですね。 初めてのPerl (続) Perlクックブック プログラミングPerl 色々ありますが、どのような順番で勉強していけばキチンと身につけられますか? それともオライリー以外のほかの書籍で『これは読んどけ』って言うのがあったら教えてください。
やりたいことがあったらその都度 プログラミングPerlで勉強していくのが一番いいと思うよ。
>>277 初めてのPerlは頭から熟読するべし
その次に読むとしたら 続・初めての かな
クックブックは、まだ要らないと思う
プログラミングPerlは、金が余ってるなら買ってもいいけど
お布施みたいなもんだから、金が無いなら買わなくていい
オライリー以外なら、EffectivePerlあたりがコストパフォーマンスが良くてオススメ
初めてのPerl読み終わったら買うといい。
電子メールのFrom:ヘッダから、メールアドレスと表示名を取り出したいんですが、
スマートな正規表現があったら教えていただけませんでしょうか。
想定するFrom:ヘッダとしては
(1) aiueo <
[email protected] >
(2)
[email protected] (3)
[email protected] (aiueo)
くらいでよいと思うのですが。("aiueo"が表示名のつもりです)
とりあえず(1)からアドレスと取り出す方法として
if ($from =~ /<(.+@.+)>/)
{
print "$1\n";
}
というのを作ったんですが、他の形式にも対応させようとして、いろいろやったんですけど
うまくいきませんでした。(初心者で申し訳ありません)
Perl/Tk を Cygwin で動かす問題について、いくつかやってみた結果を曝します。 まずはふつうにパッケージを解凍して、 $perl Makefile.PL $make すると、pTkサブディレクトリで氏ぬから、pTk/Makefile の DEFINE = に -DWINUSERAPI="" を追加して pTk サブディレクトリについて make を続行する。 つぎに、 pTk/mTk/xlib/X11/Xlib.h の 1206 行を #include <pTk/tkIntXlibDecls_f.h> に変更してから Xlib サブディレクトリを make する。 Event/tclPlatEvent.c の1行目の下に #include <sys/time.h> を挿入する。 Event/tclPlatNotfy.c の33行目の下に #include <pTk/mTk/unix/tkUnixPort.h> を挿入する。 pTk/mTk/unix/tkUnixPort.hを l.42 #include <pTk/compat/limits.h> l.62 #include <pTk/Lang.h> l.89 #include <pTk/compat/unistd.h> に変更する。 そのうえで Event/ サブディレクトリを make する。 JPEG/ サブディレクトリに移る。 makeするとJPEG.cのコンパイルで氏ぬので make JPEG.i で JPEG.iを生成してから typedef struct HWND__{int i;}*void *; を typedef struct HWND__{int i;}*HWND; になおす。変更したJPEG.iを手でコンパイルしたらmakeを続行する。 PNG/ サブディレクトリも同様の手順でmakeする。 こまったのは Canvas, Entry, ListBox, Menubutton, Scale, Text の各ディレクトリのmakeである。 こいつらをmakeしようとするとlinkの段階で氏ぬ。 ぉιぇτ、工□い人
>>280 きちんとやるなら素直に Mail::Header つかうのが吉。
Mail::Header、自分のPCに入っていたんで、perldocでマニュアル見てみたんですけど、 あまりよく分かりませんでした。 getメソッドが使えるのかな。 Fromヘッダの内容は、変数に入れてあるんですけど、 new Mail::Headerには、標準入力か、ファイルディスクリプタ?しか 渡せないんですかね。(ファイルからの入力しかできない?) すこし試してみます。。
284 :
デフォルトの名無しさん :04/12/13 19:46:43
>>277 >>279 意外と、『クックブック』は早めに手に入れておいた方がいいと思うな。
というのも、『初めて』『続・初めて』と進んできて、
一番問題になるのは、リファレンスとオブジェクトの理解だと思うんだわ。
特に、『続・初めて』だけだと、オブジェクト指向のあたりは、
理解は難しいと思う。
自分の場合、
『続・初めて』で分からないとき、同じ項目を『クックブック』で引いてみると、
ああ、なるほどと分かることが多かった。
基礎部分は、『初めて』『続・初めて』『クックブック』だけでいいと思う。
あとは、なにをするかによって、専門分野のを選ばないと。
CGI なのか DBI なのか、それ以外のなにかなのか…
>>283 ごめん、おもいっきり誤読してた。
Email::Address がそれっぽい。
プログラミングPerlとEffective Perl持ってない奴は偽者
>>285 さん
できました!ありがとうございます。
<code>
use Mail::Address;
my @addrs = Mail::Address->parse($from);
foreach my $addr (@addrs)
{
print $addr->address,"\n";
print $addr->comment,"\n";
print $addr->name,"\n";
}
</code>
偽者だからなんやねん
質問に答えてくださった皆さん、どうもありがとうございます。 とりあえず、 @初めてのPerl ↓ A続・初めてのPerl (⇔プログラミングPerl⇔クックブック ⇔ EffectivePerl) ↓ BプログラミングPerl ⇔ クックブック ⇔ EffectivePerl というような順番で読んでいけばいいのでしょうか。 ここまでがDBIとか専門分野に進んでいく『一般教養』と考えていいのですか? 大学の授業に例えるならこんな感じかな、と思ったのですが・・・。
あのさ、 プログラミング言語なんてのは使ってなんぼのもんなので 覚えるためのもんじゃないんで、 どこまで覚えりゃいいなんてものはないし 覚えると誉めてくれる人なんていないわけ。 いいたかないが、かまって君なら板違い。 仮眠前に覗くんじゃなかったわ。
DA----YO----NE--------------!!!!!!!
>>290 もまえもその程度の事でストレス溜めてどうするよ
どうせネタなんだからスルーしる
本なんか無くてもネット上に転がっている情報だけで 十分すぎると思うんだが…
294 :
デフォルトの名無しさん :04/12/14 11:23:34
>テキスト編集をするためにPerlを少しかじったのですが、面白くなってもっと知りたいと思いました。 >今まではネットでPerlを紹介しているページで勉強していたのですが、本気で勉強しようと思ったら、 >オライリーの本を買って勉強したほうがいいのでしょうか? >今ちょうど手元に『初めてのPerl』があるのですが、最初のスカラーデータから読み直したほうがいいですか? みんな親切だね
とりあえず「初めてのPerl」読め、次の話はそれからだ。
>>293-294 中途半端で間違った知識付けて、下らない質問されるよりは
真っ当な道教えておいた方がいいだろ
真っ当な道って・・・
297 :
デフォルトの名無しさん :04/12/14 12:06:15
私が思うに、 初めてのPerl 続・初めてのPerl クックブック くらいまでが、一般教養。 (ここまでやって、ようやく構造化とか、リファレンスとか、 オブジェクトの触りくらいまでは、分かるようになる) DBIやらなにやらの専門分野はそのあと。 プログラミングperl なんかも、ここらあたりになると 持っているべきと思う。 (ここまで来ないと、理解できる本じゃない) perlのいいところは、すべて知らなくても、 それなりに使えるというとこ。 ただ、きちんと学べば、もっと楽しく使えるよ。
>>297 そこら辺りまで行くと、ラクダ本じゃなく perldocで十分じゃないか?
301 :
デフォルトの名無しさん :04/12/14 12:40:58
>>300 こいつ、バカ?
オライリーがこんなとこで宣伝するかよ!
ティムが降臨するスレ
kent読んでおかしい所判るようになりゃいいんでねの?
304 :
デフォルトの名無しさん :04/12/14 15:56:38
>>303 kentのサイトは、ちらとしか見たことないが…。
いや、だからね、perlのいいところは、そこそこしか知らんでも、
とりあえずなんとかなるというとこ。
リファレンス使えない奴はダメだ、とかいい始めると、
それはいかにも perl らしくない。
だけど、そういうことを知ってると、それはそれで、
とってもいいこといっぱいあるよ、ということ。
どこまで必要かは、自分で考えりゃいい。
オブジェクトのパッケージ名が標準モジュールのパッケージ名と かぶらないようにするには、どういう規則で名前を付ければいいでしょうか?
ぐぐってたらperlccっていうのがあるって書いてあって使ってみようと思ったんですが 色々見て回りましたがうまくいきません。 詳しく書いてあるサイトなど、何か情報はありませんか?
gcc使ったことがあるなら普通に分りそうなもんだけど。
電子メールのDate:ヘッダから、年月日、時分秒を取り出す スマートな正規表現か 便利なモジュール等ありましたら 教えていただけませんでしょうか。 想定しているヘッダの書式は以下のような感じです。 Date: Sun, 02 Nov 2003 06:07:00 Date: Sun, 02 Nov 2003 06:07:00 GMT Date: Sun, 02 Nov 2003 06:07:00 +0900 Date: Sun, 02 Nov 2003 07:07:00 +0900 (JST) RFCの規定では、 曜日と秒は省略可、日にちは1桁でも可 だそうです。 秒が省略されたときは、無条件で0でいいと思っています。
Mail::Header
>>305 CPAN等で公開しないんなら、アンダースコア(_)で始めればいいんじゃね?
>>308 >>309 Mail::Headerだと丸ごと文字列として取り出すだけなんじゃ...
中身を解釈したければ、Mail::Fieldじゃねーの?
use Mail::Field;
$date_string = 'Date: Sun, 02 Nov 2003 07:07:00 +0900 (JST)';
$date_field = Mail::Field->new('date', $date_string);
$t = $date_field->time; # unix time
みたいな感じで。unix timeになったらあとはlocaltimeなり
strftimeなり自由に使えるはず。中身ちらっとみたらdate
文字列の解釈はDate::Parse呼んでるだけだったけどな。
>>311 なるほど。それは盲点でした。
ありがとうございます。
>>312 さん
ありがとうございます。マジ助かります。
315 :
デフォルトの名無しさん :04/12/14 22:00:50
ハッシュってなんでいろんな表記方法があるんですか? $hash->{'abc'} $hash{'abc'} $hash{"abc"} ↑の違いは何かあるんですかねぇ・・・ 統一してほしいんですが・・・
haxa?
違いはあるよ
318 :
デフォルトの名無しさん :04/12/14 22:11:09
>>315 $hash->{...}と$hash{...}が同じだと思ってる段階でアウト。
perlの基本を勉強して出直して来い。
%hash = (a=>1);
$hash = {a=>2};
print "(1) $hash{'a'}\n";
print "(2) $hash->{'a'}\n";
320 :
デフォルトの名無しさん :04/12/14 22:21:59
>>318 少なくとも、
$hash->{'abc'}
$hash{'abc'}
では、意味がぜんぜん違う。
前のは、リファレンスをデリファレンスする、
あるいは、メソッドの呼び出し ということになる。
321 :
デフォルトの名無しさん :04/12/14 22:32:50
それにしても腐った文法だな
323 :
デフォルトの名無しさん :04/12/14 23:25:57
>>322 人格くさった奴は、rubyスレに帰れや。
松本に、いい性格をオブジェクト指向で生み出してもらうように
してもらえ。
それとも、perlでアタマをハッシュしてやろうか?
324 :
デフォルトの名無しさん :04/12/14 23:34:18
>>322 うんとか、すんとか、なんか抜かせよ、ヴォケ。
んじゃ、ruby と クソ をbless してやるな。
メソッド、ケツ拭け!
${hash}{abc}
326 :
デフォルトの名無しさん :04/12/15 00:10:33
>>325 だから、そういうときは、 -> 使えって。
そして矢印を、デリファレンス とでも頭の中で読めばいい。
(メソッドの場合もある)
何々 => ○○ は、
何々 の値 ○○ とでも読めばいい。
[ ] が、やや唐突に出てきたら、
無名配列のリファレンスとでも、頭の中で読めばいいんだし、
{ } が、やや唐突に出てきたら、
無名ハッシュのリファレンスとでも、頭の中で読めばいいんだけだ。
ランダル・シュワルツの本とかを読んでも、
向うでもみんなそうしてるように書いてあるぞ。
記号に、意味を表す読みを与えれば、なにも難しくない。
$hash{'abc'} $hash{"abc"} この二つを並べている事に関しては 文字列の基本をやり直せと言って置こうか
$hash{'$abc'} $hash{"$abc"} だと結果が異なるし
どちらにせよ滅多に使わないので
間違えてすごい古いのに回答した..(笑) 恥ずかしいので見なかったことにしてくれよ。
何番へのレスだったのか一瞬考えてしまったじゃないか
ある変数を読み出し専用にしたいのですがtie使わないと無理でしょうか? my $hoge = 1; nochange $hoge; $hoge = 2 → エラー みたいな感じです。
*foo = \('string'); とかでいけないっけ?
>>335 globつかうからmyで宣言した変数には使えないと思われ。
皆さんありがとうございます。 結局Readonlyという物を利用する事にしました。 Scalar::Readonlyと比較すると + pure perl + array,hashにも使える + 変数に格納したリファレンスの変更も監視出来る - パフォーマンスが劣る - readonlyのon、offが出来ない のような感じです。 中身見てみるとtieしてstoreをごにょごにょしてるだけですた。
非公式な機能ではあるが、5.8.0からはSvREADONLYフラグをいじる関数が追加されているよ。 Internals::SvREADONLY($var, 1); # $varをREADONLYにする。
Perl/Tk を Cygwin で動かす問題の続き。 $ perl Makefile.PL でやるのはあきらめた。 $ perl Makefile.PL x だとうまく逝きそう。 make の前に $ ln -s ./pTk/tkUnixDefault.h ./pTk/tkWinDefault.h $ ln -s ./pTk/tkWinDefault.h tkWinDefault.h する。 (これをやらないと、一部のcファイルが存在しない tkWinDefault.h を読もうとして氏ぬ) $ make 最後の最後で tk.dll のリンクが失敗するので -L/usr/X11/lib -lX11 のオプションを付けて手動でtk.dllをリンクするとうまく逝く。 後は万事よし。 このあたり、Makefile.PLとかで解決できないですか?
名前がキモ杉
結城浩?
343 :
デフォルトの名無しさん :04/12/16 00:26:02
$hash->{"abc"} = 10 と $hash{"abc"} = 10 とする場合の、 それぞれのメリットと デリメットについて教えていただけないでしょうか?
何も無い 何も無い 何も無い
>>343 代入すること自体に両者のメリット、デメリットの差はまずないけど
($hash->{}はデリファレンスのコストがほーーんのちょっとかかるといえばかかるが)
沢山中身を詰めたハッシュをサブルーチンに渡す/返すときなんかはスピードに差が出ます。
ハッシュじゃなくても、普通のスカラーに1MBのテキストファイル入れて
参照渡しにするかコピー渡しにするか試してみると、かなり差が出るよ。
346 :
デフォルトの名無しさん :04/12/16 04:53:21
普通、リファレンスは、 配列やハッシュやサブルーチンを入れるもんだと 思うよ。それで、配列の配列や、配列のハッシュ、 ハッシュのハッシュ、ハッシュのサブルーチン とか作るんだよ。 メリットはいっぱいあって、簡単に書けないほど。 一例をあげれば、トリガーとなるキーワードを ハッシュのキーとし、値の方にサブルーチンのリファレンスを 入れておけば、ケースによって振る舞いを変えられる。 Aというケースなら、これこれになになにするが、 Bというケースなら、しかじかになになにする。 しかし、Cというケースなら、こうでなくちゃならないし、 でも、Dというケースなら、なにもしちゃいけないし、 というようなとき。 AはサブルーチンAAを、BにはサブルーチンBBを、 CにはサブルーチンCCを…。 いちいちメリットを書いていったら、きりがない。
347 :
デフォルトの名無しさん :04/12/16 10:27:41
だっせー
$a{08}="aaa"; Illegal octal digit at - line 1, at end of line $a{09}="aaa"; Illegal octal digit at - line 1, at end of line $a{07}="aaa"; 普通に通る $a{10}="aaa"; 普通に通る どうも08と09に限ってエラーが出るんですけど、なんででしょうか?
このていどの英語もよめないのか。
>>348 >Illegal octal digit at - line 1, at end of line
英語が読めませんか?
$a{0xg}="aaa"; これはなんでエラーになるんでしょうかね? perlにおいて0から始まるリテラルは8進数とみなされます。 ラクダ本のリテラルの項目をよく読んでみてください。
すまん、まさかハッシュ名が8進数として認識されてるなんて思わなかった。
>>353 すいません、今調べて判りました。
みなさんホントにごめんなさい。
>>355 あんたに限った話じゃないが、中学生英語程度のメッセージなのに何で読もうとしないんだい?
ていうかperldiag(1)で調べろよ。日本語訳もあるんだしさ。
>>356 英語ってだけで拒否反応おこしてんだろう。
>>358 んなこと言ったら、コンピュータ言語自体に拒否反応でちゃうと思うんだが。
つーか、一般的にこういう人はかなりの割合でいるんだろうか?
それとも、特異な人だけが、掲示板やMLでこの手の質問するんで目立つんだろうか?
前者だとしたら、メッセージを日本語にするいいかげんなパッチでも作ったら
需要あんのかな?とか
>>359 出力メッセージのエンコーディングやらロケールやらで、
混乱する要素がひとつ増えるだけの悪寒。
361 :
デフォルトの名無しさん :04/12/16 14:32:47
CGIから正規表現を受け取ってマッチに与えたいのですが、 セキュリティ上何に気をつけたらいいですか? とりあえず、taintモードで、use re 'eval'は宣言してません。
362 :
デフォルトの名無しさん :04/12/16 14:51:30
ありゃ、スレ違いっすか・・スマソ
>Illegal octal digit at - line 1, at end of line 少なくとも中学では習わん
こんなところにもゆとり教育の弊害が!
>>363 文法は中学レベルだろ。
中学で辞書の引き方を習わなかった、とかなら仕方ないが。
エラーメッセージなんて見当違いのことのが多いし あてにならん情報読むために四苦八苦するなんて面倒だろう。 このメッセージの場合、行末がどうとか書いてあるっぽくてでも行末はちゃんとしてるから その地点で読むのやめる。 百歩譲って読んでみたとして、octalがわからないし、8進数も知らないから Illegal digit at - line1, at end of line となって、違法数字atがline1,行末だといわれても何のことやらわからんのですよ
>>366 こじつけもいいとこ(´д`;)何で前から読まないんだ
まあ八進数知らなきゃわけわからんだろうけど。 エラーメッセージ当てにならないってことはないし、 人に聞くくらいならあるだけの情報は吟味しとかないと。 何度もミスってればそのうちメッセージしっかり読まなくても その字づらだけでどういうバグか程度は分かるようになるから。 むくれずガンガレ。
質問です。 出力先を画面とファイルと同時に出力させることは出来ますか? 例: $logfile = './log/log.txt'; $log='レポート結果'; open(LOG,'>> ' . $logfile); print LOG $log; #ファイルに出力 close(LOG); print $log; #画面に出力 みたいに二回同じ物をprintせずに一度で済む方法はありますでしょうか?
tee 使え
372 :
デフォルトの名無しさん :04/12/16 21:57:12
BASIC全盛期のガキの頃は、俺も、エラーメッセージってのは意味で理解しなくて、経験で覚えたな…。 |run |Illegal Function Call in line 40 |OK |■ |list 40 :
8進数ネタはもういいよ。8進数も理解できない奴は池沼、 それを喜んで叩いてるやつも池沼。くだらんからスルーしろ。
厨房の英語レベルの俺が翻訳します >Illegal octal digit at - line 1, at end of line Illegal llegal(合法な)の否定形 非合法な octal 八角形の digit 数字 at -line1 1行目で at end of line 行の最後で 総合的に訳すrと 1行目の最後に不正な八進数があります か?
そこでまた古い話をぶり返すんだよな。 0 は 8 進 数 な ん で す か?
>>377 Perlでは0が頭にあれば8進数として認識するんだが?
だからこの問題が起きてる。
ついてきてない奴はだまっとけ
Perl-Tkはどうしたの?結城浩くん。
>>380 いくらなんでも結城浩に失礼だからやめれ
自分のマシンのApacheではちゃんと動くCGIプログラムが ISWEBのサーバー500エラーを返します Perlのパスや設定はきちんと合わせたんですが何故でしょうか?
CGIはWebProg板で聞けって事がわかってないから。
ナイス
サブルーチンの返り値として配列とハッシュを返すようにしたいのですが、どのようにすればいいですか?
386 :
デフォルトの名無しさん :04/12/17 19:34:42
func(\@array_real, \%hash_real); sub func{ my ($array,$hash) = @_; $array->[foo] = ... ; $hash->{bar} = ... ; } とかしてリファレンス使ったら?
そりゃ返り値じゃなくて引数じゃないっすか?
アホすぎ
sub foo { return \%hash, \@array; } じゃ駄目なの?
rand関数は、数字しかランダムにできないようエスが、 5つの英文字をランダムに表示することは、できないのでしょうか。
配列でも使うよろし。
393 :
デフォルトの名無しさん :04/12/18 11:15:38
質問します あるファイルの入出力で、レコードフォーマットがよくかわるので そのたびに、プログラム修正が大変です。他の言語ならば、入出力はマクロ化などをしますが perlの場合は、全てのレコードを読んで独自の判断をする場合がほとんどなので、マクロ化 がしにくいです。例えば下記のようなロジックが数十箇所にあるとすると、splitで分ける文が レコードフォーマットが変わるたびに全てへんこうになって大変です。 このようなばあい、どのようにして共通化するのでしょうか?、 foreach $num (0 .. $#STOCK) { $line = $line2 = $STOCK[$num]; &jcode'convert(\$line,'euc'); ($DATE,$ID,$BID,$NAME,$EMAIL,$PREF,$SEX,$AGE,$PASS,$COM,$LNGCOM,$BLD,$JOB,$HEIT,$STR,$ACC_MODE_TMP,$PLZX,$BSID) = split(/<>/,$line);
394 :
デフォルトの名無しさん :04/12/18 11:25:21
PERLで書いてあるHTML2LATEXっていう コードがあるのだけど これWindows上でもまともに動きますか? あと図面や文献環境などややこしいのは全部 スキップしてくれても良いので、簡単な コードありませんか?
>>393 行の書式がちがっても各要素の書式さえ同じなら正規表現ですんなり行くが、そういうわけでもないのか?
>>395 そのとおりです、書式さえあえば動きます
しかし、共通化できれば一箇所の修正でいいのですが、
数十箇所も毎回修正するので大変なんです
いやいや、<>に挟まれた各要素がどのように記述されているか。 たとえば$DATEの部分が 20041218とか12月18日とかが混じってるようならダメだけど、 そうでないなら、($DATE,$ID ...が($ID,$DATE ...みたいな順になっていても 各要素を正規表現で取り出せるんじゃないか?という話。 ちがうならもっと偉い人の降臨待て。
>>393 いや、Perlでも入出力をモジュールにすればいいだろ?
なんで他言語で出来てPerlで出来ないと思うんだろ。
サンプルをみる限り、Perlをまともに知らないだけか……。
foreachで$#とか使ってるし、
いまさらjcode.pl使ってるみたいだし。
>>391 # $randWord =randWord($length[,@cara]);
sub randWord($;@){
my$l =abs(int(shift));
return unless$l;
my@c =( @_ ? @_ : 'a'..'z','A'..'Z',0..9 );
join('', map{ $c[int(rand($#c)+0.5)] }1..$l );
}
print randWord(5), "\n";
>>397 要素が増えたりするので修正がかかるんですー
正規表現で取り出すって意味が、厨房でわかりますえん すまそ
>>398 モジュール化は簡単にできるけど、
どのレコードを読み込むか?(キーの要素が毎回変わる 条件も複数)
このレコードを読み込んだらループを抜ける
上記のように、DBのようにキーが固定されているわけでもなく、
検索条件も a=b && c ne d 等と毎回変わるので 共通モジュール化は
できないと思ってます
じゃあなんで他言語でできるの? 同じことすればいいでしょ。
スカラー変数に展開しないでハッシュ変数に入れればいいんじゃねーの? そしたらレコードフォーマットが変わってもその後の処理に問題ないっしょ。
中途半端にJAVAはかじりましたが、て感じか。 <>で区切ってあるだけまだましなんだが。
>>391 my @char = ('a'..'z');
print $char[ rand @char ];
>>393 my @field = qw(DATE ID BID NAME EMAIL);
for my $line (@STOCK) {
my %field;
@field{@field} = split /<>/, $line;
...
>>405 @field{@field} なんてできるんだ!
special thanks ko!
encodingが使いにくすぎる。 readdirも、関数への引数も、コマンドラインの引数すらも、標準入力扱いじゃないから自動変換してくれない open(IN,"ファイル")じゃ動かなくて、open(IN,encoding("shiftjis","ファイル名"))。 print shift; もだめ。あほか。 jcode.plで正規表現使うときだけ変換して騙し騙し動いてたのが、 encodingにしてからコード中encode,decodeだらけになっちまった どうすりゃいいんだ
未だに encoding なんか使ってるのお前だけだよ(ガハハ
use encoding "shiftjis"; じゃだめなのか?
>>407 まったくその通りだよな。
5.8 で use encoding の1行を入れればJperl と同様に動く、
なんてウソッパチもいいところだ。
オレ、いまだに昔のJperl が手放せないよ。
>>410 時代に取り残されてますね。
可哀相に・・・
しょぼいな
>>408-411 おまいら、信じてないだろ…つかencoding使ったこと自体ないだろ?
宣伝文句聞きかじった知識だけでバカにしやがって畜生くそ(略
実験.pl
use encoding "shiftjis";
print shift;
open(IN,"実験.pl") or die;
これだけだ
>実験.pl あいうえお
encoding付けたのと外したので、試してみろよ
日本語のファイル名なんて使うなよ…… とか思わなくもないケド、 openのラッパ書けばいいじゃん。>encodeだらけ なんで書かないの?
415 :
デフォルトの名無しさん :04/12/18 20:16:45
>>413 encoding付けたのと外したので、試してみろよ
これで試してみるとさ、
use encoding "shiftjis";
の時は、確かに
Died at 実験.pl line 3.
"\x{0082}" does not map to shiftjis.
"\x{00a0}" does not map to shiftjis.
"\x{0082}" does not map to shiftjis.
"\x{0082}" does not map to shiftjis.
"\x{00a4}" does not map to shiftjis.
"\x{0082}" does not map to shiftjis.
"\x{00a6}" does not map to shiftjis.
"\x{0082}" does not map to shiftjis.
\x{0082}\x{00a0}\x{0082}¢\x{0082}\x{00a4}\x{0082}\x{00a6}\x{0082}¨
となるけど、
use encoding "shiftjis";
の一行を取り去ってやってみると、正常に動作するよ。
これじゃ、ダメなの?
>>415 話が理解できてないなら首突っ込まなければいいのに・・・
417 :
デフォルトの名無しさん :04/12/18 20:42:24
>>416 いやいや、その通りなんだが、
やっぱり話がまったく見えない、のも気持ち悪いだろ。
で、いったい何が問題なの?
413 においてさ、要は、引数の あいうえお がプリント文で、
出ればいいんじゃないの?
うちでは、use encoding "shiftjis"; の一行を取り除いたら、
あいうえお 出ましたという話で…。
そういう話じゃないの? 誰か分かるように説明してん。
418 :
デフォルトの名無しさん :04/12/18 20:59:29
$a=1 require './config.cgi'; としてて、config.cgi の中で$a を参照するのですが、参照できないみたいです どうやって値を引き継げばよいでしょうか?
$'a
>>413 ほー。そうかい、そうかい。キミのパソコンではUTF-8 で「実験.pl」
という名前のファイルを作れるわけだな。それじゃ、そのUTF-8 の
「実験.pl」の中身を出力してごらんよ。当然、これでできるはずだよな。
use encoding "shiftjis";
print shift;
open(IN,"実験.pl") or die;
while(<IN>){
print;
}
close(IN);
うーん。 とりあえず小飼弾の赤いPerl本でも読んだほうがいいと思うよ。
422 :
デフォルトの名無しさん :04/12/18 21:51:05
>>420 あのー、413へのコメントとなってるけど、
もしかして僕へなの? (それとも、自意識過剰???)
僕へだったら、うちのはシフトjisだよ。サクラエディタで確認した。
やってみたけど、
ウチでは、実験.plの中に use encoding "shiftjis";
があると、3行目でこける。
それがないやつは、なにも出力されない。
勘違いしないでほしいけど、僕は別にケンカを売ってるわけじゃないよ。
よく分からないままに言わせてもらえば、君が考えてるより、
perlはもっと早い段階でutfに変換してると思う。
423 :
422 :04/12/18 21:52:16
ああ、ごめん、422は415、417でもあります。
>>420 だから動かんっていってるだろ。試してみろっていったのに試さずにしかも間違ってる反論すな
ひょっとして、use open ":encoding(..)"とか,use open ":std"しとけ!!っていいたいのか?
そしたら413のコードも何もかもうまくいくとおもってるのか。あさはかな。
jencodingを使って後ろ向きに解決。
かわいそうに
今時Jperlて。
429 :
422, :04/12/19 01:59:32
で、結局、 use encoding "shiftjis"; 結論としてどうなるわけ? 誰か、まとめてよ。 僕が思うに、 一部の人が言う use encoding "shiftjis"; の問題は、確かに確認できるけど、 perl5.8がutf-8で内部的に統一して扱っているなら、 実際問題、なにも問題ないと思うんだけど。 perlは、読み込んだ時点もすでにすべてutf-8に変換してる。 それじゃまずいケースって、具体的にどんなとき?
もういいだろがキモイって。 >perl5.8がutf-8で内部的に統一して扱っているなら、 >実際問題、なにも問題ないと思うんだけど。 そう思ってりゃいいよ。
encodingもtclみたいに使いやすくなればいいのに
432 :
422 :04/12/19 10:38:11
>>430 また、投げやりなんだなぁ。
実際には、perl5.8がutf-8で内部的に統一して扱っていないって、
いうこと???
しかし、簡単に試す限り、utf-8で内部的に統一して扱っていると思えるけどなぁ。
それに、もしutf-8で内部的に統一して扱っていること自体が問題というなら、
ことはperlのみならず、たとえばjavaやら他言語も含めた大問題となる。
あー、わけわか。まあ、どうでもいいという結論で。
>>432 perlは文字列をutf-8と み な す だけで、変換もなんにもしてくれません
そんでencodingとか色々オプションをくっつけて、
いろんな文字コードをutf-8っぽい内部形式に、正しく変換して読み込むように設定してるわけだが。
それが使いにくいって話。穴が山ほどあって、変換前の文字列が入ってくる機会が多いから困ってる。
結局utf8使わないのがいちばん楽なような気がする(笑)
すいません imagemagickの使い方 日本語で説明してるページとかありませんか
>>433 穴があるというがutf8でスクリプト組めばええ話でねーのか?
eucでスクリプト組むのと同じ感覚で使ってるし、苦労したことないな。
>>436 池沼なエディタつかってるんだよ、たぶん。
ありますた。
だれにですか
↓
俺
444 :
デフォルトの名無しさん :04/12/19 16:35:36
ラクダ本に書かれている内容は、perldocに全て載っているんでしょうか? ラクダ本は読みすぎてぼろくなってきたので、そろそろ捨てようかなと思ってます。
447 :
& ◆QWv3R1XL8M :04/12/19 17:59:33
Perlの静的解析ツール知りませんか?
>>432 >ことはperlのみならず、たとえばjavaやら他言語も含めた大問題となる。
そのとおりだが。特にjavaやってる人は誰でも文字コードに振り回された経験があるだろう。
あ、俺が言ってるのはUnicodeと他の文字コードのマッピングの話ね。
>>447 Perlを厳密に静的解析することはできない。
動的に解析しないと "a << b"という一文さえ、左シフト演算子なのかヒアドキュメントなのかわからないからだ。
なんで型付けするのを作者は嫌がってるんだろう?
453 :
デフォルトの名無しさん :04/12/20 00:05:17
>>452 なんで型づけせにゃならんのだよ。
そんなもんは、本来機械の側がやるべきことを、
人間にやらせてるだけだろ。
俺の友達は、Cの型を覚えるだけで
一生を終えてしまったぞ。
unit testさえしっかりやってりゃ型なんかいらんかも、という気はする。
よく知らないけど、 アセンブラとかマシン語には型はあるの?
>>455 MASMでは型と言えるかは知らんが、レジスタとかで区別があるものもある。
>>456 ほう。とすると別にハードウェア的にはlongとかunsigned charとかを
理解しているわけではなくて、コンパイラが勝手に作ったルールみたいな
ものなわけですか?
なんで型付けされないのをコーダーは嫌がってるんだろう?
459 :
デフォルトの名無しさん :04/12/20 01:00:27
>>457 それより君は、型がないと何か困ることでもあるの???
>>459 ないよ。私も型いらない派です。
(455 = 457 != 452)
それより、ハッシュの要素を自動生成された場合に アラートかなんか出すオプションが欲しいなと思うことはときどきあるね。 まあ、クラス化すれば勝手に変なもん突っ込むことはないんだろうけれど。
462 :
デフォルトの名無しさん :04/12/20 02:55:44
型づけじゃないけど、perlで型づけに近いものと言えば、 -w の警告モードと、use strict っていうことになるのかな。 (みんな、せめて -w は使おう!) それで十分っていうか、Cの型はやりすぎなんじゃないの? Pythonなんかでも、インデント変えただけでプログラムが 動かなくなるとか聞くが、それもちょっとなぁ。
なんですかこの変な流れは・・・
読み出すときだけ別の型に変換してくれりゃいい。何でも書き込める必要なんてあるか? 間違えて変なもの入れちゃうほうがずっといや 結局ユーザは型を意識してプログラミングしなきゃいけないのに、 コードのどこにも型が書いてないからかえって管理しにくい
Perlが可読性を損なうくらいまで省略に拘るのは -eオプションでさくっと処理を多用するおいらみたいなユーザーを 未だ見捨てる気がないからだべさ。 前もあったが、言語仕様を用途を抜きで語るのは不毛。 PHPがタグだらけで不格好だと騒ぐようなもんだ。 オブジェクト指向マンセーならRubyでも使ってれ。
use strictは使ってるけど-w使うといっぱい警告でちまう。 超A型君は更にTaintモードも併用してるんだろうか。
>>466 Taintモードはstrictやwarningsとは全く意味が違う。
Taintモードが有益なのは「環境変数や引数などに信頼できないデータが含まれている可能性があるとき」だよ。
因みに老婆心ながらwarningsモードも慣れれば非常に有益。
個人的には、コーディングスタイルを変えてでも警告ゼロを目指すね。
どうしても譲れない時はno warningsを使うし。
468 :
デフォルトの名無しさん :04/12/20 10:59:04
モジュールが使用できるかどうかを内部でテストし、そのモジュールが使用できればそのモジュールで実行。 そのモジュールが使用できない場合は別のモジュールをテストし……というプログラムを作りたいのですが、 それは可能でしょうか? できるならばどのような方法がありますでしょうか? やりたい事は、Encode.pm > NKF.pm > Jcode.pm の優先順位で使用できるモジュールで日本語変換をしたいのです。
「使用できるかどうか」っていうのが微妙な表現になってるような 気がするけど、 「Encode.pmがあるかどうか」でいいなら、 @INCの中身を順に調べていけばいいんじゃない。 ファイルがあっても使えないっていうケースがあるのかどうかしらんけど。
evalで調べてるが、もっといい方法あったら俺も知りたい。
>>469 あぁ、ごめんなさい。
あるかどうかで充分です。
なるほど、そういう方法がありますね。
>>470 どのようにevalを使用しておりますか?
いろいろ試行錯誤しているのですが、上手くいかないです orz
あぁ、すみません何とか形になりました。 eval 'use Encode';した後に$@に何か入っていれば次にeval 'use NKF';とやって、 $@が空であれば、そのモジュールで処理すれば良いのですね。 とりあえずこれでやってみます。 ありがとうございました。
use Attributeの my $date : INTEGER(1..31) の範囲制限できるところとかは便利そうだと思う。 使ったことないけど。
(use Encode) or (use NKF) or (use Jcode);
あちゃー、それでよかったんすね。馬鹿だ折れ ごっつあんです。
"use" not allowed in expression at - line 1, at end of line syntax error at - line 1, near "(use Encode" "use" not allowed in expression at - line 1, at end of line "use" not allowed in expression at - line 1, at end of line Execution of - aborted due to compilation errors.
useはBEGIN内にあるのと同じ扱いなので、、 eval { use ... } もうまくいかないんだよね。 文字列引数で eval 'use ...'にしないと。 ただしこの場合、実行順序がuseを裸で書いた 場合と異なるので、importされる関数や定数を 呼ぶときにカッコの省略ができなくなったり 結構不便です。(コンパイル時に間に合わなく なるから) たとえば use Fcntl qw(:flock); print LOCK_EX; と eval 'use Fcntl qw(:flock);'; print LOCK_EX; は結果が違います。LOCK_EX()と書いてやればいいといえばいい のですが、定数にカッコつけるのはみっともない。 BEGIN { eval { require Fcntl; }; if ($@) { エラー処理 } else { import Fcntl qw(:flock); } } とかするのがいいかも?
考えすぎだな。eval 'use ...'をBEGINのなかでやりゃいいか。 BEGIN { eval 'use Encode;'; if ($@) { eval 'use NKF;'; if ($@) { eval 'use Jcode;'; if ($@) { die } } } }
自分自身のファイル名を取得するにはどうしたらいいですか? あと、文字列の中から特定の文字数だけ取得するのは どうすればいいですか?(substringみたいな関数)
>>479 > 自分自身のファイル名を…
>>480 の通りなのだが、$0だとパスまで引いてしまう。
パスを除いた形で取得したいのであれば`basename $0`を使うと幸せになれるかも知れない。
勿論、basenameが使えればの話だが。
basenameが使えなければ (File::Spec->splitpath($0))[2] とか
utf8フラグがついてないASCIIの範囲外の文字列が、 utf8フラグが付いている文字と連結するときに、 勝手にLatin1と解釈されてutf8な文字列にされちゃうわけですが、 これをLatin1じゃなくする方法ってないんでしょーかね。 utf8フラグがついてない0x80-0xffな文字列を見つけたときの処理方法を ユーザーが指定できればちょっとウマーな気がするんだけど。
File::Basename使えよ
>>485 ・・・素で存在に気づかなかった。
自分でももっと簡潔にならないかなーなんて思いながら書いてたorz
漏れの目は節穴です。ありがとう
use File::Basename;
print basename($0);
簡潔ー
ある文字列の中から、適合する文字列をDBから抽出したいです。 分かりやすく書きますと 検索文字列:XXXAAAXBBBXXXXCCCXX これを検索させて、適合する文字列である AAA BBB CCC を抽出したいのですが、こんな事って出来ますか? 文字列は、文節がどこで区切られるか分かりませんので、全体を一文として検索を行いたいのです。
>>487 「適合する」がよくわからんのだけど、
辞書みたいなものがあって、ある文字列の中でその辞書に含まれる単語を抽出したい、
ということ?
>>487 あったかどうかのチェックなのか?
検索文字列:XXXAAAXBBBXXXXCCCXAAAX
の時に
AAA
BBB
CCC
AAA
でいいのか?
全体を一文としていいのなら
@LINES = ($tmp =~ /(AAA|BBB|CCC)/g);
とか
検索する文字が配列@DICに入っているのなら、 @LINES = map{ $tmp =~ /$_/g } @DIC; っていう書き方もあるぽ。
491 :
デフォルトの名無しさん :04/12/22 17:44:30
フォームを作って100バイトでデータを入力して送信しても $ENV{'CONTENT_LENGTH'}が100バイト以上になるんですけどどうしてですか? この入力したフォームのデータの正確なバイト数を調べるにはどうしたらいいんですか?
>>488-490 返事が遅くなりました、すみません。
レスありがとうございました。
>>488 氏の仰るとおり、つまりは辞書のようなものです。
DBには1000件ほどあります。
これを
>>490 のように配列@DICに流し込んで、検索文字列$LINESを置換するというのは
あまり効率的ではないかなと思い、質問させていただいています。
>>491 フォームってCGI?
CGIに関しては板違い
フォームで送って送られるのではデータだけじゃない。
>>492 $LINESを置換しているわけではなく、検索にHITした物が@LINESに格納されるわけだが。
そもそも配列@DICに流し込んで…じゃなく、
前提条件として「検索する文字が配列@DICに入っているのなら」としたわけだ。
で、
>>489 がスルーされているのだが、複数HITする物があった場合はどうするのだ?
HITした数だけ結果として必要なのか、それともHITするものが一つでもあるかどうかだけのチェックでいいのか?
494 :
54 :04/12/22 18:18:35
一挙に配列に読み込むのは効率がよいのだが、悪いと 言ってるとこみるとメモリを気にしてるのか? 1000行で各行何バイトくらい? 仮に100バイトだとすると、たった10万バイト。 それを読み込めないメモリなら増設汁。 もちろん一行ずつ読み込んで処理する、もある。
偶然にも今日逆引きなんとかというのでbasenameというのを知ったんだけど それまでは ($path, $script) = $0 =~ /^(.*(?:\/|\\))?(.*)$/; ってやってました。 上の方法とbasename使うのとで一長一短とかありますか?
読みやすさ
MacやVMSとかにも対応してるとか 拡張子も除去できるとか(指定した場合)
498 :
デフォルトの名無しさん :04/12/23 15:42:19
ファイルから1バイトずつデータを読み込んで 0x13でEXORをとって書き出すプログラムを書きたいのですが Perlではどうしたらいいのでしょうか? ↓こんな感じでうまくいかない for($i = 0; $i < 10; $i++){ sysread(DATA, $data, 1); push @string, $data; } for($i = 0; $i < 10; $i++){ $ch = $string[$i] ^ 0x13; print $ch; } __DATA__ abcdefghijklmn
配列に入れるんならunpack("A*",$_)とかしたほうがよくね?
>>498 print map chr(ord ^ 0x13), unpack 'A' x length, $_ while read DATA, $_, 1024;
>>499 ,
>>500 さん ありがとうございます。
Perlに不慣れなもので助かりました。
map, chr/ord, pack/unpackを勉強できました。
use encoding "shift-jis"; @filenames = glob ("./あ*.*"); print "@filenames"; ファイル名が日本語のものを、globで拾いたいんですが、上のスクリプト だと拾ってくれません(@filenamesが空になります)。 use encodingを削ると拾ってくれるんですが、use encodingは別の用で いるもので。 お知恵をお貸し頂きたく。
perlのunicodeまわりってつくづく半端だな...
505 :
デフォルトの名無しさん :04/12/24 11:04:20
CPANからEncordをインストールしていたら以下のエラーが出て止まります。 OSはVine3です。 PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t t/Aliases........ok t/jperl..........Unrecognized character \xCD at t/jperl.t line 89. # Looks like your test died before it could output anything. t/jperl..........dubious Test returned status 22 (wstat 5632, 0x1600) ちなみに以下はjperl.tの89行目付近です。 { use encoding "euc-jp", Filter=>1; ok(1, "Filter on"); use utf8; no strict 'vars'; # fools # doesn't work w/ "my" as of this writing. # because of buggy strict.pm and utf8.pm our $人 = 2; #89行目 エラーを解消する方法を伝授してください。
Encordってなんですか
507 :
デフォルトの名無しさん :04/12/24 15:22:09
>>504 それもそうだが、
欧米人にこの現状を理解してもらおうと思ったら、
なぜにeucとsift-Jisがあって、しかも
どうしてとっととutfに移れないのかを説明せねばならず、
説明してる間に、
結局、問題の多くがむしろこちら側にこそあるのだと、
気づかされるオチになるのではないかと、小一時間…。
少なくとも、sift-Jisは余計であったよなぁ。
オレは変換表さえ統一されたら移ってもいいと思っている。 永遠にその日は来ないだろうが。
>>505 解決方法は判らないが、エラーの出ている\xCDは半角カナのヘ
その89行目を見ると人っていう字があるが、それはEUCかな?
EUCの人という字は\xBF\xCDなので、その人という字が原因かと思われ。
でも直前で use encoding "euc-jp", Filter=>1; してるんだから、EUCからUnicodeに変換されてるはず だよな。それがうまくいってないのはなんでだ?
>>506 Encodeでした。ごめんなさい。orz
>>509 指摘されたとおりだと思いましたので、何でも良いかな?と思いjperl.tに3回記述されていた「人」を「年」と書き直したところすんなりとインストールできました。何か不具合があるかもしれませんが、そのときに考えようと思います。
ありがとうございました。
>>507 Perl の開発体制を良く知らないのですが、Encode の外人の開発者さんたちは、
そういう問題を理解しようとも思わないひとたちばかりなのでしょうか?
514 :
デフォルトの名無しさん :04/12/24 19:11:09
つーか、私が思うに、なんとか頑張って、こっちが utf-8 に移行するのが先だと思うんだよな。 問題は、もしろ日本側の方にこそあると思う。 ユニコードに移行する道筋できてるのか? ていうか、出来てないよね??? perlコードはutf-8に変換しておく、というルールはダメなのか? ちなみに、うちのサクラエディタは、ユニコードはバッチリだが、 ファイル名がshift-jisじゃないと、開けないらしい。ハァー。
% perl -we 'use strict; my $s = "foo"; print "$1\n" if ($s =~ /foo(o)?/);' Use of uninitialized value in concatenation (.) or string at -e line 1. この warning ってあまり有用なものではないように思うのですが、 これを抑制するのに良い方法が何かあれば教えて下さい。
>>515 no warnings qw(void);
>>515 perl -we 'use strict; my $s = "foo"; my$x = undef;print "$1\n" if ($s =~ /foo(o)?/ and $x = $1);'
>>515 $1に対応するカッコが使われなかったのに文字列の中で参照しようと
してるのを警告してくれてるんだから十分意味があるだろ。
516の言うようにno warning使ってもいいが、わざわざ-wつけるほど
慎重にプログラミングする主義なら、書き方を工夫して出ないように
するのが本筋だと思われ。一番簡単な書き換えは多分(o)?を(o?)に
することだろうが、お前の意図としてそれでいいかどうかはオレには
わからん。
>>518 なるほど、そうですね。
例えば
>>517 さんのように $1 をキチンと検査してから使うべきですね。
520 :
デフォルトの名無しさん :04/12/24 23:11:24
>>514 うん、Unicodeに合わせて日本語変えなきゃね。
521 :
デフォルトの名無しさん :04/12/24 23:31:15
Perlで構造体のリストを扱いたい場合ってどうするのですか? C++でいうところの、 struct Hage{ int a; int b; } std::vector<Hage> みたいなかんじのことをやりたいのですが・・・
my $hage_obj = { a => 1, b => 2 }; push (@hage_list, $hage_obj);
523 :
デフォルトの名無しさん :04/12/24 23:43:24
>>513 encoding作ってるのは日本人だよ。
つーか、あんたらどういう実装なら文句言わんのか、
一度整理してみなよ。
525 :
デフォルトの名無しさん :04/12/25 01:50:10
>>524 つまり、日本語の文字コードの変換なしにすべて正常に動作すること。
それには、日本語がすべてデフォルトでutfに乗っている必要がある
ということ。
だから、そのためには、すべてのosが次期バージョンから
eucとs-Jisのサポートを即刻やめ、
utf以外は文字化けするようにしてもらいたいと、
どこかの力のある団体が期限を限って勧告する。以上。
つーか、書いてて自分で笑ったが…。
しかし、でないと100年経っても変わりそうもない。
Perlを「パール」と読むのは分かるんですが、真珠の「パール」と同じアクセントでいいんでしょうか? 真珠の「パール」だと「パ」にアクセントがある感じですが、「Perl」の場合はアクセントをおかずに 平板に読む人もいるような気がします…。(身の回りの若干名ですが)どっちが正しい or 多数派 なのでしょう?
専門家アクセントってやつだね。
>>525 その力のある団体というのが存在しないのが問題だよね。
M$がつぶれでもしない限りもう統一は無理だと思うし(笑)。
変換表が複数ある問題あたりさえ解決すれば日本語だけ
ならunicodeにのせてもそう困らなくはなっていると
思う。変換表問題についても、従来全角英字と半角英字
が混在しても検索で適当に同一視する機能なんかが整備
されてなんとかなってたように、たとえば「〜」のU+FF5E
とU+301Cが適当に同一視されるような環境が整備されて
そのうちなんとかなるのかな。Jcodeのような定番モジュール
の登場を期待したい。
バールと同じアクセントってこと? 専門家はRubyやcurlも?まさかCも?
通じればいいとか思いません?
平板なアクセントというのは、まさに 「バール」と同じアクセントです! 専門家向けには「バール」で、一般の人向けには真珠の方でしょうかね? 通じれば最低限の目的は果たせるんですけど、日本人なので(?)、 みんなはどう発音しているのか気になって・・・。
>>524 クレジット見る限り、全部が全部 Kogai さんが書いてるわけじゃないですよね?
>>507 で「欧米人にこの現状を理解してもらおうと思ったら」とあったので、
Kogai さん以外はそんなに理解の無いひとたちばかりなのかと思いました。
Encode 自体の実装については、
現在のように Perl 外の制約条件がこれだけ酷い状況下においては、
まあまあの線を行ってるんじゃないかと思ってはいます。
文句が言いたいのは Perl じゃなくて別にあるわけですが、スレ違いなのでやめます。
>>533 そのスクリプト計算結果間違ってない・・・?
とりあえず書いたやつのテストで結果つき合わせてみてるんだけど、
5,3,5,1とか与えた場合明らかにおかしいような・・・
atan2の引数のx,y間違えてないかな
それと、時計回り、反時計回りというのがよくわからない。
紙の上で考えた限りでは、半径の正負をひっくり返した場合と
等価に見えるんだけどそれであってる?
もうひとつ、「時計回り」を定義するには上下が必要なわけだけれど、 y軸は上下どっちをプラスにしたいのかな 数学的なグラフなら上がプラスだし、 画面座標的なものなら下がプラスにもなる。
>>532 原語の話だと、Pearlと同じ発音だとラリー・ウォールがどっかに書いてたんだが、
見つけられない...
日本語だと規定はないんだろうけど、おれは真珠のパールと同じく、「パ」に
アクセント付けてるね。「バール」と同じなんて気持ち悪い。
RubyもCurlも頭にアクセント付けてるなあ。
>>535 まずは、レスと試して下さった事に感謝します。ありがと。
欲を云いますと、あちらのスレでレスして頂けたらさらに嬉しかったです。
マルチ決定>私。ぐすん。もちろん、一言書き加えなかった私が悪いです。
あちらには、謝っておきました。
> そのスクリプト計算結果間違ってない・・・?
あまり自信はありませんが、一応実用化してますので極端に
間違ってはいないと思います。ポイントは最初の点からみた
距離で、絶対座標ではないとこです。
> それと、時計回り、反時計回りというのがよくわからない。
x軸は右を、y軸は上をプラスと考えています。数学的なグラフです。
> 紙の上で考えた限りでは、半径の正負をひっくり返した場合と
> 等価に見えるんだけどそれであってる?
はい。
ある二点を結ぶ円弧は半円で無い限り、4種類存在します。
例えば、x軸上に2点をおき半円でない円弧で結ぶ時、
中心がx軸上の上に来るものと、下に来るものです。
またそれぞれに半円以下の円弧と半円を越える円弧があります。
4種の円弧を決定するため、半径の正負と廻り方を使ってますが、
このスクリプトで決定される中心点は2点(または存在しない)のうちの
どちらかだけです。サブルーチンして受け取る引数としては冗長ですが
他との関連上、そう致しました。
>>537 「バール」と真珠の「パール」は同じアクセント。
>>538 すみません、配慮が欠けておりました。
はじめの5,3,5,1は机上で下向きの座標系とつき合わせてた・・・
これはあってましたね。
が、5,-6,5,-1の場合、x0.101230, y4.998975の値が正しいような。
x4.899, y-1.001となって、これは遠方の値では・・・
仕様に関しては了解です。
>>540 > すみません、配慮が欠けておりました。
とんでも、私こそ。
> 5,-6,5,-1の場合、x0.101230, y4.998975の値が正しいような。
> x4.899, y-1.001となって、これは遠方の値では・・・
おっしゃる通りです。orz
x0.101, y-4.999(yは負)が、得たいデータでした。
洗練化どころか、バグバグじゃないですか…私。
>>539 そっちは日本語での発音の話だよ? バールのほうは平坦に発音しないか?
もう発音の話はいいよ....
>>541 計算ロジックから作り直したので別のバグが出てるかもですが
sub quest_arc_center($$$$) {
my($iX,$iY,$r,$ccw) =@_;
my $yrev = ($r * $ccw > 0) ? 1 : -1;
$r = abs($r);
die '半径0' unless( $r+0 );
my $length = sqrt($iX**2 + $iY**2);
die '半径が小さい' if( $r * 2 < $length );
my $rad = atan2($iX, $yrev * $iY) - acos2($r, $length / 2);
return map {sprintf("%.3f", $_)} ($r * sin($rad), $yrev * $r * cos($rad));
}
sub acos2($$) {
my ($c, $b) = @_;
atan2(sqrt($c**2 - $b**2), $b)
}
実質処理は27行->5行になりました。
>>544 うわぁぁぁぁい、ヽ(⌒▽⌒)/
ありがとう! 神さま、いえサンタさん。
なんて、かっちょ良いコード!
ちゃんと 座標=sinθ,cosθになってる。
中心点の選択、角度計算、角度→座標の実質たったの3行ですよね?
acos2がさらって出てくるところとか、ホレちゃいそうですよ。
じつは、私もはじめはそのように挑戦したのですが、さんざん悩んで
角度の向きが判らなくなって、あえなく自爆。情けないですorz
もう一度、ほんとぉぉぉっっっに、ありがとうございました。
なんか中学生か高校生ぐらいの数学の問題で perlかどうかはどうでもいい気がするのだが 三角関数使わない別解。 (0,0)と(iX,iY)の間の距離lはsqrt(iX^2+iY^2) (0,0)と(iX,iY)を結ぶ直線と円の中心との 距離hはsqrt(r^2 - (l/2)^2) (0,0)と(iX,iY)を結ぶ直線の法線方向の単位 ベクトル(時計周り向き)は(-iY/l, iX/l) 円の中心は(0,0)と(iX,iY)を結ぶ直線の中点 から、(反時計,短)(時計,長)のときは上の 単位ベクトルの方向に、(反時計,長),(時計,短) のときは逆方向にそれぞれ距離hだけずらした ところにある。 s=(ccw*r>0)?1:-1とすると求める円の中心の 座標は x = iX/2 + s*h*(-iY)/l y = iY/2 + s*h*iX/l あとはperlに落とすだけ。
sub quest_arc_center($$$$) { my($iX, $iY, $r, $ccw) = @_; my $l = sqrt($iX*$iX + $iY*$iY); my $h = sqrt($r*$r - $l*$l/4.0); my $s = ($ccw*$r > 0.0)? 1.0: -1.0; return ($iX/2.0 - $s*$h*$iY/$l, $iY/2.0 + $s*$h*$iX/$l); }
>>545 計算用紙二枚が丸だらけになりますた。
>>546-547 うゎ、そっちの方法も考えたのにどうして思いつかなかったんだろう・・・
無理だと思い込んで、図形的な変換を行って計算しちゃった
その変換のほうが処理速度も速いだろうし・・・
うわぁ!サンタさんが、いっぱいだぁ。
>>546 ,547
ありがとうです。
三角関数を使用しないで中心点を求める所は、私の晒したバグコードと
同じですが、547さんのコードはバッチリ整理されていて比べものになり
ませんね。私の判定式なんて三角関数まで使って、しかもトチ狂ってるし。
詰めて書いてるのに、数値に小数点とゼロを付けて可読性をあげてらっしゃる
ので、とても見やすいです。出来る人は、センスが違うのですねぇ。
$iX*$iXを$iX**2としないのも、なにかこだわりを感じます。(もしかして
処理速度が、向上するのでしょうか?)
ご指導、ありがとうございました。m(_ _)m
>>535 長い時間、お付き合い頂い大変感謝です(TдT) アリガトウ
貴重なお時間を浪費させてしまい、申し訳ありませんでした。m(_ _)m
550 :
デフォルトの名無しさん :04/12/26 00:02:33
>>549 なんだか、昔のN88 Basic かなんかみたいな話題だよね。
いいね、こういうの。
perlよ、N88 Basic を目指せ!ってね。
なんというか、実用一点張りというのではなくて、
もっとゲームとかにも気軽に使うという動きがあっても
いいと思うんだけどね。
>>549 そういうお前は顔文字の入力に貴重な時間を浪費してると思わんのか。
まあいい。
おまいさんもわざわざそれだけ言うために…
で、数学出来ない子にクリスマス暇なヤツが付き合う時間は終わったか? じゃあ、Perlの話題に戻るぞ でも発音の話題は勘弁な
554 :
デフォルトの名無しさん :04/12/26 15:25:18
すみません質問です。 ファイルを上書きでopenするときは、 open FH, ">> test.txt"; とするとできるのですが、 ファイルの後ろにシステム日付時刻を付けたいときは (test-yyyymmddhhmm.txt) どのようにすればよいのですか? どなたかヒントだけでも教えていただけないでしょうか?
POSIX::strftime つーか上書きになってないよそれ。
556 :
デフォルトの名無しさん :04/12/26 18:32:44
my $now = strftime "%Y%m%d%T", localtime; open FH, ">> test$now.txt" ; ではうまくファイルができないのですが、 どういうふうに書けばいいのですか?
558 :
デフォルトの名無しさん :04/12/26 19:20:29
>>558 できた!じゃないだろ?まず、555さん(仮面ライダー?確変?)に
礼を云って、指摘された追記を上書きに直して、顛末を書きsageだ。ボケッ。
$test = sub { $a = shift; printf("test $a\n"); }; こんな感じのsubのレファレンスの変数$testを 引数付きで実行するにはどうすればいいですか。
自己解決しました。 &$test("OK"); でOKでした。
562 :
デフォルトの名無しさん :04/12/26 21:11:58
内部でファイルをOPEN,READ,CLOSEしてるモジュールがあるとき、 そのモジュールを使っているスクリプトを perl -CDS hoge.pl のように実行しても、-CDSがモジュール内部のI/Oに適用されず 読み込んだ文字列のutf8フラグが立ちません(ASCII文字以外でも)。 モジュールを書き換えないでその中のI/Oを:utf8にするには どうしたらよいのでしょうか? Perlは5.8.4で試しています。
563 :
デフォルトの名無しさん :04/12/26 21:14:08
>>560 ->()
じゃないのかえ?
定型以外、頭に入っとりませんが、なにか???
564 :
563 :04/12/26 21:21:52
ダメじゃ、ぼけとる。 つーか、てめえ、560、 とっとと配列かハッシュに入れてから、 デリファレンスの仕方、聞けー、 というより、逝ってきます >わし
あるファイルにテキストで書かれたデータがあるとします そこから ある文字列を検索してヒットした位置から ある特定の文字("等)までを 複数行にわたって出力するCGIを作りたいのですが どうやればいいのでしょうか?
CGIかよ
(´-`).。oO(ヒットしたらprintするだけじゃないのか)
誰か書いて
>>563 $test->("OK");
でもいけました。ありがとうございました。
Perlでテキストファイルの文字列を検索するときは普通どうするんですか?
573 :
571 :04/12/27 20:10:41
>>572 すいません
私は
open(IN, "file.txt");
@xx = <IN>;
foreach $yy (@xx) {
if($yy =~ /hoge/){
print $yy;
}
}
close(IN);
とやっているのですが これはかなり負荷が高くなってしまうと思い
皆さんはどうしてるのかと思い質問させていただきました
すいませんがよろしくお願いします
>>573 かまわんよそれで。鯖屋やってるわけじゃないんだろ。
「負荷」って何のことかね
>>574 ありがとうございます
できれば 皆さんはどうやってるのか教えていただきたいのですが・・
>>575 マシンパワーを食うということです
すいません
文字列検索の例なんて調べりゃ出てくるだろうに。
>>572 ただそれだけの処理ならこう
open(IN, "file.txt");
while (<IN>) {
print $_ if /hoge/;
}
close(IN);
まあ自分が書くなら、ファイル開くにはIO::File使うけど
レスアンカ間違えた・・・欝だ
582 :
デフォルトの名無しさん :04/12/27 21:28:09
どうせファイルを全部一気に読み込むのなら、スカラーに入れて 一回だけスキャンすればいいじゃん。
>>582 バカでかいテキストファイルだったら嫌じゃね?
584 :
デフォルトの名無しさん :04/12/27 21:40:46
>>583 結局状況次第になっちゃうよねえ。
- テキストのサイズ
- 1行あたりの長さ
- 行をまたぐのか否か
- 実行する状況/環境
- マッチ位置を全部見つけるのか否か
などなどで。
>>576 いずれにせよ、スキャンしないで何かを探すのは無理じゃないの?
あらかじめインデックスみたいの作っとくにせよ何にせよ。
586 :
デフォルトの名無しさん :04/12/28 01:16:58
jperlの正規表現で、2バイト文字にマッチするメタ文字ってないですかね? \sとか\dみたいなやつ。 2バイト文字が5文字以上連続しているところを探したいんですけど。 jperlってスレ違いですかね?
>>586 スレ違いじゃないけど過去ログ嫁
過去ログ読んだら空気も嫁
そういう事で頼む
588 :
デフォルトの名無しさん :04/12/28 09:23:02
Perlでコンパイラを作ろうかと思っているのですが、 BNFファイルを元に字句解析や構文解析をするモジュールって ありますでしょうか?
Parse::YappとかParse::RecDescentとかどーよ。
Infoseek鯖なんですけど require './cgi-lib.pl'; がエラーになってしまいます。(これ以外は問題ない。) どうすればよいでしょうか?
エラー書けよ
CGIプログラムエラーのため表示することが出来ません。(500 Internal Server Error)
だめだこりゃ
> (これ以外は問題ない。) これ書く奴って大概他がおかしい。
タスケテー
>>594 でも require './cgi-lib.pl'; をコメントアウトするだけで
CGIプログラムエラーのため表示することが出来ません。(500 Internal Server Error)
はでなくなります。
foo, bar の次は baz, qux ですか? hoge, fuga の次は puyo ですか?
>>598 puyoは聞いたことない。
個人的にはgikoとmonaを使っている。
個人的には hige と hage をつかっている
puyo は聞いたことない。ふつー piyo では?
foo bar hoge fuga piyo の検索結果 約 29 件中 1 - 10 件目 (0.40 秒) foo bar hoge fuga puyo の検索結果 約 4 件中 1 - 2 件目 (0.35 秒) ここPerlスレだよな? 全く関係ないわけじゃねぇけどさ
foo bar の次の baz は一般的じゃないのか?
>>604 ここPerlスレだよな?
全く関係ないわけじゃねぇけどさ
書き込み失礼。 perlでジョイパッドの振動を検知したいんですが、可能ですか? 可能であればヒントください。
bot厨は来ないで下さい
たのもー。 MP3::Infoモジュールで、MP3ファイルのタグ操作をしようとしています。 my $tag = get_mp3tag($file); でタグ情報を得た後、それぞれの要素の文字コードを変換したいのですが、 $tag->{TITLE} みたいなハッシュのリファレンスの場合、eachは使えないのですね。 こういう場合どんな風に書けばよいのでしょうか。初心者スマソ
while(my($key,$value) = each(%{\tag})){ #処理# }
ミスった。 while(my($key,$value) = each(%{$tag})){ #処理# $tag->{$key} = $value; }
やや、即答ありがとうございます。できました。 オブジェクトとかクラスとか絡んで来ると、 Perlって全く違った言語みたいになりますね。 やっぱプログラミングPerl買った方がいいか.....。 どうもありがとうです。
root以外の人間が、モジュールをインストールしたいのですが、 どうすればいいでしょうか
>>612 漏れの場合は、自分の権限の及ぶディレクトリにモジュールを設置しといて、
そのディレクトリを環境変数 PERLLIB に設定する。
perl -MCPAN -e shell
のような感じではできないのでしょうか?
>>612 依存関係があると、インストールが凄く手間がかかると思うのですが
616 :
デフォルトの名無しさん :05/01/02 09:46:38
配列の100番目から最後までをバッサリと削除するような命令ってありますか? spliceを使えば良いのでしょうか? すみません、誰か「こうしたらよい」と言うのがあれば教えてください。
>616 man perlfunc
>>616 splice @array, 99;
>>617 せめてperlfunc -f spliceと言ってやれよ
$#a = 99;
620 :
デフォルトの名無しさん :05/01/02 11:04:59
質問です。よろしくお願いいたします。 open みたく、第1引数に BARE WORD を書いたらその実体が作られる、みたいな サブルーチンはどうやって書くのでしょう? 具体的には、下のプログラムで foo::my_open(*X) として呼んでいるところを、 いきなり foo::my_open(X) と呼んでも無問題にしたい。 #!/usr/local/bin/perl -W use strict; package foo; sub my_open(\*) { my $ref_fh = shift; open FH, ">hello.txt" or die; *{$ref_fh} = *FH; } package bar; foo::my_open(*X); print X "Hello World!\n"; close X; 目的は、open の wrapper を作りたいのですが、引数仕様もオリジナルの open に似せたい、ということです。
>>621 use strict;
package Foo;
sub my_open {
my($file, $mode, $symbol) = reverse @_;
my $fh;
{
no strict;
$fh = *{"${[ caller ]}[0]::$symbol"};
}
open $fh, $mode, $file or warn($!), return;
1;
}
package main;
Foo->my_open(BAR => '>', 'bar.txt') or die;
print BAR 'blah, blah, blah...';
close BAR;
>>622 感動した!
質問者(
>>621 )ですお答えいただきありがとうございます。
やはり use strict 下でユーザー作成なサブルーチンの引数に Bareword 書くのはちょっち無理がありっぽそうですね〜(汗
'=>' を ',' に変えて
<PRE>Foo->my_open(BAR, '>', 'bar.txt')</PRE>
とすると駄目。(use strict をはずすと OK。)
'=>' を使うと何も言われないのは、$hash{'key'} と $hash{key} を等価とするルールが効いてるんでしょうか。
ややこしいよ! > Perl。
それはともかく、caller を使って呼び出し元のパッケージ名を得て、シンボルの完全修飾するところはとても勉強になりました。
ありがとうございます。
>>623 perlsub(1)に似た例があるけど、Symbolモジュールの
qualify_to_refを使うといいそうです。
use strict;
package Foo;
use Symbol 'qualify_to_ref';
sub my_open(*) {
my $fh = qualify_to_ref(shift, caller);
open $fh, "> hello.txt" or die;
}
package Bar;
Foo::my_open(X);
print X "hello World!\n";
close X;
ご回答ありがとうございます。これで解決いたしました。
>>623 で寝ぼけたこと書きましたが、これは
>>622 に対する感動のあまり、perlsub に書かれてる
A "*" allows the subroutine to accept a bareword, ...(ry
という事実を失念してたせいです _| ̄|○|||
Symbol モジュールについては初耳ですた。ソース読んで見ます。
ドキュメントももっと真面目に読んでみます _n。
しかし、
>>622 でも片鱗が垣間見れましたが、シンボルをデータとして扱えるあたり、
まるで Lisp さんのようだ。
if文の条件式での質問なんですが $aは1以上5以下とする場合は if (1 <= $a <= 5) { } で認識されますでしょうか? 確認できる環境にありませんのでご教授ください
だめです
しかし確認できない環境でそんなこと気にしてどうするんだろうか...
MS-DOSとかw
CPU i386 16.78MHz
質問です。タブ区切りのテキストファイル、例えば abc(tab)xyz def(tab)123 こんなのが1万行以上続くファイルがあって、 Search('abc')でxyzが返ってくるようなサブルーチンを作ろうとした場合 m/$pattern\t([^\n]*)/ ではあまりに効率が悪いと思うんですが、もっと良い方法ってあるんでしょうか?
>>632 abc(tab)123
abc(tab)456
みたいに重複したらどーすんの?
>>633 このファイルには重複が無いたぐいのデータですので、重複の検討は不要なんです。
>>634 サンクスコです。DB使うと速いんだろうなーとは思っていたんですが、DBについて全く無知
なものでなんとなく遠慮してました。ちょっと勉強してみます。
質問自体は純粋な興味も含んでますのでテキスト形式で速い方法があれば、教えて頂きたいです。
ハッシュだつーことで foreach(@data){ $_ =~ /([^\t]+)\t(.+)/; $list{$1} = $2; } print $list{'abc'}; とか。 只、ループのコストはしらね。
637 :
デフォルトの名無しさん :05/01/05 16:27:14
>>635 - hashに読み込んで使う
- suffix arrayを使う
- テキストをソートして二分探索法を使う
>>635 私もDBを使う機会があって勉強したのですが、案外簡単に作れますよ。
一週間でマスターするPerlで、DBの作成方法は載ってたかと。
データベース作成の部分だけ抜き出して使えば、その日のうちに出来ます。
639 :
デフォルトの名無しさん :05/01/05 17:31:02
>>635 >
>>634 サンクスコです。DB使うと速いんだろうなーとは思っていたんですが、DBについて全く無知
> なものでなんとなく遠慮してました。ちょっと勉強してみます。
DB_File類のDBは、エントリの追加、書き換え、取得などをそつなくこなす
ためにチューニングされているので、必ずしも速いとは限らない。
>>639 とはいえ、ベタテキストの線形探索より遅いってことはねえべ。
641 :
デフォルトの名無しさん :05/01/05 17:50:09
>>640 > とはいえ、ベタテキストの線形探索より遅いってことはねえべ。
それは分からん。1万2万程度だったら、まだ線形の方がましかも。
皆さん、ご丁寧なレスありがとうございます。 確かに対象データによって速度は色々ですよね。あいまいな質問で申し訳ありませんでした。 元はだいたい1万語程度の和英対訳のデータで、線形検索でも実際即座にレスポンスがありました。 データ数が増えれば、線形検索 < 二分探索法 < ハッシュ≒DBと言ったところでしょうか。 ちょっと勉強してベンチとってみたいと思います。大変参考になりました。
643 :
デフォルトの名無しさん :05/01/06 19:07:10
変数の中身を空にするにはどうすれば良いですか?
644 :
デフォルトの名無しさん :05/01/06 19:22:52
>643 undef 変数;
645 :
643 :05/01/06 19:41:05
>>641 おめぇ自前でバイナリサーチ書いたことねえべ
適当なことゆってると笑われるぞ
>>646 ほっといてやれ。彼には一生理解できまい。
648 :
デフォルトの名無しさん :05/01/06 22:40:12
>>646 > おめぇ自前でバイナリサーチ書いたことねえべ
> 適当なことゆってると笑われるぞ
DB_Fileには、わたしが書いたコードも入ってる。
アイタタタ、妄想癖まで入ってるのかよ。こりゃ重傷だな。
>>649 Socket.pmにはわたしが書いたコードが入ってる。
結構日本人も手を入れてるんだよ。
そんなに珍しい話じゃないよ。
やっぱPerlに関する日本語情報源はここが最強だな
ネタスレ
ここにはすごい人たちがいるんですね!! 頼もしいなあ。
>>650 そうじゃなくて、手を入れたからってその中身が全て理解できてんの?
という意味で言ったの。
Jcode.pm にはわたしが書いたコードも入ってるが、中身はさっぱりわかってないしな。
>>641 ,
>>646 素朴な疑問なんですが、n 個のデータの並びがランダムなら、
探索に擁する平均の時間計算量は
線形探索:O(n) = n / 2
バイナリサーチ:
ソーティングに O(n) = n * log(n)
サーチ単体に O(n) = log(n)
なのであって、n がどうあろうとも平均的には線形探索が速くありませんでしょうか??
(データの並びがランダムなら、むしろ線形探索より速度有利なのはハッシュぐらいなのでは?)
↑いかんぼけたこと書いた。 ソーティングは最初に一回やればいいんですね・・・_| ̄|○|||
ソーティングに O(n) = n * log(n) すでにソートされてる所に新しく要素を追加するならそんなにかからないよ。log(n)でいい。
>>655 スクリプト言語の場合、変数へのアクセスやユーザ定義の
サブルーチン類の実行が非常に遅いので、オーダーの件が
影響し始める前に、コードの単純さやビルトインのルーチ
ンのみで済むかどうかがものをいうことが多々あるな。
最近のマシンでの閾値がどれくらいなのかは知らんが。
>> 657 ぼけたこと書いた身なので指摘するのは心苦しいのですが、それは挿入位置をバイナリサーチで見つける手間ですよね。 んで、バイナリサーチがその手間で適用できるということは、データはリンクリストでなくて、配列状に格納されてなきゃならないわけで、 挿入の際、後続要素をずらす手間が別途かかりますがな。(平均で O(n) = n/2) >> 655 (漏れだよ_| ̄|○||| 最後の () 内は大嘘。前提に誤解がある。 ・・・perl から離れてスマソ
このあたりはきちんと窮極を目指そうとすると、 トライとかB木とかパトリシア木とかダブル配列とか 出てきて底なしだから、どこかで妥協するのが現実的な ソリューションだろう。だいたいそのうちスクリプト言語で 書いている自分に空しさを感じはじめるし。
ややこしい話になってるけど、 ま、とにかく、辞書をソートして良いのなら、 look.plやSearch::Dictを参考にバイナリサーチを書けばそこそこの スピードのものが簡単に出来るんじゃないか? DB_Fileは、使用中にデータが変更されるのでなければ 大げさすぎだろ。
662 :
デフォルトの名無しさん :05/01/07 00:28:11
>>661 DB_Fileを使ってハッシュに入れてしまえばプログラミングが
楽だってことでしょう。
わたしなら空間効率の良いCDB_Fileを勧めるけどね。
ややこしい話になってるけど
>>632 に書いてあるパタンマッチの方法でも、そんなに遅くないんじゃないの?
つか、各エントリ毎に中身を分割して あらかじめファイルに保存しておき、 単に検索時に該当するファイルを開いて読むのが サーチ時間もデータのロード時間も一番短いんでね〜の?
665 :
デフォルトの名無しさん :05/01/07 01:28:45
>>664 やけになっちゃダメです!!
ディレクトリ検索はコストゼロじゃないし(線形探索では?)、
1エントリごとに最小ディスクブロック(8KB?)占有するし
でかなり高コストだと思う。
>>663 確かに最速かも。
正規表現のコンパイルおよびマッチングエンジンは
ネイティブコードで書かれてるわけで、スクリプトで書いた探索ルーチンなど問題外な動作速度のはず。(未検証)
特に
>>632 程度のパターンならコンパイル時間など一瞬で無視し得るだろうし、
マッチング中にバックトラックが発生する危険もない。
>>664 それ正論ですね!
いや私も
>>657 書いて初めて認識しましたが、一たびランダムな順序になってしまった(<これ重要)
n 個のデータの探索は、どんなアルゴリズム使っても結局トータルで O(n) = n になっちゃう。
データの追加の時点で、将来の検索を見越して、ファイルに分けるなりB木にするなりの準備をして、
いかにランダムせずに済ますかが O(n) = n の壁を破る肝かと。
>>665 というわけで、
>>664 は別にやけになってないと思うにゅ。
まあ、たしかに n が比較的小さければ、
>>665 や
>>658 の方が言うような
細かなコストの積み重ねが時間決めちゃうんだろうけど。
667 :
デフォルトの名無しさん :05/01/07 01:55:50
>>666 >
>>663 確かに最速かも。
> 正規表現のコンパイルおよびマッチングエンジンは
> ネイティブコードで書かれてるわけで、スクリプトで書いた探索ルーチンなど問題外な動作速度のはず。(未検証)
> 特に
>>632 程度のパターンならコンパイル時間など一瞬で無視し得るだろうし、
> マッチング中にバックトラックが発生する危険もない。
純粋なマッチングに関して言うと、regexpは相対的に遅いので、
メタ文字を使わないことが可能なマッチングなら、indexでsubstrの
ほうが良い。
668 :
デフォルトの名無しさん :05/01/07 01:59:01
>>666 > いや私も
>>657 書いて初めて認識しましたが、一たびランダムな順序になってしまった(<これ重要)
> n 個のデータの探索は、どんなアルゴリズム使っても結局トータルで O(n) = n になっちゃう。
> データの追加の時点で、将来の検索を見越して、ファイルに分けるなりB木にするなりの準備をして、
> いかにランダムせずに済ますかが O(n) = n の壁を破る肝かと。
いや、ランダム順のファイルに対し、suffix arrayとか、
バイナリサーチを仕掛ける方法はある。
>
>>665 というわけで、
>>664 は別にやけになってないと思うにゅ。
> まあ、たしかに n が比較的小さければ、
>>665 や
>>658 の方が言うような
> 細かなコストの積み重ねが時間決めちゃうんだろうけど。
わかった。やってみんしゃい、やてみんしゃい。
理屈に走りすぎたスマソ_| ̄|○|||
「細かなコスト」という悪い表現つかっちゃったけど、そういうものを軽視はしていないつもり。
>>666 は、n が 10 兆と 100兆 とかの雲の上のケースで、しかも検索初回でのみ成立する空論だということで一つ 人´Д`;)
(2 回目以降ならデータはソート済みのため、たしかに O(n) = n より早くできる。)
>>664 (少なくとも UNIX では)
>>665 の言うとおり open(2) はディレクトリを線形探索するので、
ひとつのディレクトリに数万ファイルとかあるとそれなりに重くなる。
ので、ファイルはディレクトリ細かく分けて配置するのが良い。
たとえば ./a/b/c/abc.dat みたいな感じにディレクトリ切るのがおすすめ。
671 :
デフォルトの名無しさん :05/01/07 02:41:57
なんでもいいけど、 検索することに走りすぎで、元のファイルの作成・管理を 考えたら、ファイルを分けるとか、ディレクトリを切るとか、 やってられないと思う。 だいたいにおいて、一つの値がいくつかの属性を持ってて、 別の属性で調べろとか言われたら破滅でしょ。 (名前、年齢、住所と並んでて、名前じゃなくて年齢でと言われた場合) DB_Fileなら、MLDBMと組み合わせれば、それもバッチリらしいよ。 しかし、ここまできて、DBIに誰も触れないのは不思議。 MySQLとかPostgreSQLとかまでいかなくても、 CSV(つまり、カンマ区切りテキストですが)でも、 DVD::CSVを使えば利用できるようなんだけど…。
672 :
デフォルトの名無しさん :05/01/07 02:53:45
>>671 DVD::CSV
あうっ、DBD::CSV
673 :
デフォルトの名無しさん :05/01/07 02:58:42
>>670 > ので、ファイルはディレクトリ細かく分けて配置するのが良い。
> たとえば ./a/b/c/abc.dat みたいな感じにディレクトリ切るのがおすすめ。
ディレクトリ構造は、ディレクトリごとに異なるシリンダグループに
配置されたりするから、これはディスクアクセスの量を増大させるし、
ディスク上の局所性も悪い。
また、最小ファイルサイズの問題もある。これがまたディスクアクセスの
量を増大させる。もちろん、各ファイルの後方のフラグメントは、他の大
きなサイズのファイルから利用可能だけど、数が多すぎです。
squidやccacheとは粒度が違うでしょ、粒度が。
っていうか、もはやどういう制限があって何がしたいのかと言う話が
めちゃくちゃになってるし。
D・V・D!! D・V・D!!
手を入れたことがある。 排泄器に。
676 :
デフォルトの名無しさん :05/01/07 03:15:10
>>671 > 検索することに走りすぎで、元のファイルの作成・管理を
> 考えたら、ファイルを分けるとか、ディレクトリを切るとか、
> やってられないと思う。
そういうツールを書けばよいだけ。
> だいたいにおいて、一つの値がいくつかの属性を持ってて、
> 別の属性で調べろとか言われたら破滅でしょ。
それはまた別の話。
> (名前、年齢、住所と並んでて、名前じゃなくて年齢でと言われた場合)
> DB_Fileなら、MLDBMと組み合わせれば、それもバッチリらしいよ。
MLDBMはそういうことは出来ないと思うが。
だいたい、プレフィックスなどつければ、
ふつうにDB_Fileでもできるし。
> しかし、ここまできて、DBIに誰も触れないのは不思議。
だから、そこまで大げさな話じゃないってことさね。
SQLite、いや、やっぱなんでもないです。
678 :
デフォルトの名無しさん :05/01/07 03:40:18
あ、最近ひそひそ話で良く出てきますね、SQLite。
679 :
デフォルトの名無しさん :05/01/07 03:42:20
>>676 >MLDBMはそういうことは出来ないと思うが。
MLDBMの具体的使用例は、CGIプログラミング第2版(オライリー)
で見た。P280
これを見ると、ハッシュでキーと値というだけでなく、
ネストされたデータ構造を持てる。
マリーさんの電話番号の、1番目のじゃなく2番目のやつ
を特定して取り出せるというの。
ハッシュの値に、配列のリファレンスが
入ってるということだよね。
MLDBMはそういう機能をもってるらしい。
MLDBMを使わないとなると、SQLまで行かないと出来ないんじゃない?
680 :
デフォルトの名無しさん :05/01/07 03:57:34
>>679 > >MLDBMはそういうことは出来ないと思うが。
>
> MLDBMの具体的使用例は、CGIプログラミング第2版(オライリー)
> で見た。P280
MLDBMは最初のリリースから使ってる。
> これを見ると、ハッシュでキーと値というだけでなく、
> ネストされたデータ構造を持てる。
そうだ。
> マリーさんの電話番号の、1番目のじゃなく2番目のやつ
> を特定して取り出せるというの。
> ハッシュの値に、配列のリファレンスが
> 入ってるということだよね。
だからできない。まず、「マリーさん」を検索してデータ構造を取得し、
―ここでマーシャリングされていたデータ構造が展開される(激重)―
その中の2番目を取得するというステップを踏む必要がある。
> (名前、年齢、住所と並んでて、名前じゃなくて年齢でと言われた場合)
> DB_Fileなら、MLDBMと組み合わせれば、それもバッチリらしいよ。
の例なら、まず、すべての名前の一覧を取得して、それで検索し、
ひとつひとつ展開して、合致する年齢を探し出す必要がある。
そこまでやるのなら、すっぴんDB_Fileにプレフィックスをつけたエントリを
直接展開した方が速い。
というか誰かベンチマークとってみたらどうだろう?
>>632 の方法と、index-substrと、sort-binsearchのみっつくらいで。
キーの重複はないって条件付きだからそこは悩まなくてもよさ下。
ヒロシです… O(n) がAAに見えて仕方ありません… ヒロシです… ヒロシです… ヒロシです…
・・・やっぱこのスレ、すったもんだしてる時が一番盛り上がるのね。
質問者がよってこなくなるぞ、と。
仮眠前にこのスレ見るのはもうやめよう・・・。
けど
>>681 の結果は知りたいな。
キーと内容ファイル内のオフセットの組書いたインデックスファイルと 内容ファイルを分ければいいじゃない。
常にハッシュをStorableでfreeze,thowするのは駄目ですかね?
>>684 つきつめていくとBerkeley DBの再発明になりそうな予感。
687 :
デフォルトの名無しさん :05/01/07 10:47:07
>>685 それは、MLDBMの再発明になると思われ。
BerkeleyDBの場合は1万レコードのテキストファイルの内容を 予めDBに入れておいてです。
690 :
デフォルトの名無しさん :05/01/07 12:58:48
スピードだけの問題じゃないと思うんだよなぁ。 たとえば、DBIを考えてみれば、 DBD::CSVでカンマ区切りテキストを扱えたり、 サーバを必要としない DBD::SQlite が使えるよ。 汎用性とか、使いまわしの容易さとか、他と違うと思う。 たとえばの話、DBIx::Dumper モジュールを使うと、 EXCELファイルにも即、出来るらしいよ。(クックブック第2版P705)
>>690 こんなシンプルな問題で汎用性を考えたら、
地獄に落ちるのは目に見えている。
おいおまいら。ベンチマークとってみましたよ。 下準備↓ == makedata.pl use strict; for my $i (1..20000) { print "@{[$i*2]}\t", crypt($i, reverse $i), "\n"; } == console %perl makedata.pl > data.txt (長いので続く)
== bentch.pl use strict; use Benchmark; my ($filedata, @filedata, %filedata); open IN, "data.txt"; @filedata = <IN>; close IN; for (@filedata) { # データ読み込み $filedata .= $_; m|([^\t]*)\t([^\n]*)|; $filedata{$1} = $2; chomp; } timethese (10, { # ベンチ bin => q{ for my $i (0..40000) { &bin($i); } }, match => q{ for my $i (0..40000) { &match($i); } }, hash => q{ for my $i (0..40000) { &hash($i); } }, } ); sub bin { my $key = shift; my ($l, $r) = (0, scalar(@filedata)); while ($l <= $r) { my $i = int(($l + $r)/2); my ($fkey, $fdata) = split(/\t/, $filedata[$i]); return $fdata if ($key == $fkey); if ($key < $fkey) { $r = $i-1; } else { $l = $i+1; } } return ""; } sub match { return ($filedata =~ m|$_[0]\t([^\n]*)|o)[0]; } sub hash { return $filedata{$_[0]}; }
== Console %perl bentch.pl Benchmark: timing 10 iterations of bin, hash, match... bin: 26 wallclock secs (25.77 usr + 0.00 sys = 25.77 CPU) @ 0.39/s (n=10) hash: 0 wallclock secs ( 0.36 usr + 0.00 sys = 0.36 CPU) @ 27.86/s (n=10) (warning: too few iterations for a reliable count) match: 155 wallclock secs (154.81 usr + 0.00 sys = 154.81 CPU) @ 0.06/s (n=10)
さすがに線形探索は不利っぽ。オーダーのレベルで違うんでたかが20000件とはいえ差がある模様。 binsearchは結構いい加減なプログラムですまん。splitのコストがどれくらいだろうなぁ。 ただデータがソートされていない場合は別途ソートの必要有りなことに注意。 キーの重複もダメね。今回はキー重複は無視していいみたいだけど。 hashはとりあえずはやい。ただこのベンチマーク結果はハッシュ構築のコストは計ってない。 あと、空間コストが一番多くかかってるのはこれじゃないかな(予想)。 Perlのハッシュ実装がどうなってるかは知らんですが。 あとやっぱしキーの重複はダメね。
696 :
デフォルトの名無しさん :05/01/07 15:11:22
>>692 > おいおまいら。ベンチマークとってみましたよ。
とってないじゃん。
>>695 問題が違うんじゃない?
線形を甘く見るなというのは、ぼくも先輩から言われたことがある。
スクリプト言語だとデータ構造の構築にも時間がかかるから、
データの数が少ない時には、さっさと線形サーチでやってしまった方
がいいという話だと思うけど、でもそれって、一度の起動で検索一度の
ケースだよね? みんなその前提で書いているようだけど、そういう条件なの?
だからSQLite使えよ。
話が逸れて曲がって広がってるな。
700 :
デフォルトの名無しさん :05/01/07 18:50:07
>>699 逸れてないって。
要するに、大は小を兼ねるでさ、DBIのたとえばSQLiteでもいいさ、
使っておけば、後から予想もしない何事かを要求されても、
平然としてられるでしょ。
701 :
デフォルトの名無しさん :05/01/07 18:52:47
で、SQLiteの使い方の簡単な紹介は、 クックブック第2版p725にある。 誰か、もっと詳しい紹介があったら、教えて。 日本語は、utf-8でokでいいよね?
702 :
デフォルトの名無しさん :05/01/07 18:58:30
>>700 必要になったら必要になった時にそれを使った
システムを書けばいいだけじゃん。
>>700 要するに、過ぎたるは及ばざるがごとしでさ、(ry
私もベンチしますた!私の恥ずかしい binsearch、見てくださ(ry
>>692 乙ですが、ちょっちバグが有るにゅ。
$filedata =~ m|$_[0]\t([^\n]*)|o)[0];
だと、例えば $_[0] == "10" で、"10010\tHogerapukya\n" とかにもマッチしちゃうにゅ。
ここはあらかじめ $filedata = "\n$filedata" とした上で、
m|\n$_[0]\t([^\n]*)| によってマッチすべきかと。
あと data.txt 上のキーが2万種類なのに、探索が4万種類について行われてたので直しました。
それと、バグではないけど、数値順でなくて、辞書順の binsearch のほうが
>>632 は嬉しいと思う。
けど乙ですだ。全てのキーで 10 回づつ検索するんだから、これで、
各要素に満遍なく、頻繁にアクセスする条件でのベンチになってますよね、ね?
>>696 ,
>>697 (オロオロ(´д`;)
さて、index-substr つけましたよ indexsubstr。ダサいけど。 $filedata = "\n$filedata";# 追加! timethese (10, { # ベンチ bin => q{ for my $i (0..0000) { &bin($i); } }, match => q{ for my $i (0..20000) { &match($i); } }, hash => q{ for my $i (0..20000) { &hash($i); } }, index_substr => q{ for my $i (0..20000) { &index_substr($i); } }, } ); (...中略...) sub index_substr($) { my $str = "\n$_[0]\t"; my $p1 = index($filedata, $str) + length($str); my $p2 = index($filedata, "\n", $p1); return substr($filedata, $p1, $p2 - $p1);# キーが無かった場合は知ら(ry } 結果: Benchmark: timing 10 iterations of bin, hash, index_substr, match... bin: 28 wallclock secs (27.23 usr + 0.00 sys = 27.23 CPU) @ 0.37/s (n=10) hash: 0 wallclock secs ( 0.39 usr + 0.00 sys = 0.39 CPU) @ 25.64/s (n=10) (warning: too few iterations for a reliable count) index_substr: 289 wallclock secs (286.86 usr + 0.00 sys = 286.86 CPU) @ 0.03/s (n=10) match: 247 wallclock secs (240.19 usr + 0.02 sys = 240.20 CPU) @ 0.04/s (n=10) (match は未修正。)
706 :
デフォルトの名無しさん :05/01/07 19:16:09
>>705 いや、だからそういう問題じゃないと思うんだけど。
>>704 DB_Fileを使った時と、単純に線形探査したときの比較の話じゃなかったの?
で、ワンショットコマンドでというのも条件?
>>702 個人ならそれでいいけど、これが会社とかでの話になると
新規に作るには時間もかかるし、当然人件費がかかる。
ならば今ある物に手を加えて……と、スパゲッティプログラムへの道を歩むことになる。
実際は新規に作った方が短時間になるケースが多いんだけどね。
未だに誤った選択をしてしまう会社は多いよ。
あのう初歩的な質問なんですが、 サブルーチン foo の中でサブルーチン bar を呼び出したとき、 bar が失敗したらウォーニングを表示して即座に undef を返したいんですが、 $x = bar() or warn "$!\n", return; と書くだけで本当に大丈夫なんでしょうか? (この構文において、返される undef は一体誰が作ってるんでしょう?)
710 :
デフォルトの名無しさん :05/01/07 22:00:39
711 :
デフォルトの名無しさん :05/01/07 22:05:40
>>709 よく分からんけど、
http://perldoc.jp/docs/perl/5.6.1/perlvar.pod に下のように書いてある、 $SIG{__WARN__} が使えない?
警告メッセージを表示しようとするときに $SIG{__WARN__} で
示されたルーチンが呼び出されます。
警告メッセージは最初の引数として渡されます。
__WARN__ フックがあると、通常の STDERR への警告の出力は行われません。
これを使って、警告メッセージを変数にいれたり、
あるいは以下のようにして警告を致命的エラーに変えたり出来ます:
local $SIG{__WARN__} = sub { die $_[0] };
print while(<>); を実行して、標準入力にリダイレクトして 読み込んだテキストファイルをそのまま標準出力すると、 行末がcr cr nlになってしまいます。入力ファイルの行末はcr nlです。 どう解決すればよいのでしょうか? 環境はcygwinのPerlです。よろしくお願いします。
すいません、かなり舌足らずでした。 やりたいのはウォーニングを出して undef を返したい、というだけでして、しかも実現はできてるんです(汗 気にしてるのは、その書き方でして、 $x = bar() or warn "hoge\n", return undef; と、戻り値を明示すれば、確実に上記の動作が行われるのはわかるんですが、最後の undef を取って、 $x = bar() or warn "hoge\n", return; のように書く例が見られるし、その真似でいままで書いてきたけど本当に大丈夫なんかいな、 書き直した方がいいのかしら、と気になり始めた、ということなんです(汗) 今まで、warn がいつも undef を返す仕様なのに違いない。それが右端の return にいたる実行パスの last value だから返されるんだ、 と根拠なく思い込んでましたが、よく考えたら間にカンマ演算子が挟まってるし、実際実験したら $x = bar() or 1, return; でも undef が返されたので、すかーり自信喪失してしまい・・・というわけです。 しょうもない質問ですいません(滝汗
舌足らず?
>>713 複雑に考えずにperlfunc(1)のreturnの説明を読めば
EXPR が指定されなかった場合は、リストコンテキストでは空リストを、
スカラコンテキストでは未定義値を返します。そして(もちろん)void
コンテキストでは何も返しません。
と思いっきり書いてあるわけだが。
716 :
デフォルトの名無しさん :05/01/08 00:40:01
>>712 入れるとき chomp して、
出すとき \n じゃダメなの?
そういう問題じゃなくて???
近所のコンビニに行くのに自転車で言ったほうが気軽で速いしコストもかからないとしても。 隣町や隣の県に行くときは交通手段を変えないと遅くてやっていられない。 だったら初めからコンビニに行くのもスケーラビリティの高い自動車でいく癖をつけとけば単純明快だよ。
>>716 はい、実際そのようにしています。
ただ、そのままchompをしただけだと行末が
cr ln → cr
となり、さらにこれに\nをつけて出力すると
cr → cr cr ln
となってしまいます。
そこで、chompの前に $/ = "\r\n" を入れれば期待通りの動作になるのですが、
そうすると
>>712 のコードが以下のように若干汚くなることが気になって質問したのです。
$/ = "\r\n";
while (<>){ chomp; print $_,"\n"; }
>>717 > だったら初めからコンビニに行くのもスケーラビリティの高い自動車でいく癖をつけとけば単純明快だよ。
そんな「だったら」は無いだろ(w
>>712 binmodeぶちかますのじゃだめなの?
>>718 lnってlfでは?
CR = \r
LF = \n
>cr → cr cr ln
CR にLF足すのにCR+CR+LFになるっておかしくないか?
cygwinのせいなのか?
他環境でも動作させるように考えるなら、s/\r|\n//; でもしてCRもLFも削った方が良いような気がする。
× s/\r|\n//; ○ s/\r|\n//g;
>>721 > CR にLF足すのにCR+CR+LFになるっておかしくないか?
べつにおかしくはないよん。"\n" は、perl 内部では LF("\x0A") だが、
テキストモードのファイルハンドル使って出力するとき CR LF ("\x0D\x0A") に変換される。
実際、
>>720 の言うように、binmode STDOUT; print while(<>); だと
リダイレクト結果の行末は "\x0A" のみになる。(Win 環境と CygWin 環境で確認。)
ついでに言うと、入力時のときも、テキストモードであれば "\x0D\x0A" --> "\x0A" 変換が行われる。
(したがって、Win 環境でも、上に書いた『"\n" は、perl 内部では LF("\x0A")』という約束が矛盾無く保たれる。)
さらに余談だけど、このような変換は、(Win 環境での perl に限らず) テキストモードとバイナリモードを区別する環境での
かなり一般的な約束らしい。
(注: 安全性をとってs/\r|\n//g; すること自体には異論はない。)
>>722 環境にもよると思うけど s/\n\z/; s/\r\z/; の方が速い鴨。
いやごめん。
WindowsXP + Cygwin 1.4.11-1 + perl v5.8.5
で試したところ、print while(<>); だけでもリダイレクト結果に "\x0A" しか付かなかった _| ̄|○|||
>>712 において、行末に "\x0D\x0A" が付くのは Win 環境の perl (v5.6.1) だけだった。
役に立たなくてすまね
>>712
>>712 ごめん、暇人なんでちょっと食い下がらせて。
Cygwin 環境自体は UNIX に似せてあるわけだから、テキストデータの改行コードといえば、LF ("\x0A")一文字を指す。
したがって、Cygwin 環境で動くアプリは、
>>723 に書いた変換を本来行ってはいけない。
つまり、次の動作が正しい。
(1) 入力データの行末が CR LF なら
(2) それを perl で呼んだ結果の行末も CR LF でなければならず、
(3) それを出力したものの行末も CR LF でなければならない。
(誰も CR を減らしも増やしもしない)
>>716 読むと、(2) は成立してるようだが、(3) が成立していないようだ(出力時に LF --> CR LF 変換が起きている)。
したがって、
>>720 が言うように、binmode STDOUT; でその変換を確実に殺してやれば解決はするんだが、
何で変換がおきるのかが謎。
実際、hello.txt の中身が "hello!\x0D\x0A" だとして、
perl -e "print while(<>);" < hello.txt > hello2.txt
を実行すると、hello2.txt の中身は "hello!\x0D\x0A" であって、
>>712 のようなことは起きない。
Cygwinってインスコする時に改行コードをDosかUnixのどっちにするか聞いてくるけど その選択によってCRLFの扱いが変わったりすることは無いの?
Xという障害が起きたらAという行動 また同じXという障害が起きたらBという行動 このように交互に繰り返してループさせるにはどうすればいいんでしょうか。 全くの初心者なんですが、苦悩しすぎてハゲそうです。 お助けを・。
729 :
デフォルトの名無しさん :05/01/08 18:44:19
syslog の行頭の `Jan 8 18:31:55' こういう日付をエポッチに変換したいので すがどうするのがよいでしょうか?
>>727 ある。
$ mount
の結果貼れば解決するかも。
>>729 X が起きたのが遇数回か奇数回なのかを状態変数に持たせる。
(下のリストでは $state がそれにあたる。)
同じ入力で、動作を次々変えたいときの常套手段。
my $state = 0;
for (;;) {
#...
if (X 発生) {
if ($state == 0) {
A;
$state = 1;
} elsif ($state == 1) {
B;
$state = 0;
}
}
# ...
}
>>732 助かりましたー!!
ありがとうございます。
>>731 貼った。(<って漏れが貼ってどうする・・・_| ̄|○|||
$ mount
D:\cygwin\bin on /usr/bin type system (binmode)
D:\cygwin\lib on /usr/lib type system (binmode)
D:\cygwin on / type system (binmode)
c: on /cygdrive/c type user (binmode,noumount)
d: on /cygdrive/d type user (binmode,noumount)
m: on /cygdrive/m type user (binmode,noumount)
q: on /cygdrive/q type user (binmode,noumount)
確かに、漏れの環境は(Unix でインストールしたのか) binmode になっているので、
>>725 や
>>726 において
>>712 のような摩訶不思議な現象とは無縁だったらしい。
>>735 ワロタ
>>731 ちなみにUnixでインスコした俺の結果は
% mount
C:\cygwin\usr\X11R6\lib\X11\fonts on /usr/X11R6/lib/X11/fonts type system (binmode)
C:\cygwin\bin on /usr/bin type system (binmode)
C:\cygwin\lib on /usr/lib type system (binmode)
C:\cygwin on / type system (binmode)
c: on /cygdrive/c type user (binmode,noumount)
d: on /cygdrive/d type user (binmode,noumount)
>>723 丁寧な分析ありがとうございました。
ほか、私の質問にレスをしてくれた方々、ありがとうございました。
原因はやはりテキストモードにあったようです。
% mount
C:\cygwin\bin on /usr/bin type user (textmode)
C:\cygwin\lib on /usr/lib type user (textmode)
C:\cygwin on / type user (textmode)
c: on /cygdrive/c type user (textmode,noumount)
d: on /cygdrive/d type user (textmode,noumount)
恥ずかしながら、今までテキストモードとバイナリモードの違いを
意識したことがなかったので、まさかこんなところに原因があるとは
思いもしませんでした。
mountしなおして、バイナリモードに変更したところ、前記の問題は
無事解決いたしました。
ありがとうございました。
738 :
デフォルトの名無しさん :05/01/09 12:33:31
>CGIとPerlの区別がつ 枝葉末節の違いをのぞけば、本質的には同じだよね?
>>738 IT用語辞典とかで調べたらすぐに判るだろうに
わざわざ恥晒しに来るなんて物好き。
>>715 ありがとうございました。無事解決しました!
やはり、足りないのは舌じゃなくて脳でした!
>>714 つまり、脳が、return ・・・ハズカチー 三(ノノ)
>>738 exeファイルとプログラム言語は 本質的には同じだよね?
ぐらいの間違い。
>>741 見方によっては間違いでは無い。上のも同じ。
ばかばっか
744 :
デフォルトの名無しさん :05/01/09 14:53:23
>>742 > 見方によっては間違いでは無い。上のも同じ。
見方によって変わるファクターは「本質的」ではない。
見方によって変わらないものなどあるのかね? 1つ例を挙げてくれよ
Perl の話をすれ。
王様の耳はロバのミ(ry
えと、皆さん知ってて黙ってるんだとは思いますが、言いたくてしょうがないので言わしてください。
>>695 において、binsearch とハッシュについて、「キーの重複はダメ」と書かれてますが、それは謙遜のしすぎです。
低コストな回避策があります。
binsearch については 『区間 [$l, $r) の外には明らかに目的のキーがない』という約束の下で、
[$l, $r) を縮小していくようにループを回してやり、縮小し切ったところで
$l と $r を返す関数仕様にすれば、キーが重複してても無問題(区間 [$l, $r) のデータが全てそのキーに該当する)。
しかもキーが無かった場合も $l == $r によって判別できる。
ハッシュについては、ハッシュ構築時に、$hash{$key} = $value; とするのでなく、
push @{$hash{$key}}, $value;
としてやれば、foreach (@{$hash{$key}}) { ... } によって、同一キーを持つ全ての要素にアクセスできる。
ついでに、ハッシュを静的に構築したいなら、配列への参照を返す演算子 '[]' を使って、
my %hash = {
key1 => [ value1, value2, value3, ... ],
...
}
とすれば可。
>>747 >
>>695 において、binsearch とハッシュについて、「キーの重複はダメ」と書かれてますが、それは謙遜のしすぎです。
わざわざキーの重複まで網羅していないだけのちょこっと書いた
ベンチマーク目的のコードに謙遜など持ち出すのはまちがい。
変なのがいるな
750 :
デフォルトの名無しさん :05/01/09 15:42:29
スルーしろよ
@INDATA=(2.2,2.3,2.4,2.5,2.6) $x=2.1; $xint=0.01; foreach $data (@INDATA){ while($x<$data){ print "$x\t"; unless($y[$n]){$y[$n]=0;} print "$y[$n]\n"; $x+=$xint; $n++; } $y[$n] += 1; }
自分では、これを実行すると 2.1 0 2.2 1 2.3 1 2.4 1 2.5 1 2.6 1 と出ると考えているのですが、実際に実行すると 2.1 0 2.2 1 2.3 0 2.4 1 2.5 1 2.6 1 2.7 0 となってしまいます。 自分では間違いが見つけられません……どうか間違いをご指摘下さい。
>>752 ,
>>753 コピペ時点でソース間違ってね?
少なくとも、@INDATA=(2.2,2.3,2.4,2.5,2.6) の後ろの ';' が抜けてて Syntax error だし、
それを直したとしても、$xint = 0.01 のままだと print "$x\t" が 50 回実行されてしまうわけだが。
755 :
デフォルトの名無しさん :05/01/09 20:49:52
>>752 こんなときの -d !
つーか、まず何をしたいのか、日本語で一回書け!
それが分からんと、わけわかーっ!!!
いや、だいたいの推測だが、
>>752 がおかしいと思ってることがわかった。
たぶん、
>>752 は、外側の foreach () ループ 1 回につき、内側の while () ループが
10 回回ることを期待してるんだろう。(増分 $xint == 0.01 で、@data の各要素が 0.1 刻みのため。)
しかし残念ながら、0.01 は 2 のべきで表せないので、IEEE の浮動小数点形式使ってる以上、加算するたびに誤差が累積していく。
実際には内側の while () が 11 回(もしくは途中で LSB 切捨てでなく、四捨五入があれば 9 回)回ることがあり、その直後
$y[$n] が undefind なため、unless 文で $y[$n] = 0 になるんだなこれが。
すると、$x が 0.1 の倍数のとき、
>>752 の期待に反して 0 が表示されちゃう。
解決策: 0.01 加算をスケーリングして整数の加算に直せ。いじょ。
これでどうよ?
>>752 @INDATA = (2.2, 2.3, 2.4, 2.5, 2.6);
$x=21; # 21 == 2.1 * 100 (100 がスケールファクタ)
$xint=1; # 1 == 0.01 * 100 (同上)
foreach $data (@INDATA) {
while (($x / 100.0) < $data) { # スケールファクタで割る (反対に、$data * 100 でも良い)
print $x / 100.0, "\t"; # (同上)
unless ($y[$n]) { $y[$n] = 0; }
print "$y[$n]\n";
$x += $xint; # スケーリングの結果、ここは整数の加算 --> 誤差累積無し
$n++;
}
$y[$n] += 1;
}
すいませんでした。行数の関係で色々いじったので…… #! /usr/bin/perl @INDATA=<STDIN>; if($ARGV[0] eq graph){ @INDATA=sort(@INDATA); unless($ARGV[2]){ $xint = 10; }else{ $xint = $ARGV[2]; } $n=0; $x=$INDATA[0]-$xint; chomp($x); chomp(@INDATA); foreach $data (@INDATA){ while($x<$data){ print "$x\t"; unless($y[$n]){$y[$n]=0;} print "$y[$n] n=$n data=$data\n"; $x+=$xint; $n++;
} $y[$n] += 1; if($data==$INDATA[-1] and $data <= $x){ foreach $ytmp (@y){$lastsum+=$ytmp;} $last = $ARGV[1]-$lastsum; print "$x\t$y[$n]last\n"; } } }elsif($ARGV[0] eq stdev){ #略 }else{ #略 } オリジナルはこんな感じです。すいません大分違いました。 標準入力で 2.4 2.2 2.5 2.3 2.6 といった感じのファイルを読み込ませて使うつもりです。 プログラム自体の趣旨は、計測結果などを読み込ませてその値の分布を知ろうかと…… 計算結果をもとにgnuplotでplotすることで正規分布に近い感じが出せたらと思います。
あ、また半角空白でインデントしてしまった…… 見にくくてすみません。
19行目はprint "$y[$n]";でした。 あと27行目もlastはいらなくてprint "$x\t$y[$n]\n"; です。 読ませたデータを元に 0 0 10 1 20 5 30 8 40 6 50 3 60 0 みたいな結果を出します。 第2引数でx軸の間隔を調整してるつもりです。(デフォが10です)
>>755 すいませんでした。
情報の小出しはしないようにと思ってるのに結局やっちゃってますね自分。
>>754 ありがとうございます。ちょっとやってみます。
763 :
デフォルトの名無しさん :05/01/09 22:00:52
>>747 >ハッシュについては、ハッシュ構築時に、$hash{$key} = $value; とするのでなく、
push @{$hash{$key}}, $value;
としてやれば、foreach (@{$hash{$key}}) { ... } によって、同一キーを持つ全ての要素にアクセスできる。
オオボケかますようだけど、それはハッシュなの?
ちょっとだけ、配列かもっていう気がする。
ああいや、気がするだけで、きっと大きな勘違い…
(大日本 perl 初心者連名代表幹事)
ハッシュに配列のリファレンスを入れてるだけだね。 自分もちょっと違和感を感じる。
>>763 >>747 が意図してるのは「配列への参照のハッシュ」だろう。
つまり、push @{$hash{$key}}, $value; というのを分解して書くと、
push @noname_array, $value;
$hash{$key} = \@noname_array; # ここがハッシュですよ奥さん
まあ、これとは別に
>>774 に対して一つ指摘さしてもらうとすれば、
my %hash = { ... }; と、 my %hash = ( ... ); はびみょーに意味が違うってことだ。
前者は無名ハッシュができて、それへの参照を '{}' が返し、その参照への実体が
%hash にコピーされるので、結果は後者と同じだが、実行効率が悪い。
すまん、'{}' と '()' の違いは効率の違いであって
意味の違いかどうかは微妙だな・・・
あと
>>774 は
>>747 、な。
767 :
763 :05/01/09 23:03:23
みなさん、ご教示、ども。 うーん、ていうことは、 push @{$hash{$key}}, $value; というのは、まー、つまり、 push @hash_values, $value; ということで、valuesの配列がハッシュの値に入ってる、ということか。 無名配列コンストラクタ [ ] の方は、頭に入りやすいんですけどね、 こっちは頭に入りにくいな。 (つーか、頭の容量の関係で、無名配列コンストラクタだけでいいです) 達人の道は遠い…
ああ、さらにすまん(死 my %hash = { ... }; で実体がコピーされる、というのは間違い。() と {} は明白に意味が違う。 あと、push @{$hash{$key}} = $value; の分解は、 my $ref_noname_array = (exists $hash{$key}) ? $hash{$key} : []; push @{$ref_noname_array}, $value; と書く方が適切だった。 ・・・Perl は奥が深いっすついていけないっす(汗
ああ、さらにすまん(死
my %hash = { ... }; で実体がコピーされる、というのは間違い。() と {} は明白に意味が違う。
あと、push @{$hash{$key}} = $value; の分解は、
my $ref_noname_array = (exists $hash{$key}) ? $hash{$key} : [];
push @{$ref_noname_array}, $value;
が適切だった。
>>765 の書き方だと、push のたびに配列自体が増えちゃうように取れる(汗
・・・Perl は奥が深いっすついていけないっす(滝汗
ああ、さらにすまん(死
my %hash = { ... }; で実体がコピーされる、というのは間違い。() と {} は明白に意味が違う。
あと、push @{$hash{$key}} = $value; の分解は、
my $ref_noname_array = (exists $hash{$key}) ? $hash{$key} : [];
push @{$ref_noname_array}, $value;
が適切だった。
>>765 の書き方だと、push のたびに配列自体が増えちゃうように取れる(汗
・・・Perl は奥が深いっすついていけないっす(滝汗
ああ、さらにすまん(死
my %hash = { ... }; で実体がコピーされる、というのは間違い。() と {} は明白に意味が違う。
あと、push @{$hash{$key}} = $value; の分解は、
my $ref_noname_array = (exists $hash{$key}) ? $hash{$key} : [];
push @{$ref_noname_array}, $value;
が適切だった。
>>765 の書き方だと、push のたびに配列自体が増えちゃうように取れる(汗
・・・Perl は奥が深いっすついていけないっす(滝汗
772 :
デフォルトの名無しさん :05/01/10 01:54:42
WindowsXP + ActivePerl5.8.6です。 @pattern = ({"aaa" => 0}, {"bbb" => 1}, {"ccc" => 2}, {"ddd" => 3}, {"eee" => 4}); foreach (0..1) { foreach (@pattern) { ($key, $value) = each(%{$_}); print($key . "\n"); } } 以上のようなコードを実行すると aaa bbb ccc ddd eee 空行 空行 空行 空行 空行 このような出力結果になるのですが、 なんで2回目のループの出力がすべて空行に なってしまうのでしょうか?
>>772 お前のプログラムがそのようになっているから。
eachはハッシュ全部読み終わったら次には空リスト
を返すが、%{$_}は全て要素が1つのハッシュだから
2回目のeachでは空リストが返る。
>>773 ありがとうございました。
こんなことでずっと悩んでいました。
もっと精進します。
>>772 >>773 の人が言い尽くしてるんで蛇足かもしれないが、次のように一行追加すると意図どおりなんでないかな?
@pattern = ({"aaa" => 0}, {"bbb" => 1}, {"ccc" => 2}, {"ddd" => 3}, {"eee" => 4});
foreach (0..1) {
foreach (@pattern) {
values %{$_}; # これで、%{$_} が指すハッシュの each の反復履歴がリセットされる。
($key, $value) = each(%{$_});
print($key . "\n");
}
}
暗黙のうちに働いてくれる反復子は便利なのだが、リセット手段を知らないと思わぬバグを呼びかねない。
あと、ハッシュにキーを追加すると each の反復履歴がリセットされるというのはデマらしい。(今しがた実験した。)
>>775 valuesでリセットできるのですね。
勉強になります。
while (($key, $value) = each(%{$_})) {
print($key . "\n");
}
今回はハッシュのキーが複数になる可能性があるので
こんな感じで解決しました。
777 :
デフォルトの名無しさん :05/01/10 12:20:22
>>775 >あと、ハッシュにキーを追加すると
>each の反復履歴がリセットされるというのはデマらしい。(今しがた実験した。)
プログラミングperl第3版 p835 によれば、
反復子をリセットするには、ハッシュの要素をすべて読み込むか、
あるいは、keys %hash か values %hash を評価すればよい。
とあるよ。
要素の追加・削除に関しては、順番が保証されないとあるだけで、
反復子のリセット云々は記述がない。
>>777 おめ。
要素の追加・削除に関しては、プログラミングperl第3版 p835 のもうちょっと下を読めば
『each 関数などによって繰り返しを行っている最中に、ハッシュに対して要素を追加したり削除したりした場合、その動作は保障されない』
とあるので、順番が保障されない以前に、each 反復子をあてにしてる状況では、要素の追加・削除はやっちゃいけないっぽい。
>>775 (関連して
>>776 )
each 反復子のリセットのためだけに values %hash や keys %hash を呼ぶのは時間効率・空間効率の点でどうか、と思わないでもない。
いや、each の実装次第だとは思うので断定はしないけど。(作成されたリストが内部的に保持され、有効活用されるのかも知れないし。)
一つのループ内でハッシュの全要素にアクセスするんなら、each なぞ使わずに
foreach (keys %hash) { ($key, $value) = ($_, $hash{$key}); ... }
とかでどう?
失礼、コード間違えた。正しくは foreach (keys %hash) { ($key, $value) = ($_, $hash{$_}); ... } です。
780 :
デフォルトの名無しさん :05/01/10 15:09:10
>>778 >一つのループ内でハッシュの全要素にアクセスするんなら、each なぞ使わずに
たださ、ハッシュの全要素にアクセスするのに、
while (($key, $value) = each(%hash)) {
処理;
}
を使うのは、もはや定型パターンだから。
クックブック第2版p194にも載っている。
なにも深いこと考えず、ぽんと当てはめればいいという利点があるよね。
(何事にもオライリーの権威に頼る会会長)
>>778 keys,valuesをvoidコンテキストで呼べばeachのリセットだけ
やってくれるのでオススメ。perlfunc(1)のkeysのとこにも
明記されている。
As a side effect, calling keys() resets the HASH's internal
iterator, see "each". (In particular, calling keys() in void
context resets the iterator with no other overhead.)
>>780 サンクスコ。実は効率の点からも、foreach (keys %hash) より each の方が優れていることが確認できますた _| ̄|○
foreach (keys %hash) ってコスト高いみたいね。
要素 40 万個の %hash で、
a: foreach (keys %hash) とした場合; b: each 使った場合; c: keys %hash でリセット後 each 使った場合
の 3 パターンをベンチしたら、所要時間が、a > b ≒ c ですた。
void コンテキストでの keys %hash は早いみたい。(void コンテキストでなくすと、c の速度は 3 秒増した。)
プログラム:
use Benchmark; use strict;
my %hash; for (my $i = 0; $i < 400000; ++$i) { $hash{"ke${i}y"} = $i; }
print "Start!\n";
timethese 10, { a => \&a, b => \&b, c=>\&c };
my @z; sub foo($) { push @z, $_[0]; }
sub a { @z = (); my ($key, $val); foreach (keys %hash) { ($key, $val) = ($_, $hash{$_}); foo($key); foo($val); } }
sub b { @z = (); my ($key, $val); while (($key, $val) = each(%hash)) { foo($key); foo($val); } }
sub c { @z = (); keys %hash; my ($key, $val); while (($key, $val) = each(%hash)) { foo($key); foo($val); } }
結果:
Benchmark: timing 10 iterations of a, b, c...
a: 18 wallclock secs (17.66 usr + 0.09 sys = 17.75 CPU) @ 0.56/s (n=10)
b: 13 wallclock secs (13.09 usr + 0.00 sys = 13.09 CPU) @ 0.76/s (n=10)
c: 14 wallclock secs (13.84 usr + 0.00 sys = 13.84 CPU) @ 0.72/s (n=10)
783 :
デフォルトの名無しさん :05/01/10 15:35:47
>>781 プログラミングperl第3版p872にも似た記述があった。
反復子をリセットしたい場合には、keysを無効コンテキストで
呼べば、これ(ハッシュ全体のスキャン)を回避できる。
>>781 ,
>>782 なるほろ。
リセット手段があくまで keys や values の副作用扱いで、しかも void コンテキストがからむというのがマニアック。
ここらへんの話は FAQ になりそうですな・・・
にしても、私のような不注意者が、each で反復中にキー追加したらどうすんだ!ヽ(`Д´)ノ
Perl6 に期待(えー
785 :
デフォルトの名無しさん :05/01/10 16:07:03
>>782 (1) a だけさらに簡略化可能な余分な処理が入って
いることになぜ気づかないのか。
(2) 巨大配列生成に要する時間が要素数に対し不連
続要素があるかもしれないし、おそらくあるだ
ろうということになぜ気づかないのか。
>>782 サブルーチンaはもっとシンプルにできるでしょう。
それから、foreach keys 対 each 問題は、eachの反復呼び出しのoverheadと
keysが生成する配列のコストのコンペだったはず。
エントリ数がもっと少ない場合は、また違うんじゃないか?
あああああ、
>>782 において、所要時間 a > c という結論は撤回します。人´Д`;)スマネ
>>785 ,
>>786 の指摘通り、比較条件の設定がずさんでした_| ̄|○
a のループ内を { $val = $hash{$_}; foo($_); foo($val); } にして、
かつページングやスワッピングがない(もしくは無視し得る)ことをシステム時間が微小であることで確認し、
かつハッシュ要素数 40 x 反復 100000 回のケースも準備して
a, b, c の順序を変えつつ複数回計測実施してみますたら別な結論に(汗
[N=10, ハッシュ要素数 400000]
項番. a_usr a_sys b_usr b_sys c_usr c_sys
(a->b->c 順、3 回捨て)
04. 14.88 0.05 12.89 0.00 19.12 0.00
05. 15.11 0.00 13.02 0.00 17.16 0.00
06. 14.95 0.00 12.84 0.00 16.66 0.03
(c->b->a 順、3 回捨て)
10. 14.80 0.00 12.91 0.00 16.80 0.02
11. 14.88 0.00 13.05 0.00 17.02 0.03
12. 14.67 0.00 12.80 0.00 16.72 0.08
結果: 所要時間 c > a > b と結論。
a_usr = 14.88±0.05 秒
b_usr = 12.92±0.04 秒
c_usr = 17.25±0.35 秒
a_sys, b_sys, c_sys とも無視し得る。(最大 0.08 秒)
[N=100000, ハッシュ要素数 40] 項番. a_usr a_sys b_usr b_sys c_usr c_sys (a->b->c 順、3 回捨て) 16. 11.720.00 10.83 0.00 13.08 0.00 17. 11.80 0.00 11.08 0.00 13.61 0.00 18. 11.80 0.00 10.80 0.00 13.19 0.00 (c->b->a 順、3 回捨て) 22. 11.99 0.00 11.16 0.00 13.64 0.00 23. 12.00 0.00 11.52 0.00 13.67 0.00 24. 11.69 0.00 11.33 0.00 13.70 0.00 結果: 所要時間 c > a > b と結論。 a_usr = 11.83±0.05 秒 b_usr = 11.12±0.10 秒 c_usr = 13.48±0.10 秒 a_sys, b_sys, c_sys とも無視し得る。(最大時間 計測上 0.00 秒) してみると、void コンテキストで key %hash; が速い説に疑問符がつくね・・・? 検定必要?
暗黒のバッドノウハウが渦巻いているスレはここですか?
やっちまった・・・_| ̄|○|||
>>787 再度撤回。
>>787 ,
>>788 の c は、ループ前にリストコンテキストで key %hash をやったケースでした。(いわば d。)
まとめると、結果は次の通りでした。やっぱ c の方法(void コンテキストで keys %hash 後、each(%hash))がおすすめ。
Rubyst にもあげようか。いいノウハウだから。
>>789 [N=10, ハッシュ 400000 要素]
a_usr = 14.88±0.05 秒
b_usr = 12.92±0.04 秒
c_usr = 12.97±0.08 秒
d_usr = 17.25±0.35 秒
[N=100000, ハッシュ 40 要素]
a_usr = 11.83±0.05 秒
b_usr = 11.12±0.10 秒
c_usr = 11.56±0.03 秒
d_usr = 13.48±0.10 秒
>>778 は気が済んだのかな?
レス
>>787 と
>>788 って、
>>782 とくらべて a が中途半端に最適化されただけで、特に目新しい情報がないよね。
まあ個人的に
>>782 のソース基に追試してみて、a > c なことはよほどのことでもひっくり返りそうにないことがわかったからもういいよ。
流れを遮って申し訳ありません。 perl勉強中の若輩者ですが、諸先輩方のお知恵を拝借したく書き込みます。 ただいま、perl解説本と睨めっこしながら、プログラムを解読してる最中 なのですが、膨大なコードを理解できる部分から逆チャート化し、構造と 内容を判読しています。環境はメモ帳でコード開き、ノートにテンプレートで 流れを書き込み「ああ、なるほど!」と図解で理解を深める低脳児であります。 そこで質問なのですが、 1.諸先輩方の開発環境はどんな構成なのでしょうか? 2.エディタなど活用されていらっしゃると思いますが、エディタ名などをご教授 いただけませんか? 3.長大なコードの全体像を掴むためにどのような工夫をなされておりますか? 諸先輩方は一目でコードを読破されておるとは思いますが なにぶん、初学者な為、何事も一歩一歩 亀の如く理解してる次第であります。
>>793 >1.諸先輩方の開発環境はどんな構成なのでしょうか?
WindowsXP、ActivePerl
>2.エディタなど活用されていらっしゃると思いますが、エディタ名などをご教授
いただけませんか?
MIFES Ver6
>3.長大なコードの全体像を掴むためにどのような工夫をなされておりますか?
技術評論社の「すぐわかるPerl」でPerlの基礎を学び、
同じく技術評論社の「CGI&Perlポケットリファレンス」を片手に
ソースを解読してました。
>>793 1. MacOSX 10.3.7
2. Jedit4
3. コメント文を探す
>>793 1. FreeBSD
2. vi
3. 初学者の段階で長大なコードの全体像なんて掴めるわけがない
>>793 1.FreeBSD
2.vi(elvis),EmEditor
3.最初に大まかな処理の流れを読んでから適当にコメント入れていく
798 :
デフォルトの名無しさん :05/01/10 23:56:30
>>790 面白いな。うちのマシンでは、要素数が2000以下だとaがもっとも早くなる。
結論: あまりこだわるとパラノイアになってしまう。
×いいノウハウ
○無意味なノウハウ
799 :
デフォルトの名無しさん :05/01/11 00:02:02
>>793 1.FreeBSDでEmacs
2.Emacs
3.パッケージ名、サブルーチン名を検索しまくり。
> 諸先輩方は一目でコードを読破されておるとは思いますが
> なにぶん、初学者な為、何事も一歩一歩 亀の如く理解してる次第であります。
わたしは「Perlって何?」から自在になんでも書けるようになるのに
1週間くらいかかった。
大学の研究室のボスは、4時間でそこまで行った。
自分で書かないといかんと思うが。
デマンド/アルゴリズムからその記述法を導き出す方向を学ばないと。
>>793 1. WindowsXP + ActivePerl (+ Mingw or Cigwin)
2. VisualStudio.NET 2003 (つい習慣で。あとバイナリエディタ使いたさで。)
AzEdit V1.010228
3. まずは先頭から拾い読み後、
>>795 〜
>>797 の併用。付け加えるとすれば、
(1) シンボルのネーミングにも注目する。変数一つとっても、名前から意味が想像できると解読が早い。
(2) 可能なら、モジュールを使った簡単なサンプルプログラムを書いて感じをつかむ。
(3) そのコードを好きになる。我を捨てる。
読んでる間は家族も愛人も自分のコーディングスタイルも忘れて夢中になる。
なお 3. については
>>796 の言ってることが私の認識に一番近い気がする。
工夫は人それぞれの適性であって、まずスタイルありきではない。
sjisのテキストを読み込んで検索に使おうと思い、 2バイト文字のメタ文字を無効化する為に、 $str =~ s/([\x81-\x9f\xe0-\xfc])(.)/&sjis2reg($1,$2)/eg; sub sjis2reg { local($j1,$j2) = @_; $j2 = "\\$j2" if $j2 =~ /[\[\\\]\{\|\}]/; $j1.$j2; } このような処理をさせようと思ったのですが、 動かしてみると Unrecognized character \x81 というエラーになります。 バージョンは This is perl, v5.6.1 built for MSWin32-x86-multi-thread です。 何が悪いのでしょうか?
あ、判った 切り貼りしたソースそのものに、全角スペースが入ってました ではでは
↑うわ感じ悪〜。ウソ 800 みたいじゃんかヽ(`Д´)ノ-3 それはそうとして、プログラム読むのも書くのも半分科学じゃなくて訓練の世界だと思うのよね。 Perl だからこう、というノウハウなんてあるのか?
804 :
デフォルトの名無しさん :05/01/11 01:13:35
>>803 > Perl だからこう、というノウハウなんてあるのか?
Perlはたんとバッドノウハウがあるだろ。
$a と $b には警戒せよとか、
無理な拡張を繰り返して奇形化した言語だからね。
>>804 ・・・そうだった。
>>803 書いた瞬間痴呆に陥ってたよ。
Perl は(知ってれば)簡単に書けるのだが読みにくい。
初心者が読む言語としては、獅子がわが子を谷底に突き落とす勢いがある鴨。
806 :
デフォルトの名無しさん :05/01/11 08:43:51
>.805 つーか、 一般の解説本には、誤った解説がごまんと載っていて、 オライリー本と照合すると、驚かされることが多い。 どうして、あんなに誤りが多いのか… たぶん、perlの文法、ハナモゲラ説の原因は、 そんなところにもあると思われ。 ほんの一例を挙げれば、 正規表現の /sオプション (改行文字をマッチに含めるようにする)や /mオプション (^ や $ のマッチの位置を変える)の説明さえ 間違っていたり(複数行マッチをする、とか)、 それどころか、 =~ さえ間違っていたりする (マッチ対象を$_から変える。しかし、真偽を返す機能となっていたり)。 どうなっているのやら。
807 :
806 :05/01/11 08:53:06
>/sオプション (改行文字をマッチに含めるようにする)や /sオプション (普段は改行文字にマッチしない . を、 改行文字をマッチに含めるようにする)や
>>806 > たぶん、perlの文法、ハナモゲラ説の原因は、
> そんなところにもあると思われ。
Perlの解説書が一つもなかったころから、
みんなPerlのめちゃくちゃさを愛してただよ。
集まると「めちゃくちゃだよな〜」
寄ると「でたらめだよな〜」
と言いあって笑ってたのさ。
809 :
デフォルトの名無しさん :05/01/11 12:33:55
1. Linux, cygwin on windows XP 2. emacs, meadow 3. 経験をつむ エディタは、emacs以外は糞
皆様の多数のご意見に感謝の意を述べさせて頂きます。 諸先輩の知恵を拝見し先鞭たる愚かさに気がつく次第お恥ずかしい限りであります。 parl習得の目的は先のコードを解読し、力量及ぶなら自ずからコードを足したい所存。 目的まで早道として、先人のコードをお手本にするつもりでありました。反省 皆様の意見を心にし徒手空拳なれど、先人の遺産を頼らずに、稚拙ながら自作のコードを 練り上げます。その折、苦渋の末、解決策が見つからずお知恵を拝借しに参りますので そのときは宜しくお願い致します。 1.先の質問に付随する疑問なのですが、プログラムの解読のイメージは フローチャート化された発想が脳内に浮かぶのでしょうか? それとも、日常会話の如く、判断材料として意識に吸収されるのでしょうか? 低脳なる私はコード→図的脳内イメージ変換しかできぬ愚直者なもですから...
811 :
デフォルトの名無しさん :05/01/11 13:15:20
>>810 > 目的まで早道として、先人のコードをお手本にするつもりでありました。反省
いや、ある程度読むことも必要だけど、ほどほどにして、自分で書くことも
やらないと。
「やりたいこと」 → 「具体的なコード」
という方向の学習もしないとと。
> 1.先の質問に付随する疑問なのですが、プログラムの解読のイメージは
> フローチャート化された発想が脳内に浮かぶのでしょうか?
フローチャートなんて忘れろ。
>>810 読みにくいから普通の日本語で書けよ。
感謝の気持ちとともにあらたまった言い方をしたいのなら、
単語は平易でもいいから謙譲語と尊敬語で通すように。
>>793 1.Linux(slackware)側で編集する場合はvi
最近はローカル(windows)で作成/編集してLinux側に転送
2.Linuxはvi
Windows側ではWz-Editor4.0Fを使用
3.バックアップファイルにコメント書き入れ+手元でメモ書き
>>810 まずは正しく perl と綴れる様になれ
815 :
806 :05/01/11 15:23:23
>>810 まず、perl自体は仕様の通り正確に動くし、
言語のバグなどはまずないといえるけど、
言語の仕様自体を知るということが、オライリー本以外では
非常に難しいということ。
文法の誤った解説は、(一般解説本の)極めて広範囲に渡っているし、
それが故と思うが、文法ハナモゲラ説さえ言われている。
ハナモゲラは大間違いで、仕様は正確に実現されているけど、
一般解説本を指南書とすれば、ハナモゲラと思うのは無理もない。
それと、処理の結果とかがどんなときに $_ に入るかなどを
知らないと、コードから直接もとのアルゴリズムを知ることは
無理。(なんでも $_ に入るわけじゃなく、仕様として正確に決まっている)
結論として、信頼できる基本的テキストとクックブックなどを
組み合わせるしかないと思う。
処理系のソースも読んだことないのに、本を書くなんて Lispじゃ考えられないのにねえ
ソースなんぞ読まなくて良いからせめて仕様は把握してから執筆してくれ。 あとPerl4時代の遺物が邪魔。use strictは徹底しろ。
オライリー本を読んで書けばいいんだよ!
819 :
デフォルトの名無しさん :05/01/11 20:38:20
みんな、もっと添付ドキュメント読めや。 とても力が入ったドキュメントがいっぱいだぞ。
添付ドキュメントってどこ?
821 :
デフォルトの名無しさん :05/01/11 20:51:06
orz...
822 :
デフォルトの名無しさん :05/01/11 20:55:19
和訳はたまに古いバージョンのをもとにしてることがあるから 原文も見たほうがいいよ。まるっきりウソを書いてるという 経験はないけど、新しい奴だとより説明が明確になってたり、 書いてないことが追加されてたりとかはよくある。
添付ドキュメントだけで理解しろっていうのは、 辞書だけで語学を勉強するようなものな気がする。 普通は辞書を横に置きながら教科書をメインに読んで勉強するよね。
825 :
デフォルトの名無しさん :05/01/11 21:09:21
>>824 べつにそれだけで勉強しろとは言っとらん。
オライリーオライリーとそればっかなので
添付ドキュメントに注意を促しただけ。
それに、チュートリアルもいろいろ入ってるよ。
>>824 それはその通りだがおまいはたぶんもっと辞書をみたほうがいい。
多くの辞書で初学者向けの手引きにページを割いてる。
827 :
デフォルトの名無しさん :05/01/11 22:02:45
>>825 と書いてから改めて見てみると、
チュートリアル、初心者向けイントロダクション、
クイックスタート、例示集などいろいろあるな。
faqはもちろん外せないし。
もしも仕様が知りたいと言うことなら、perldocを読むべきだろうけど、 何より、CPANなどで手に入るモジュールを読むことがとても 勉強につながる(と思う)。 で、CPANのモジュールを読むきっかけとしては、Perlで何か動く プログラムを作ることが大切かなぁ、、と。 >> 793 1. Linux か Windows 2. vi か メモ帳 3. 必要なところをすばやく見つけるのは技術。 自分でそれなりに長いコードを書いたりすれば身に付くのでは。
829 :
デフォルトの名無しさん :05/01/11 22:16:45
リチャード・ストールマンが perl を学ぼうとして、 付属のドキュメントだけでやって挫折して、 誰かがオライリーの本ならいいよ、というのを聞いて、 なぜあれがオープンソースじゃないだと悪態をついている のを何かで読んだよ。 なぜストールマンは挫折したのか? 1 頭が悪かった。 2 付属ドキュメントが悪かった。 正解 性格が悪かった…
「オライリー」とやらは糞。添付ドキュメントだけで十分。でFA?
831 :
デフォルトの名無しさん :05/01/11 22:20:05
3で割り切れる数値の表示の仕方を教えてください
832 :
デフォルトの名無しさん :05/01/11 22:31:52
>>831 100までの3で割り切れる数とかなら、こんなとこかな。
@result = grep !($_ % 3) ,(1..100);
print "@result\n";
833 :
デフォルトの名無しさん :05/01/11 22:45:22
>>831 > 3で割り切れる数値の表示の仕方を教えてください
my $i = 0;
while (1) {
print $i++ * 3 . "\n";
}
# 終わらない。
え、ちがう?
プラグマって何ですか?
Windowsにてテキストファイルとバイナリファイルを判別する方法ってありますか?
>>835 レス、サンクス。
>something special
これを詳しく。できれば日本語で。さらに例を挙げて。
838 :
835 :05/01/11 23:39:13
>>837 日本語だ、ほれ。深海に潜っているときに必要らしいぞ。
使用のように厳しいコマンドは pragmaと呼ばれます。
Pragmasはあなたのプログラムを動かすとき特別な何かをする
Perlインタプリタへの指示です。
使用厳しい、悪いソフトウェアを書くのをより困難にする2つのことをします:
それで、あなたはすべての変数(「厳しいvars」)を宣言します、そして、
あなたが潜水艦(「厳しい潜水艦」)を使用しているときPerlがあなたの
意志を間違うのをより困難にします。
プログラムで1か2つのタイプの厳しさを使用するだけでありたいなら、
あなたが 使用厳しいpragmaに彼らを記載することができますか、またはあなたは、
あなたが、より早く可能にした厳しさのいずれかすべてをオフにするのに特別な
ノー厳しいpragmaを使用することができます。
>>838 なんか、悪かったよ。すまん。そしてサンクス。
use strict;みたいな挙動って事で思い込んでおくよ。
840 :
デフォルトの名無しさん :05/01/11 23:56:59
>>836 > Windowsにてテキストファイルとバイナリファイルを判別する方法ってありますか?
それは主として「テキストファイル」をどう定義するかによるな。
とりあえずfile typeをチェックするモジュールにはFile::MMagicがあったりする。
841 :
836 :05/01/12 00:18:45
>>840 さんくすこ
ここで言うバイナリファイルはACSII文字以外のコード(文字?)が入っているファイルを指します
しかし、使い方というか返り値がよくわからん・・・
>841 日本語はどうする
>>836 微妙に気になったんだが、Windows上のPerlにて だよな?
use strict submarine...;
use yellow submarine;
...厳しい潜水艦;
848 :
デフォルトの名無しさん :05/01/12 01:02:50
>>841 そういうシンプルなので良いのなら、昔から、ある程度先まで読んで、
最上位ビットが立っているバイトがあったらバイナリと看做すとか
いうアドホックかつ確率的な方法が用いられていたが……
windowsなら拡張子で判別しろや!
ラクダ本初版だっけ、には最初の 1000byte くらい読んで 20% の非 ASCII があったらバイナリと判定する、なんて記述を見たような...
-B filename で出来るよ 精度悪いけど
オレオレ Larry・・・いえ、何でもありま栓。 処理系のソースを読んでから本を書くなんて Perlじゃ考えられないねえ というのは冗談だが、内容が内容なだけに Perl 処理系のレキシカルアナライザ( 相 当 部分)を読む者は摂食障害を起こすらしいYO。(by O'LEILLY 本 第3版) ところで、出遅れた話題で恐縮なんですが、Eclipse (epic) の名前が出てこないけどあれは糞なんどうなん? もっとも漏れは(改行問題には目をつぶるとして)SJIS でコメントや自分用 pod を書ければいいのであって別に Visual Studio + コマンドプロンプトのままでもいいんだけど。
853 :
デフォルトの名無しさん :05/01/12 21:36:34
>>850 プログラミングperl第3版p115によれば、
ファイルテスト演算子の -B や -T は、ファイルの最初の約1ブロック分の
データを調べて、コントロールコードや最上位ビットが立っている文字
(UTF-8に見えないもの)を捜し、そのような文字が3分の1よりも
多ければバイナリ、そうでなければ、テキストファイルと判定するということだ。
あと、最初のブロックの中に、ASCIIのNULL文字(\0)が含まれている
ものは、バイナリファイルと判定する。
ほかにも判定基準があるようだが、このへんでいいだろ。
854 :
デフォルトの名無しさん :05/01/12 21:45:40
>>852 Eclipseってよく知らんけどさ、
RADツールとかIDEとかは懲りて、止めにしたという人も多いと思うよ。
結局、開発元が開発やめたら、そのコードはどうにも
ならなくなるんだよな。
EclipseのライバルだったとおぼしきvisualCafeとか、
この世から消えてなくなったよねぇ。
Beansとかだって、最近はどうなんだい?
天下のSunがやってるにしては、名前も聞かない。
Eclipseはいつまで持つんだろう?
マイクロソフトだったら大丈夫というもの、それだって、
怪しいもんだ。VisualBasicやってた人たちも .NETになって、
ずいぶん肩身がせまくなって困ってるみたいだし。
IDEとかRADで一番困るのは、言語は同じはずなのに、
ほかのツールで作られたものと組み合わせられない。
エディタだけで書けるのが、一番だよ。
一般のエディタでVSのIntellisenceが使えたらいいなぁ
>>854 さんくスこ。つまり、Eclipse は今が旬であると理解し田(<電波受信
しかし、『RADツールとかIDEとかは懲りて、止めにしたという人も多い』から
『開発元が開発やめ』るんだとしたら再帰的で巣わ(笑)
IDE 相乗的にだめぽ。
857 :
853 :05/01/12 23:43:02
858 :
853 :05/01/13 00:16:28
http://www.cmagazine.jp/q/old.html#index17 より引用。
Q. バイナリファイルの判定
たとえば、ASCIIコードと改行などわずかなコントロールコードだけで構成される
ファイルの場合、プレーン・テキストだと類推できます。
また、ほとんどのバイナリファイルには特徴的なコードが埋め込まれているので、
そこからどんなタイプのファイルなのかを知ることができます。たとえば、
「%PDF-1.3」で始まる文字列が書き込まれていれば、Acrobatで読むことのできる
PDFファイルであることがわかりますし、先頭に「#!/bin/sh」とあれば
シェルスクリプトです。
バイナリの実行ファイルなども同様で、OSなど実行環境に特有のコードパターンが
書き込まれています。このパターンを「マジック」あるいは「マジックナンバー」と
呼びます。UNIXの file (1) コマンドは、「ファイルシステム>マジック>言語」の
順でチェックを行い、ファイルの種類を判別しています。
マジックにはたくさんの種類がありますので、ぜんぶ自分で調べてプログラムを
つくっていては骨が折れますから、file(1)でも参照しているマジックナンバーの
リスト(/usr/share/magicなど)を利用するとよいかもしれません。
859 :
853 :05/01/13 00:18:43
(引用続き) ●簡単な方法はない。文字コードを調べていく その前に「何がテキストで、何がバイナリか」という問題があります。 ASCIIテキストファイルだけなら話は簡単なのですが(それぞれのバイトが表示可能か どうかisprint()関数で調べていけばよい)、日本語など、一文字に複数バイトを使う 言語のテキストファイルだと難しくなってきます。とくに日本語は文字コード (表現方式)が複数あるため、違う文字コードを想定すると読むことができません。 また「ちょっとだけデータが壊れているテキストファイルをどう扱うか」という問題 もあります。 結論を言うと、簡単な方法はないと思います。あらかじめ文字コードを想定し (JIS、シフトJIS、EUC、Unicodeなど)、その方式に合致しているかいちいち判別しな ければならないようです。文字コードの構造、判別方法は煩雑すぎるのでここでは 説明できません。参考資料などを見てください。 もう寝る。それじゃ。
エディタしか使えない漏れには 相対的にIDE使ってるやつらが眩しく見えるのだが…
Perl 板 isprint。(本当か? my @visible_chrs = split(//, "\t\n\r" . ' ,!"#$%&\'()*+,-./' . '0123456789:;<=>?' . '@ABCDEFGHIJKLMNO' . 'PQRSTUVWXYZ[\\]^_' . 'abcdefghijklmno' . 'pqrstuvwxyz{|}~' ); my %isprint = (); foreach (@visible_chrs) { $isprint{$_} = 1; } で、$isprint('x') とかして使う予定は未定。
862 :
デフォルトの名無しさん :05/01/13 00:44:02
>>860 > エディタしか使えない漏れには
> 相対的にIDE使ってるやつらが眩しく見えるのだが…
そういう時は、IDEを使ってみるといいです!!
わたしゃ、IDEは、自転車の補助輪のようなもんという認識だが。
補助輪の再発明
864 :
853 :05/01/13 00:55:09
>>864 いやすまん。それはわかっていた。
ただ読んでるうちに、Perl に標準で <ctype> 系関数が付いないと知ったときの困惑と怒りを思い出したまでだ。
866 :
デフォルトの名無しさん :05/01/13 01:12:07
>>860 Eclipseは perl でも利用できるんだから、
ぜひ人柱として挑戦して、レポートしてほしかったりしますが。
IDE は地球を救うが Perl は救わない。 なぜなら、全 Pealer が手にしたオライリー本が地上の山や川や木を(ry
メモ帳派少ないな
最低限の機能しかないからな
ぶっちゃけメモ帳つかうくらいなら ed つかう。
871 :
デフォルトの名無しさん :05/01/13 08:35:05
windows98 で cygwin の perl 5.8.6 を起動すると、 PERL.EXE ファイルは 欠陥エクスポート NTDLL.DLL:atoi にリンクされています。 と出て、使えないんですけど、どうすれば使えるようになるでしょうか。
Visual Perlって使うと幸せになれますか? いつもWindows機上で作成して、Linux機上で動作するperlスクリプトを書いているんですが。
>>872 最初っからLinux機上でスクリプト書けば良いじゃん?
>>873 様々な制約から作業環境はwindowsという点は変更できないのです。
875 :
デフォルトの名無しさん :05/01/13 15:26:11
>>874 IDEを使うことによって、
なにが出来るようになることを期待してるか、を
はっきりさせないと。
どういうことを期待してるのかなぁ。
単にOSの壁を乗り越えるということならば、
perlはそんなもの必要としてないし。
それと、IDEはコードの製作方法を押し付けてくるからね。
まず、作ろうとするコードがデザインパターンのなにに
あたるかとか、そういうところから始まって、
フィールドは何? メソッドは何? とかね。
それで、RAD機能を売り物にするツールなら、
裏でコードを自動生成してくれるけど、
良し悪しいろいろだから…。ありがたがるか、うんざりするか。
Cプラプラとか、Javaならなけりゃやってられないだろうけど、
perlでIDEはどうだろうかねぇ。
亀レスだけど...
>>484 デフォルトでは Latin 1 だけど、use encoding で文字コードを
指定すると、そのコードになるようだ。
perluniintro の Legacy Encodings を読んでて気づいた。
>>875 OSの壁に関してはおっしゃる通り期待しておりません。
何を期待しているか?と問われると、現状特に不満がないので何も期待していません。
ならいいじゃん?って言われるとごもっともなのですが、
私の想像外で、実際に使って思いがけなく「こんな所が楽になる」というお話が聞ければ…
と、思い質問した次第です。
と、ここまで書いて「一度使ってみれば?」と、自分にレスしたくなりました orz
878 :
デフォルトの名無しさん :05/01/13 17:26:28
pack関数の意味がよく分からないので 解説をお願いできませんでしょうか? バイナリデータというのもよく分かりません。
>>865 普通、正規表現の [:print:] とか使わない?
>>880 ありがとうございます。読ませていただきました。
読んでいて使い方は少しずつ分かってきたのですが、
「バイナリ構造体にパックする」というのが
何のことなのかさっぱり分かりませんでした。
885 :
デフォルトの名無しさん :05/01/13 18:57:47
>>884 基本的には、なにかとデータをやり取りするときに、
データの型とサイズを保証するために使うんだと思うよ。
たとえば、データベース(DBMとかRDB)とやり取りするとき、
データがある型にはまってないと、えらいことになるわけ。
1レコードに入っているのが55バイトで、それは、
最初の何バイトが文字型で、それから何バイトが数値型で、とか。
それが狂うと、めちゃくちゃになっちゃう。
だから、データを登録するとき、packを使って、
サイズとか型を保証するの。
データを出すときも、(packを使って登録したんだから)、
unpackすれば、正しく取り出せるという寸法だよ。
バイナリ構造体 = pack(型指定文字列,パックするリスト値) パックするリスト値の型を、型指定通りに解釈するとバイナリ構造体になりますよ って程度に覚えれば十分。
配列データをバイトサイズにパックして、もとに戻す例: my @bin = (0x48, 0x65, 0x6C, 0x6F, 0x21, 0x0A); # 6 要素の配列。メモリ上のイメージは複雑で、perl 処理系にしか解釈できない。 my $str = pack('C*', @bin); # @bin の各要素を、バイトサイズに「パックする」 print $str; # すると、"\x48\x65\x6C\x6F\x21\x0A" という文字列になる。(つまり "Hello!\n") # これは C で書かれた関数やシステムコールにも(1バイト文字の列として)解釈できる。 my @bin2 = unpack('C*', $str); # unpack でもとに戻せる。(@bin2 は、@bin と同じになる) もちろん 'C*' 以外を使って、バイトサイズ以外のパックもできる。
888 :
デフォルトの名無しさん :05/01/13 20:00:30
特に関数でもないのに { 数行 } { 数行 } という書き方をすることのメリットを、
変数のスコープを、
890 :
デフォルトの名無しさん :05/01/13 20:10:22
>>888 裸のブロック( naked block)のことかね。
それは、そこだけ有効なローカル変数が使えるということ
なんじゃない?
それと、裸のブロックは制御構造も提供する。
たとえば、lastで抜けることが出来る。
あくまで一例だが、例えば、次のような使い方とか。 my @a = (0, 1, 2, 3, 4); { local $" = ', '; print "@a\n"; # これは、"0, 1, 2, 3, 4,\n" として表示される(ちょーわかりやすい)。 } print "@a\n"; # これは、"0 1 2 3 4\n" として表示される。(後を濁さない) 同様のテクは $[ なんかでも使うね。漏れは。
pack,unpackは確かに俺も昔は意味分からんかった
バイナリ構造体にパックすると言われてもバイナリ構造体が何かも分からんし、パックするとは何をすることかも分からんかった
まぁパックした(とおぼしき)データをファイルに書き出して、バイナリエディタで覗いたりして何とか理解できたなぁ
>>884 やってみそ
とりあえず型指定子のHが理解できれば他も似たようなもんだ
>>892 #! /usr/bin/perl
use strict;
use Devel::Peek;
use encoding 'Shift_JIS';
my $s0 = pack('C0C*', 0x90, 0x7E);
my $s1 = pack('U0C*', 0xE6, 0x88, 0xBF);
Dump($s0);
Dump($s1);
my $s = $s0 . $s1;
Dump($s);
とすると、$s0 は Shift_JIS として扱われて UTF-8 に変換され、元から
UTF-8 の $s1 と くっついて $s になるのが確認できる。
ていうか、perl でバイナリエディタ作るとき使うのは unpack だったりする罠。 use utf8; my @file = <>; foreach (@file) { my $hex_line = unpack('H*', $_); print "$hex_line\n"; }
皆さんどうもありがとうございます。
pack関数でつまづいたのがURLエンコードのところだったので、
>>880 の3つめのリンク先の、
(1)
$char = "%83%7E%83P%83l%83R";
$char =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("H2", $1)/eg;
(2)
$char = "%83%7E%83P%83l%83R";
$char =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1) )/eg;
この(1)と(2)について詳しく教えていただきたいです。
どちらも変換後の$charは「ミケネコ」になるようですが、どういう処理なのか
よく分かりません。変換前の$charには「l」とか「R」とかが含まれているのに、
それらはどこで変換されているんでしょうか?
>>887 の「バイトサイズにパックする」というのもイマイチよく分かりません…。
とりあえず、型指定文字(?)の「H」と「C」について知りたいです。
よろしくお願いいたします。
>変換前の$charには「l」とか「R」とかが含まれているのに、それらはどこで変換されているんでしょうか? これはサイトが間違ってると思われ
>>897 分解して考えませう。まず (1) の pack("H2", $1) の理解のため、ためしに pack("H2", "2A") を実行してみれ。
つまり次のコードだ。
print pack("H2", "2A"), "\n";
すると画面には "*" が表示されるね。すなわち上の pack は、'*' という文字のキャラクタコード 0x2a を返したことになる。
この例で、pack の第 2 引数に与えた "2A" というバイト列を、
「上位ニブル-下位ニブルの順に並んだ16 進 2 桁とみなせ」という意味なのが型指定子 "H2"。
pack はそうやって解釈してできた数値を返す。
(正確には本来、数値のリストを返すんだが、この例では型指定子 "H2" が 0x00〜0xff までの数値 1 個しか作り出せないので、'*' 一文字だけが出力された。)
なお "H2" にはこのように 2 文字分の解釈しかしないので、たとえば
print pack("H2", "2Al"), "\n";
だと、末尾の 'l' は単に無視される。サイトがまちがってるにしても、結果は'ミケネコ'。
あとは自力でがんばれ。超がんばれ。
>>897 スマン、嘘書いといて超がんばれもないな・・・
> 正確には本来、数値のリストを返すんだが、
この部分間違い。pack が返すのはスカラーですじゃ(unpack と混同した)。
「数値のリスト」は「バイト列」に読み替えてちょ。
>
>>887 の「バイトサイズにパックする」
これは感覚的にわかるけど、正しい言い方はどうなん?
この伝でいくと、1234 という十進数の unpacked BCD 結果である 0x1234 を指して、
「ニブルサイズに pack した十進数」と言えてしまうわけだが。
902 :
デフォルトの名無しさん :05/01/14 00:29:23
>>897 なにをどうしたいのか、よく分かんないけど、
packはともかく、もしurlエンコードをしたいというなら、
それ用のモジュールを使うことで解決かと。
車輪の再発明をしても仕方ないし。
HとかCとかいったってさ、単に16進文字列と
char型(1バイト長符合なし整数)というだけなんじゃ?
H2なら、それが2バイトとちゃうん?
C言語の型に直してるというだけだよね???
(C言語、よく分かってない奴だから、怪しさ100%!)
903 :
デフォルトの名無しさん :05/01/14 02:33:40
>>855 > 一般のエディタでVSのIntellisenceが使えたらいいなぁ
Emacsの上に高度開発環境を実現するパッケージで、Intellisenseも入れているのが
あるな。
904 :
デフォルトの名無しさん :05/01/14 04:04:33
>>904 エディタの普通の入力補完じゃダメなの?
たとえば、サクラエディタでは、
設定メニューのタイプ別設定から、支援タプを選ぶと、
入力補完用のファイルを選べるんだが、ここで、
サクラエディタのファルダの中からperlのキーワードの
ファイルを選んで設定しておくと、
最初の1文字か2文字で該当するperlのコマンドの一覧が
出てくるよ(コントロールキーとスペースキーを押すとね)。
w を推すと、while とか 頭に w の付くコマンドが出てくる。
(warn wait wantarray とか、数えたら全部で6個だった)
普通のエディタのこういう機能で十分じゃないの?
それ以上の機能のことを言ってるの???
906 :
デフォルトの名無しさん :05/01/14 04:47:53
>>903 > > 一般のエディタでVSのIntellisenceが使えたらいいなぁ
>
> Emacsの上に高度開発環境を実現するパッケージで、Intellisenseも入れているのが
> あるな。
と思ったら、Perlはサポートしてないな(まだ?)
CEDET - Collection of Emacs Development Emvironment Tools
http://cedet.sourceforge.net/semantic.shtml のことだが。
他にもあるかな?
907 :
デフォルトの名無しさん :05/01/14 04:49:50
>>904 > エディタの普通の入力補完じゃダメなの?
しらん。
> 最初の1文字か2文字で該当するperlのコマンドの一覧が
> 出てくるよ(コントロールキーとスペースキーを押すとね)。
> w を推すと、while とか 頭に w の付くコマンドが出てくる。
Emacsのperl-modeはもっと毛むくじゃらなこともできる。
みんな最初は「すげ〜、すげ〜」と驚嘆するが、やがて
オフにする。
>>907 > Emacsのperl-modeはもっと毛むくじゃらなこともできる。
> みんな最初は「すげ〜、すげ〜」と驚嘆するが、
どうやるの、おせーて。
>>907 > > エディタの普通の入力補完じゃダメなの?
>
> しらん。
( ゚д゚).....baka?
910 :
デフォルトの名無しさん :05/01/14 09:37:45
質問だぜ wantarrayみたいなコトをやりたいんだけど、 関数の呼び出し元が「ハッシュ」で求めてるか「配列変数」で求めてるかを 関数側で認知したいんだけどどうしたらいいんだい?ベイビー
911 :
897 :05/01/14 09:39:24
お世話になっています。
>>899 を元にして自分で色々やってみたところ、pack("H2", "2A")では「*」が表示されましたが、
>>897 の「ミケネコ」に関しては、どうしても自力では理解できそうにないです。
とりあえず、(1)と(2)を実行すると確かに"%83%7E%83P%83l%83R"は「ミケネコ」になるので
サイトは間違っていないようなのですが、文字コードの変換ができるやつで調べてみたところ、
16進コードは次のようになっていました。
ミ→837E ケ→8350 ネ→836C コ→8352
"%83%7E%83P%83l%83R"を見ると、「P」や「l」や「R」が入っていて意味不明だったのですが、
これの16進コードがちょうど次のようになっていました。
(だから何?というのはちょっと分からないんですけど…)
P→50 l→6C R→52
それで、pack("H4", "837E")は「ミ」になるのは何となく分かりました。
この第2引数のところを「83P」、「83l」、「83R」にしても、それぞれ「ケ」「ネ」「コ」には
なりませんでしたが、「8350」、「836C」、「8352」にすれば「ケ」「ネ」「コ」になりました。
そしてpack("H2", "83P")も「ケ」にはなりませんが、
$test = "83P";
$test =~ s/([0-9a-fA-F][0-9a-fA-F])/pack("H2", $1)/eg;
とすると何故か$testが「ケ」になりました。
これはどういうことなんでしょうか? ますます分からなくなってきました。
どなたかご教授お願いいたします…。
(※16進数についてはほとんどよく分からないので何か間違っているかもしれません)
>>911 いいセンいってますなあ。置換演算子 s///eg の働きを考えればゴールに到達すると思うよ。たとえば
$test = "%83P";
$test =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("H2", $1)/eg;
において、
1. s///eg の働きにより、$1 として pack に渡るのは "83" だけ。(<重要)
2. その "83" が pack により "\x83" というデータ(0x83 という数値の1バイト表現)に置換される。
3. 従って、$test の内容は、"\x83P" となる。
4. 'P' のキャラクタコードは 0x50 だから、"\x83P" eq "\x83\x50"。すなわち 'ケ' となる。
>>899 が 『'l' は無視される』とか言ってたけど、これは半分しか正しくない。
(1) の例全体でみると、s///eg の働きにより、実際に 'l' が pack に渡ることはない。(上の例の 'P' のごとく。)
仮に pack に渡されたとすると、無視されるんだが、実際には渡されないのでそのまま残る。
んで、最終的に 'l' は文字コードの一部なんであって、無視されるわけではない。
>>910 $ref_hogera が何かへの参照であるとして、ref $ref_hogera としてくんな。
配列なら 'ARRAY', ハッシュなら 'HASH' と返る。
(配列でもハッシュでもないなら、それ以外の文字列が返る。)
>>901 しょうもないツッコミ。unpacked と packed が逆。
1234 --> 0x12, 0x34 というバイト列(すなわち "\x12\x34") で表現するのが packed BCD。
1234 --> 0x01, 0x02, 0x03, 0x04 というバイト列(すなわち "\x01\x02\x03\x04" で表現するのが unpacked BCD。
>>912 勘弁して下さい。
普通に関数からの代入で戻り値を取りたいです。
>>913 CPANのWant.pm
コンパイルが必要だが。
>>914 今しがた pod install Want.pm で最新版をインストールしたんだが、ドキュメントの SYNOPSYS に間違いがあるっぽい。
サブルーチン foo の中の want('LIST') を want('ARRAY') に変えて、その次の行の (1, 2, 3) を [1, 2, 3] に変えると動いた。
my %hash = %{foo()};
print "$hash{bar}\n";# 23 と表示される。
my @array = @{foo()};
print $array[2];# 3 と表示される。
916 :
デフォルトの名無しさん :05/01/14 15:47:26
Win2000SP4、Perl5.8.4 なんですが、 最近 Time::Local の timelocal がエラーを出すようになり、 どうもその原因が localtime の引数に負の値を入れると undef になることのようなのです。 (undef の変数で計算しようとするため Use of uninitialized value in ... と言われる。) print(localtime(-1)); をテストすると、linux や solaris では 595981070400 が表示されるようですが、Windows では何も表示されません。 しかし最近までは Time::Local でエラーは出ていなかったので、 この現象はなかったと思うのですが、他にW2Kで同様のエラーが出る方はいますでしょうか? 最近の変化といえばWindows Updateが幾つかあったことくらいですが、 それがlocaltimeに影響を及ぼすということがあるんでしょうか…?
917 :
デフォルトの名無しさん :05/01/14 20:28:28
>>871 perl を 5.8.6-2 に入れ替えたら、windows98でも使えるようになりました。
>>915 は、手前の脳の間違いを直したほうが良い。
919 :
デフォルトの名無しさん :05/01/14 22:21:50
>>911 横からだけど、ちょいと思ったことを。
H2 とは、そもそもなんだろう?
そもそも、1バイトは、0〜255の間の256段階が取れるよね。
0(10進)は00(16進)で、255(10進)はff(16進)となる。
で、このHは曲者だと思うんだ。
ここで、ff(16進)があるよね。
どうも、(packにおける大文字の)Hは前の方(上位)のfで、
(packにおける小文字の)hは後ろの方(下位)のfらしい。
(というのも、プログラミングperl第3版の記載によるんだが)
ミ→83 7E ケ→83 50 ネ→83 6C コ→83 52 を見てほしい。
いずれも16進数が4桁、(16進数が2桁で1バイトだから)、
ミも ケも ネも コも、それぞれ2バイト文字ということになる。
そこで H2 だ。
H2とは、この最初の16進数二つのこと。(ミケネコのいずれにも共通の83)
つまり、H2の2とは、2バイトの2じゃなくて、その半分の1バイトなんだ。
だまされるところだった。
後ろの16進数2つを扱うには、
小文字の h2 を使う。
そういうことだと思うんだが、違うんだろうか?
(プログラミングperlの訳が、このあたり曖昧。
おそらく原文にははっきりそう書いてあるんだろうと思う)
このあたりはC言語の型を流用してるんだと思うから、
Cの分かる人は、すぐ分かるんだと思うな。
>>919 上位下位というよりもオーダーだろ
Hは上位下位の順、hは下位上位の順
だからH2とすれば上位4bit、下位4bitの順で16進値が出てくる、と
pack("H*", "837E8350836C8352")
こういうことが出来るし
>>920 >だからH2とすれば上位4bit、下位4bitの順で16進値が出てくる、と
これじゃunpackだorz
16進値を上位4bit、下位4bitの順で割り当てる、と読み替えてください・・・
そうですか。 今回は諦めることにしたぜ。
923 :
919 :05/01/14 23:55:56
ああ、違う違う、なにをやっているのか。
日本語は2バイトなんで、頭がこんがらがるから、英数字のみを
考える。アスキーコードというやつだな。
たとえば、A のコードは41(16進数)。
http://hp.vector.co.jp/authors/VA016117/c/memory2.html というわけで、英数字は全部1バイトだから、
00(16進数)〜ff(16進数)で表される。(ちなみにこれは、10進数の0〜255のことだよね)
ところがここで、16進数の二桁をばらして考えるんだな。
16進数一桁は、0.5バイトであり、4ビットでもある。1ビットは on off の2値だから、
2の4乗で16ということだ。実は、ニブルとも呼ばれるらしい。
さて、ここで出てくるのが、pack の H と h 。
A のコードである41 を 41 の順でpackするのが H。
A のコードである41 を 14 と逆順でpackするのが h。
これは、
$temp = pack("H2",83); # 大文字のH2
$result = unpack("h2",$temp); # 小文字のh2
print $result;
とすると、83 と入れたのが 38 と出てくるので、確認できる。
H h にしろ、2単位で(H2 あるいは h2)で1バイトだから、
2単位ではじめて英数字1文字を扱えるというわけだ。
日本語だったら、2バイトだから、H4 あるいは h4で
はじめて1文字扱えるということになるね。
ややこしいね。失礼、一人相撲だね。
あら、レスくれてた方がいた。つき合わせて、ごめん。
ヽ|/ / ̄ ̄ ̄`ヽ、 / ヽ / / \ │ | (彡) ( ミ)||| | \ | // ̄⌒ ̄ヽヽ | ハァー | | .l~ ̄~ヽ | | / | ヽ  ̄~ ̄ ノ | |  ̄ ̄∪ |
925 :
デフォルトの名無しさん :05/01/15 00:28:37
どなたか頼みます。
>プログラミングperlの訳が、このあたり曖昧。 ラクダ本「バイナリと16進数のパックでは、countは、生成されるバイト数ではなく、ビットやニブルの個数を表す。」 (゚д゚)
それじゃただの(゚д゚)ウマーだ
レスが長くて読みたくないが、「とにかく*つける」と 覚えとけばあんたらの処理には問題ないんじゃないのか?
929 :
911 :05/01/15 01:18:12
ありがとうございます。
あともう少しで分かってきそうです。
>>912 の1は分かります。2、3もほとんど分かりました。
でも4のところが分かりません。
"\x83P"と"\x83\x50"をprintで見てみたところ、どちらも「ケ」になりましたが
前者("\x83P")が何故そうなるのかがよく分かりませんでした。
これは最初のpack関数の話からそれているかもしれませんが、
よろしければ解説をお願いいたします。
932 :
929 :05/01/15 17:46:15
>>930 Pの16進コードが0x50なのは分かるのですが、
print "\x83P";
では、pack関数みたいなものも使っていないのに、
どういう処理で「P」→「\x50」と変換されるのかが分かりません。
print "P";
だと普通に「P」だけが表示されるのに。
print文は、前の文字が16進数だと後の文字も16進数に変換する…とかでしょうか?
>>932 まずマルチバイト文字がどういうものかわかってないようだね
この場合、文字コードはShift JISなわけだけれど、その構造が、
1バイト目が81〜9F、E0〜FCなら次のもう一バイトとあわせてひとつの文字になる。
で、「ケ」という文字は83 50なわけだけれど、ここから83をとってやると50が残る。
50は単体出てくるとPという文字になる。
逆に、Pの前に83を取り付けてやると、ケになる
それとPと\x50が等価というのもわかっているか怪しい文面だな・・・
Perlは文字列リテラル中に\xHHがあると、それを1バイトの文字に展開する。
だから"P"と"\x50"は同じもの
934 :
デフォルトの名無しさん :05/01/15 19:14:23
いつもはDTM板にいるけど、間違って違う板クリックしたら、 何を言ってるのかさっぱりわからん。かっこいいなおめーら
漏れも、多分
>>910 がやろうと思ってることをやりたくてちょっと試してみたんですが、
いかんせん >910, >912, >913, >914, >915, >918, >922 のやりとりは断片的すぎて漏れの理解でいいかわからないので確認させてください。
1. >910 がやりたいのは
@array = foo(); と、
%hash = foo(); を foo の中で区別すること。
いわば「配列コンテキスト」と「ハッシュコンテキスト」の区別。
2. >912 が言ったのは、
foo(\@array) とか foo(\%hash) とかしてリファレンスを渡してやれば foo の中で区別できるじゃん、ということ。
3. >914、>915、>918 を総合すると、
(ppm install Want.pm として) Want.pm をインスコすれば、@{foo()}、%{foo()} の区別ならできる。
いわば 「配列へのリファレンスのコンテキスト」と「ハッシュへのリファレンスのコンテキスト」の区別は可。
ただし、SYNOPSIS は間違ってはいない。(>915 が期待動作を誤解してるだけ。)
もっと凝った区別もできるのだが、1.はできない。
4. 結局 1. ができなさそうなので、質問者が >922 で投了を宣言した。
でいいんかな?(@◇@;)
「まちガッチョル」とか、「1.はこうすれば実現できる」とか、「〜という理由で、1.は不可能」とか言う人、います?
>>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なら次のもう一バイトとあわせてひとつの文字になる。
もうそろそろ誰か次スレ立てれ