Perlについての質問箱 14箱目
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
NGNG"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
0002デフォルトの名無しさん
NGNG1 http://pc.2ch.net/tech/kako/1017/10177/1017736187.html
2 http://pc3.2ch.net/tech/kako/1033/10336/1033688230.html
3 http://pc2.2ch.net/tech/kako/1041/10412/1041205885.html
4 http://pc2.2ch.net/tech/kako/1048/10485/1048519394.html
5 http://pc5.2ch.net/tech/kako/1053/10530/1053053082.html
6 http://pc5.2ch.net/tech/kako/1060/10606/1060689008.html
7 http://pc2.2ch.net/test/read.cgi/tech/1068051036/
8 http://pc2.2ch.net/test/read.cgi/tech/1074151549/
9 http://pc5.2ch.net/test/read.cgi/tech/1079114157/
10 http://pc5.2ch.net/test/read.cgi/tech/1085564875/
11 http://pc5.2ch.net/test/read.cgi/tech/1090889189/
12 http://pc5.2ch.net/test/read.cgi/tech/1094579428/
13 http://pc5.2ch.net/test/read.cgi/tech/1097851764/
0003デフォルトの名無しさん
NGNGPerlプログラミング講座: http://www5a.biglobe.ne.jp/~n_rieko/perl/
[本]
リャマ: http://www.oreilly.co.jp/books/4873111269/
駱駝: http://www.oreilly.co.jp/books/4873110963/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/books/4873110378/
[オンラインマニュアル]
Perldoc.com: http://www.perldoc.com/
perldoc.jp: http://www.perldoc.jp/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://homepage3.nifty.com/hippo2000/
[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
Perlの小技: http://homepage3.nifty.com/hippo2000/perltips/index.htm
0004デフォルトの名無しさん
NGNGスレ立て乙!
0005デフォルトの名無しさん
NGNG0006デフォルトの名無しさん
NGNGhttp://www.perl.com/CPAN/src/
まだ出ていないのか、もうすぐ出るのか、ガセなのか、、、
0007デフォルトの名無しさん
NGNGあれ?なんでperl.comに無いんだろう。
http://search.cpan.org/~nwclark/perl-5.8.6/
0008デフォルトの名無しさん
NGNG0009デフォルトの名無しさん
NGNG0010デフォルトの名無しさん
NGNGそれよか、5.8.5→5.8.6の変更点教えれ。
それによってインスコするかどう−か考えるから。
0011デフォルトの名無しさん
NGNGメンテナンスリリースです。
http://www.cpan.org/src/
http://www.cpan.org/src/perl-5.8.6.tar.gz
Changes はこちら。
http://search.cpan.org/src/NWCLARK/perl-5.8.6/Changes
0012デフォルトの名無しさん
NGNGChanges より perldelta の方が嬉しい人多いんじゃないかな。
http://search.cpan.org/src/NWCLARK/perl-5.8.6/pod/perl586delta.pod
0013デフォルトの名無しさん
NGNG結構、バグフィクスありまつね。utf-8の扱いで不正な文字があっても
正常に対応できるようになったとか。漏れなんか、utf-8で多言語扱って
るからバージョンアップした方がいいみたい。
0014デフォルトの名無しさん
NGNGDebian 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入れました。
原因わかる方いらっしゃいますか?
0015デフォルトの名無しさん
NGNG0016デフォルトの名無しさん
NGNGなんのためにメンテナーががんばってると思ってんじゃボケ
0017デフォルトの名無しさん
NGNG0018デフォルトの名無しさん
NGNGwget を使って実現するにはどうすればよいでしょうか。
0019デフォルトの名無しさん
NGNG0020デフォルトの名無しさん
NGNGすいません。>18はperlの話です。
0021デフォルトの名無しさん
NGNG0023デフォルトの名無しさん
NGNGそういうことじゃないです。脳が少ないようなのでもういいです。
0024デフォルトの名無しさん
NGNGもっとちゃんと説明する必要があるんじゃないの?
>>18 の質問だと、おそらくみんな >>21 が正解だと思うよ。
0025デフォルトの名無しさん
NGNGみんなって誰と誰と誰ですか?
あなたの脳内の人たちですか?
0026デフォルトの名無しさん
NGNG0027デフォルトの名無しさん
NGNGウワ。逃げやがった。
0028デフォルトの名無しさん
NGNGまあ私の脳内と思ってもらってもいいけども、
実際、ちゃんとしたレスがもらえて無いじゃない?
0029デフォルトの名無しさん
NGNGちゃんとしたレスがもらえませんでした。
0030デフォルトの名無しさん
NGNG0031デフォルトの名無しさん
NGNGまた逃げやがった。
0032デフォルトの名無しさん
NGNGそういうことじゃないです。脳が少ないようなのでもういいです。
0033デフォルトの名無しさん
NGNGみんなって誰と誰と誰ですか?
あなたの脳内の人たちですか?
0034デフォルトの名無しさん
NGNG$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で確認
あるいは他にいい正規表現があれば教えてください。
0035デフォルトの名無しさん
NGNGたとえば、 (:?$date1|$date2) に着目すると、
$date1 か $date2 のどちらか片方にマッチしたとしても、
そこだけで $1 から $6 まで占めちゃう。
ので、@dateval の内容を取り出す際に、
$1, $2, $3 または $4, $5, $6 のうちのセットされているどちらか一方だけを
とりだして 年,月,日 とするようにすればいいかと。
0036デフォルトの名無しさん
NGNG> たとえば、 (:?$date1|$date2) に着目すると、
> $date1 か $date2 のどちらか片方にマッチしたとしても、
> そこだけで $1 から $6 まで占めちゃう。
なるほど。
たしかに例えば「2004/11/29 235959」という文字列に対してマッチングさせたら
@dateval[0 .. 2]と@dateval[9 .. 11]にキャプチャされていて
仮に時間が省略されていたとしてもマッチさえすれば
$#dateval=11になっていることも確認できました。
ありがとうございましたm(_"_)m
0037デフォルトの名無しさん
NGNGStrange 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';
のままだし。。。
0038デフォルトの名無しさん
NGNGあれ?CPANのは0.79になっているなぁ。。。
0039デフォルトの名無しさん
NGNGこれを使って、『半角文字5個分』のマッチングを行いたいのです。
例えば、
:abcde:
:fgh__:
:ijkl_:
:m____:
:no___:
(_ は半角スペースだと思ってください)
のようにコロンとコロンの間に半角文字5個分の領域を取って書いてあるテキストで
パターンマッチングを行いたいのですが、:と:の間のマッチングを
どのように記述していいのかわからないのです。
\w{5} を使えば:abcde: の部分はマッチングが行えますが、他の4行はダメですよね。
\S{5} を使っても、\Sは『スペース以外の全ての文字』なのでダメだと思います。
全ての文字と、スペースを含めて半角5個分をマッチングさせる方法があったら教えてください。
よろしくお願いします。
0041デフォルトの名無しさん
NGNG0042デフォルトの名無しさん
NGNGこれでいい?
/[\w\s]{5}/
0043デフォルトの名無しさん
NGNG004439
NGNG0045デフォルトの名無しさん
NGNG0046デフォルトの名無しさん
NGNG0047デフォルトの名無しさん
NGNG0048デフォルトの名無しさん
NGNG見分ける手段というのはありますでしょうか?
別にPerlじゃなくたってこれでできるというのがあれば、ポインタでも教えて頂ければありがたいです。
0049デフォルトの名無しさん
NGNGあるかないかと言えばある。回答終わり。
ポインタ?
0050デフォルトの名無しさん
NGNGjcode.pl の getcode() 関数を使うとできるかも。
0051デフォルトの名無しさん
NGNGポインタっていうか、ここ見たらあるから見れとかそういうのでもってことでした。
ちなみに、手間でなければその方法をお教え願えないでしょうか?m(_ _)m
>>50
ありがとございます。
試みてみます。
0052デフォルトの名無しさん
NGNG$binary = 1 if $str =~ /[\x0-\x8\xb\xc\xe-\x1f]/;
こんな感じかな。どうせ厳密なのはできないし。
0053デフォルトの名無しさん
NGNGそれだと ISO-2022-JP が救えなさそうだけど大丈夫かな?
0054デフォルトの名無しさん
NGNG見てみたら、ドイツ語と日本語混在のDOCてutf-16で書かれてたよ。
>>48は、ひょっとして同じことやろうとしてるのか。
0055デフォルトの名無しさん
NGNGCOM でやれば?
0056デフォルトの名無しさん
NGNGhttp://www.dehenken.co.jp/products/doccat/doccat.html
0057デフォルトの名無しさん
NGNGwv でやれば?
005854
NGNG情報、どもども。
とりあえず、wv(うぉーunix対応)ダウソしてみまつた。
これまで、xdoc2txt(free)つーのと「なんでもテキスト屋さん」
(share)つーの試して未丹やけど、日本語はうまくいくんだが、
ドイツ語特殊文字がぜんーぶダメポだったんよ。
でけたら、いつか報告始末ね。(今日は忙し)
005954
NGNGだけだと。何つうかな、記号類(機種依存文字かな)をいちいち指定
しないとダメポですたが。
006054
NGNGOpenOffice入れなくて済むのにぃ。
0061デフォルトの名無しさん
NGNGカンマ区切りかタブ区切りかぐらいにしてくれるツール無い?
perlで作ったやつ一人くらい居そうな気がするんだが
0062デフォルトの名無しさん
NGNG0063デフォルトの名無しさん
NGNGで、 CPAN は調べたんだろうな?
0064デフォルトの名無しさん
NGNGforeach (@abc) {
と
foreach (@$abc) {
の違いって何でしょうか?
前者は 配列 abc の各要素毎の処理で、
後者は 変数 abc で示された文字列の名称の配列の各要素毎の処理、
という理解であってますか?
0065デフォルトの名無しさん
NGNG@{$abc}の省略記法です。ラクダ本のリファレンスの章を読んでみると分かりやすいと思います。
0066デフォルトの名無しさん
NGNGあえがとうございます。
リファレンス、ですね。
勉強してみます。
0067デフォルトの名無しさん
NGNG0068デフォルトの名無しさん
NGNGActivePerl
ttp://www.activestate.com/
GUI作りたいならPerl/Tk使っとけ
0069デフォルトの名無しさん
NGNG$ua->cookie_jar($cookie_jar);
$ua->timeout(600);
$request = POST("https://〜hogehoge〜/" ,[%form_data]);
$res = $ua->request($request);
$_ = $res->content;
上で'500 read failed:'って帰ってくるんですけど、対処方法はないですか?
timeoutは意味をなしていない見たいだし。
0070デフォルトの名無しさん
NGNG0071デフォルトの名無しさん
NGNG$c=4;
ではエラーになる(当然)のに、
use strict;
$a=4;
ではエラーにならないのはなぜですか? $aを$bにしても同じです。
0072デフォルトの名無しさん
NGNG0073デフォルトの名無しさん
NGNGちゃんと読め
0074デフォルトの名無しさん
NGNGDBDにSQLserver用のドライバありませんでしたっけ?
前に見た記憶があるんですが..私の記憶違い??
CPANさんやーいorz
0075デフォルトの名無しさん
NGNGCPAN
って、どう読めばいいのでつか?
0076デフォルトの名無しさん
NGNG惜しい! 7秒前に書き込めば・・・
0077デフォルトの名無しさん
NGNGハッシをまだ使いこなせていません。例えば、
一つのファイルは、
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
のようにハッシュをつかって表示させるのはどうやればいいのでしょうか?
0078デフォルトの名無しさん
NGNG$hash[$file1_leftvalue} = $file1_rightvalue;
}
ループ{
printf("%d %d %d\n", $file2_leftvalue, $hash{$file2_leftvalue}, $file2_rightvalue);
}
0079デフォルトの名無しさん
NGNG@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);
}
0080デフォルトの名無しさん
NGNGprint OUT @NEW1;
close;
if (!open(OUT,">$ufile"))
print OUT @NEW2;
close;
同じファイルに出力しているようなのですが?・・・
0081デフォルトの名無しさん
NGNG$ufile = $UDATA_DIR_C[$num].;
としているので、違うファイルです
0082デフォルトの名無しさん
NGNG0083デフォルトの名無しさん
NGNGprint OUT "@{'NEW'.$num}";
とすればその部分はいけると思うけど、全体見直した方がいくない?
0084デフォルトの名無しさん
NGNG0085デフォルトの名無しさん
NGNG>>83
まじ、サンクスコです
0086デフォルトの名無しさん
NGNG配列の中の空白をとる置換をしようとおもうのですが
@NEW =~ tr/ //;
だと置換が行われないようです。一レコードづつ置換しないとだめでしょうか?
0087デフォルトの名無しさん
NGNGYES.
tr/ //d for @NEW;
0088デフォルトの名無しさん
NGNGおまえはスクリプトが完成するまで質問し続ける気かね
0089デフォルトの名無しさん
NGNG0090デフォルトの名無しさん
NGNG最初はハッシュ要素に配列入れようとしてたが、方法が分からずに
>>79みたいな変な実装になってるんだろう
>>78は全然間違った回答してるしw
0091デフォルトの名無しさん
NGNGサンクスです
0092デフォルトの名無しさん
NGNGforeach $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をすると自動的に空白がはいってしまうようです。なぜでしょうか?
0093デフォルトの名無しさん
NGNG前スレ866さん、出番です(笑)
866 名前:デフォルトの名無しさん 投稿日:04/11/23 19:26:38
>>864
どっかで
print WRITE "@value";
とかやってんだろ。
0094デフォルトの名無しさん
NGNGおまえはスクリプトが完成するまで質問し続ける気かね
0095デフォルトの名無しさん
NGNGSir! 完成後も続けます! Sir!
0096デフォルトの名無しさん
NGNG0097デフォルトの名無しさん
NGNG0098デフォルトの名無しさん
NGNGんや、半角の空白
どう考えてもおかしい pushする直前にダンプしてもはいてないけど、push後にははいっている
perl5のバグかな
0099デフォルトの名無しさん
NGNG'@@@0@@@'."\n";
を
'@@@0'."\n";
ではだめですか?
010092
NGNGどうもです、今試したんですが
なぜかうまくいきました・・・ サンクスです
が理由がわかりましぇん
0101デフォルトの名無しさん
NGNGforeach $num (0 .. $#STOCK) {
$line = $STOCK[$num];
なんてやるぐらいならはじめから
foreach $line (@STOCK) {
にしろよ。$numそこでしか使ってないからいらないだろ。
0102デフォルトの名無しさん
NGNG0103デフォルトの名無しさん
NGNG010492
NGNG0105デフォルトの名無しさん
NGNGそれがPerl流
0107デフォルトの名無しさん
NGNG0108デフォルトの名無しさん
NGNGwhile(open(IN,<*.txt>)) {
みたいなファイルの開き方しちゃった時、
ループ内で「今開いとるファイル名」を得る方法ってありませんでしょか。
前もって$filename = glob("*.txt");
とかするより楽な方法が、なんかあるんじゃないかと気になって眠れない。
0109デフォルトの名無しさん
NGNGそんなファイルの開き方しちゃダメです。@負荷増大
opendir Dir_entry, './' or die;
for (grep /\.txt$/, readdir Dir_entry){
open IN, '<', $_ or last;
...
}
とか。
0110デフォルトの名無しさん
NGNGひとつひとつ横着せずにやりますか。
0111デフォルトの名無しさん
NGNGopen IN $_;
my $file = $_;
とか
0112デフォルトの名無しさん
NGNG0113デフォルトの名無しさん
NGNG0114デフォルトの名無しさん
NGNGどうやばいの?
0115デフォルトの名無しさん
NGNG超使いやすい。やばすぎる。
0117デフォルトの名無しさん
NGNGWin32のActivePerl5でドライブのレディ状態を調べたいのです。
if ( &drive_ready_check( 'A' ) ){
print "Aドライブはレディー状態です\n";
}else{
print "Aドライブはノットレディー状態です\n";
}
という感じで使いたいのです。
よろしくお願いします。
0118デフォルトの名無しさん
NGNGCPANぐらい検索しろよ。driveとreadyをキーワードでひけば
ttp://search.cpan.org/~mblaz/Win32-DriveInfo-0.06/DriveInfo.pm
てのが一発で出るよ。これのIsReadyってのがソレっぽい。
0119デフォルトの名無しさん
NGNG早速の返答ありがとうございました
やってみます
0120デフォルトの名無しさん
NGNGParse::RecDescent(以下、P::RDと呼びます)はnew() モジュール・メソッドを使って新しい文法を作ります。
各P::RD文法は、P::RDクラスにブレスされたオブジェクトになり、文法中の各ルールはメソッドとして、
アクションを起こすために使用します。P::RD文法は構文解析プロセスに統合された 一部として、
それぞれのルールにアクションを関連付けます。これは非常に重要なことです。
Perl 5では構文解析は自分自身へのイベントであり、アクションは、大都会に至る道すがら、
遠くからでも猫を混乱させることが証明されている拡張構文を使って轢き殺した、路上轢死体のようなものです。
この違いにより、一致が検出された時に何かが起こるようにするという点で、
P::RDはPerl 5の正規表現よりもずっと効果的なものになります。
翻訳されてても読めません、先生。
0121デフォルトの名無しさん
NGNGどうやばいの?
0122ど
NGNGその場合は
routine.pl
に全部入れておいて、呼び出す方のファイルに
require "routine.pl";
と書けばいいだけなのでしょうか?
0123デフォルトの名無しさん
NGNGそだね"1;"を忘れないように。
ってかファイル名気持ち悪いので複数形に汁
0124デフォルトの名無しさん
NGNG0125ど
NGNGできたのですが、最後の1は何か意味があるのでしょうか。よく理解できません。
0126デフォルトの名無しさん
NGNGperlfunc(1)のrequireの項よめ。
初期化コードの実行がうまくいったことを示すた
めに、ファイルは真を返さなければなりませんから、真を
返すようになっている自信がある場合を除いては、ファイ
ルの最後に "1;" と書くのが習慣です。 実行文を追加す
るような場合に備えて、"1;" と書いておいた方が良いで
しょう。
0127デフォルトの名無しさん
NGNGA | 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でソートをするというのはなんとなくわかるのですが、ソート結果出力を
その値がある行全体を表示して出力する、というやり方がわからないのです。
どなたかわかる方いらっしゃいましたら教えていただきたいです。
よろしくお願いいたします。
0128デフォルトの名無しさん
NGNG先に分解するんじゃなくてソートするときに分解したら
0129128
NGNGほれ。
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;
0130デフォルトの名無しさん
NGNGsort { $b->[ 1] <=> $a->[ 1 ]}
map { [ $_ , m/ (\S+)$/ ] } <>;
0131デフォルトの名無しさん
NGNGありがとうございます。
>>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の外に記述する、といった感じなのですか?
せっかく教えていただいたのに理解できずに申し訳ないです。
勉強を続けなくては…。
0132デフォルトの名無しさん
NGNGそもそもsort関数が、perlで用意されてるのをご存じか?と、訊きたい。
0133デフォルトの名無しさん
NGNG>>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 );
…あんま変わらんか
0134デフォルトの名無しさん
NGNGhttp://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_do_I_sort_an_array_by_anyth
http://perldoc.com/perl5.8.4/pod/func/sort.html
http://perlmonks.thepen.com/128722.html
0135ど
NGNG>>1を見る限りでは、もうすぐという感じなのですが。
0136デフォルトの名無しさん
NGNGすれ違いだけど
どんな本読んでるか教えて
おれのは、CGI&PERLポケットリファレンス、perl&CGI入門ゼミナール
0137デフォルトの名無しさん
NGNGとりあえずその本捨てろ、O'Reillyの本を読め
後、スキルあるんじゃないぞ、これ位は普通
ていうか最近質問のレベル低すぎる
0138デフォルトの名無しさん
NGNG目を覆いたくなるほどのものがある。
0139デフォルトの名無しさん
NGNGファイナライザみたいなのはできるでしょうか?
たとえば、ネットワーククライアントで、
処理中に途中で例外が発生して return しようすると、
そこで勝手に自動的に close() してくれる、みたいな感じのができるといいのですが。
0140デフォルトの名無しさん
NGNGとか使えば?
0141デフォルトの名無しさん
NGNGO'Reilly って洋書ジャン
翻訳で挫折しそう 俺の場合は汎用機やってたか
そっちの言語は分かるが、perlの省略した形やデータ属性がないことに違和感を感じるね
0142デフォルトの名無しさん
NGNG0143デフォルトの名無しさん
NGNGCPAN
の読み方を知りたいっす.....
0144デフォルトの名無しさん
NGNGスィーピャヌ
0145デフォルトの名無しさん
NGNGオブジェクトにはデストラクタを指定できる。
例えば、IO::Fileなどは自動的にcloseしてくれるし、
CPANで配布されているオブジェクト指向モジュールはその辺適当に始末してくれる事がおおい。
自分でやるにせよ、生のハンドルは使わず、オブジェクトで包んで使うのが無難だな。
>>143
しーぱん
0146デフォルトの名無しさん
NGNGなんだかPerlよりPHPのほうが強力、という記事をよく見ます。
(CGIに限ってのことかもしれないですが)
ここに現れる皆さんはPerlの熟練者の方達ばかりだと思いますが、
そのような方達がPerlを現在も使っているのはどんな理由からですか?
学生の僕には、
・Unix系のOSには最初からPerlが入っているから
・PerlのCGIで作られたホームページが多いから
といったような、「使っている人が多いから」くらいしか思い浮かびません。
熟練者の方から見て、PHPと比べたPerlの利点・欠点を教えていただければうれしいです。
0147デフォルトの名無しさん
NGNGレベルどうこう以前にこういう質問の方が嫌なんだが。すぐ荒れるし。
PerlとPHPでは出自がちがう。
sed awkといったフィルタ言語の流れで生まれたのがPerl。
そのテキスト処理能力があまりに強力なので、CGIに多用された。
PHPはWebサーバー上での使用を念頭に入れて開発された。
そういう場での使用にかなり特化されたつくりをしている。
CGIでPerl使う気にはもうなれんという人がいても別に不思議じゃないが
ターミナル上での書き捨てスクリプトつくるのに俺はPHP使う気にゃなれんし
そういう事例で言語自体の出来を云々するのはオロカ。
オロカな比較は実に多いので気にする必要なし。
てか、言語同士比較してるよりなんでもいいから使ってみ。
0148デフォルトの名無しさん
NGNGそれぞれ得意、不得意があるからケースバイケースで使い分ける。
荒れるのはPHPしか出来ない奴がPHP至上主義で刃向かってくることが
原因である事が多々ある。
0149デフォルトの名無しさん
NGNGhttp://www.oreilly.co.jp/books/perl/
初めてのperl 正・続 と クックブックがお勧めかな。
続のオブジェクト指向の記述はわけわかだけど
(リファレンスの使い方の記述は分かりやすいんだけどね)、
クックブックのは比較的分かりやすい。
(ほかで、オブジェクト指向の入門的知識を仕入れてないとダメだけど。
オブジェクト指向が分からんと、もうモジュールもまともに使えないし)
高いけど、オライリーの本をやらないと、結局、ダメだと思うよ。
0150146
NGNG知らなかったとはいえ、荒れる要素を含む質問をしてしまい、申し訳ありません。
これから活用したいと思うスレが荒れるのはイヤなので回答はもう結構です。
回答してくださったお二方、どうもありがとうございました。
0151デフォルトの名無しさん
NGNG本当は、mod_perlとDBIを備えるperlの方がより強力なんじゃないの?
(宣伝文句と違い、PHPはmod_perlより早いわけじゃないし、
DBIなら裏のデータベースが変わっても、らくらく対応だし。
ボラクルでもどんとこい!)
それ以外の用途では、基本的にperlじゃないとやれないし。
0152デフォルトの名無しさん
NGNG企業対個人って時点で当たり前なんだけど。
0153デフォルトの名無しさん
NGNG打ち切った後の回答で悪いが
どちらかではなくて両方覚えるのがイイよ
(同時じゃなくていい、好きな方を先にやって残りを後から)
そして、自分で考えて使い分けるのがいい
0154デフォルトの名無しさん
NGNGPerlとPHPのどっちを先に勉強したほうがいいのか、ということじゃないか?
それこそどっちが活躍の機会が多いか、とかのような感じで。
ワシ的にはPerl。
なぜなら、やはり今ではPerlでCGIを使っているシステムが多いから。
別にPerlの使用用途はCGIだけじゃないが。
0155デフォルトの名無しさん
NGNGレスありがとうございます。
>>145 さんのは DESTROY ってやつですね。
これがまさに探していたものでした。これでうまくいきました。
ありがとうございました。
0156デフォルトの名無しさん
NGNG手軽な言語 → Web でも使える
って流れで考えた方が良いと思うが
0157デフォルトの名無しさん
NGNG使おうとしているソフトの中の一機能として、Win32::GUIが必要だとあるのですが、
そのパッケージなどを探してみると、ActivePerl用のPPMパッケージ等しか見つかりません
perlが何たるかもわかっていないところに問題があるとも思いますが、
導入方法に関して取っ掛かりをつけていただけないでしょうか
0158デフォルトの名無しさん
NGNGhttp://search.cpan.org/~lrocher/Win32-GUI-1.0/
モジュールなら、とりあえずCPANで探す癖を付けるのが良いぞ
CPANモジュールを使ったインストール方法も覚えておくべし
0159デフォルトの名無しさん
NGNGCPANというものを使ってやってみようと思います
0160デフォルトの名無しさん
NGNGオーレイってシリーズもんでよく書店にあるやつだねー
高くて見てなかったので、見て見ます サンクスコ
0161デフォルトの名無しさん
NGNG0162デフォルトの名無しさん
NGNGなんで、ファイルよむためだけにロックする必要があるんでしょうか?
>>161
私もオーレイってよんでます。
むしろ、日本語読みすると、オーレイのが正しいしぃ。
0163デフォルトの名無しさん
NGNGエンスーっぽい
0164デフォルトの名無しさん
NGNG$hoge = stat($time)[9]
print $hoge
で、23424545のような、意味不明な数字の文字列がでてくるんですが、
これを、年月日時分秒のようにわかりやすい形にするにはどうしたらいいんしょ?
0165デフォルトの名無しさん
NGNG読むだけ同士ならいくつ同時に読んでもなんともないが、
書き換えをする奴が混ざると書き換え途中の変な状態を
読むかもしれない。なので読むだけの奴はLOCK_SHを、
書き換えする奴はLOCK_EXをそれぞれ使うのが普通。
0166デフォルトの名無しさん
NGNGオーライ !
0167デフォルトの名無しさん
NGNGO'Reilly自身がオライリーって表記してるんだから...
0168デフォルトの名無しさん
NGNG0169デフォルトの名無しさん
NGNGPOSIX::ctime
0170デフォルトの名無しさん
NGNGそのコード通るか?
localtime でググれ
0171デフォルトの名無しさん
NGNGオーライ!
0173デフォルトの名無しさん
NGNG$hoge = (stat($time))[9]
0174デフォルトの名無しさん
NGNG$timeという名前をつけるのはいかがな
ものかと。
0175デフォルトの名無しさん
NGNGopen PIPE, "command 2>&1 |";
とか書いたりしますが、標準入力と標準エラーを別々のハンドルで分けて
開くのってどうやったらよいのでしょうか?
0176デフォルトの名無しさん
NGNG0177デフォルトの名無しさん
NGNGありがとうございます。
open3でググってみました。waitpidという言葉がところどころ見えるのですが
これは自分でwaitしなくてはいけないと(すればよい)と考えればよいですよね。
0178デフォルトの名無しさん
NGNGCpanでインストしようとしたら
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
0179デフォルトの名無しさん
NGNGprint"$resec[3]";
}
という文を実行すると、$resec[3]の内容が表示されてしまいます。
@resecの4番目の要素は、pq370という文字列です。
これはなぜなんでしょうか。
0180デフォルトの名無しさん
NGNGもっと詳しく。うちでは表示されない。
0181デフォルトの名無しさん
NGNG> Writing Makefile for Win32::GUI
> Makefile:339: *** ハャホ・オュケ讀遉、、ニ、、、゙、ケ。」テ貊゚。」
> /usr/bin/make -- NOT OK
> というエラーが出てしまいます
>
化けの部分は、
Makefile:339: *** 分離記号を欠いています。中止。
だわ。
0182デフォルトの名無しさん
NGNGなにしてんの?
if($resec[3] eq '0'){
if($resec[3] eq ''){
if($resec[3] == 0){
どれ?
0183デフォルトの名無しさん
NGNGeqで整数と比べるなよ。
0184デフォルトの名無しさん
NGNGありがとうございます
0185179
NGNG文字を==で比較した場合や、数字をeqで比較した場合はどのようなことが内部で行われているのでしょうか。
今回の場合は、@resec内には0と文字列の両方が含まれています。
0186デフォルトの名無しさん
NGNGDBI でカラム名(フィールド名)をリストを抜き出す関数ってありませんか?
$sth->fetchrow_array で抜き出す配列と同じ順番で出したいのですが..
0187186
NGNG失礼しました。
perldoc 隅々まで眼を読んだらありました。
スレ汚し申し訳ありません。
0188デフォルトの名無しさん
NGNGドキュメントや書籍を読もうという気は微塵もないのですか?
0189デフォルトの名無しさん
NGNG謝るぐらいならどうやればできたかも書けよ
0190デフォルトの名無しさん
NGNGMakefile.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が作られると考えていたのですが、ほかにどこか修正し忘れのような点はありますか?
0191179
NGNG0192デフォルトの名無しさん
NGNGあいにく養護学校に勤務した経験がないもんでね(w
0193デフォルトの名無しさん
NGNGmakeのバージョン(ていうか、実装系)を疑った方がいいかもね
Win系のモジュールの中には、特定のコンパイラに依存しているのとかあるし
0194デフォルトの名無しさん
NGNGオーレイ一冊買うのすらケチってるとあとでロクなことないですよ
0195デフォルトの名無しさん
NGNG0196デフォルトの名無しさん
NGNG0197デフォルトの名無しさん
NGNGDLしたいのですが、どれをどうDLするかとか何処にも書いてないので
全然わかりません
言葉の意味もまともに分かりません
教えて欲しいのですが、板違いならどこの板できけばいいですか?
0198デフォルトの名無しさん
NGNG0199デフォルトの名無しさん
NGNGもろ>>1のリンク先にあるぞ。
英語読めないとはいえOSの名前ぐらいわかるだろ。
0200デフォルトの名無しさん
NGNGさらにいろいろやってみているのですが、
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
となります
自分で消したファイルに文句言われても対処のし様が…
あきらめた方がいいのかとも思うのですが。
0202デフォルトの名無しさん
NGNGあとUNIXとか、コマンドプロンプトとかもよくわかりません
教えて君ですっごい申し訳ないです
0203デフォルトの名無しさん
NGNGUNIXのコマンドラインと、プロンプトの二つがごっちゃになってました
0204デフォルトの名無しさん
NGNG>>192
0205デフォルトの名無しさん
NGNG0206デフォルトの名無しさん
NGNGuse 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に変換しなきゃ駄目なんでしょうか?
0207デフォルトの名無しさん
NGNGGETリクエストでリダイレクトが返ってきた時、LocationヘッダのURLを取得したいのですが、可能でしょうか。
$cookie_jar = HTTP::Cookies->new(file => "$ENV{'HOME'}/.temp_cookies.txt", autosave => 1, ignore_discard => 1);
$ua = LWP::UserAgent->new;
$ua->cookie_jar($cookie_jar);
$url = "http:.//hoge.example.com/redirect.jsp";
$request = HTTP::Request->new(GET => $url);
このようなコードを書いたのですが、複数回リダイレクトするため、途中のURLがわからなくなってしまいます。
HTTP::Liteでヘッダ取得して頑張るという手段も考えたのですが、Cookieも使いたいのでできればLWPでやりたいです。
よろしくお願いします。
0208デフォルトの名無しさん
NGNGLWP::UserAgentでrequests_redirectableを空にしとけばいいんでねーの?
試してはいないが。
0209デフォルトの名無しさん
NGNGreaddir は UTF-8 でなくて生でデータがはいってくるはず。そのままでは
SJIS 文字列にマッチしない(1バイトめと2バイトめがなきわかれになって
いることが length をとってみればわかる)ので、Encode::decode とかを
つかって変換してやればオッケー。
use encoding って一見便利なようにみえて動きがわかりづらいのがいやん。
0210デフォルトの名無しさん
NGNGヤフーなんかは、拡張子が無いようにも思われます。
どなたかご伝授下さい。
0211デフォルトの名無しさん
NGNGスレ違い、使ってるWebサーバのスレに行け
0212デフォルトの名無しさん
NGNG下記のサンプルソースで 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";
}
0213デフォルトの名無しさん
NGNG0214デフォルトの名無しさん
NGNG0215デフォルトの名無しさん
NGNGで裸のワードを禁止にするべし。
0216207
NGNGできました。
$ua = LWP::UserAgent->new;
@{ $ua->{'requests_redirectable'} } = ();
とし、後は$res->is_redirectでリダイレクトを調べ、$res->header('Location');で全部取得できました。
どうもありがとうございました。
0217デフォルトの名無しさん
NGNG0218デフォルトの名無しさん
NGNGthx!!!
0219デフォルトの名無しさん
NGNGreaddirってopenと違って :encoding() で指定できないからだろうけどね。>use encodingで対応してない
0220デフォルトの名無しさん
NGNG[変数, 変数] っていう形が全然何を表しているのかわからん・・。
自分のレベル的にはまだオライリ−の『初めてのPerl』読んでる程度。
この本に載ってなかったらどの本のどこらへんを読めばいいのか教えてくれると激しく嬉しい・・・・。
0222デフォルトの名無しさん
NGNGTkをインスコしようとしたらコンパイルエラーで落ちます。
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を脳みそコネコネコンパイルします。
0223デフォルトの名無しさん
NGNGActivePerlを入れてる私は、神ですか?
0224206
NGNGいまさらですがencode,decode使うといけました。ありが�d
perlって、読み込んだ文字列がdecode前か後か知ってる癖に、自動で変換とかしてくれないんですね…
これじゃencoding意味ないよ!ヽ(`Д´)ノ
0225デフォルトの名無しさん
NGNG0226デフォルトの名無しさん
NGNGその根拠は?
$_には自動で値が入るし、数値と文字列の相互変換も自動。
そもそも面倒な作業―特にテキスト処理―を自動化するのにこそ、
向いている言語だと思うが違うか?
いや、CGI作るために使ってる香具師には関係無いか
0227デフォルトの名無しさん
NGNG0228デフォルトの名無しさん
NGNG==「使用上」という単語を含む<TD>〜</TD>までの文字列を削除したい==
<TD>・・</TD>
<TD>〜使用上〜</TD>
<TD></TD>
============================================================
・下記のパターンマッチを考えては見ましたが、
文章内に T やD があるとマッチしてくれません。
<TD>[^(<TD>)]*使用上[^(</TD>)]*</TD>
<TD>〜特定の単語 との間に <TD> という文字列が存在しない、
という設定は可能でしょうか?
0229デフォルトの名無しさん
NGNG0230デフォルトの名無しさん
NGNG{
index($1,'使用中')==-1?$1:''
}isge;
いまいちか・・・・
0231デフォルトの名無しさん
NGNGちゃんとした本読めよ。
ただのお遊びならかまわんが、仕事がらみじゃ即座にクビだぞ。
0233デフォルトの名無しさん
NGNGいやだって、decode前のencodingが分かんないから。
分かってればuse openとかで変えられるわけで。
(もっともuse openはグローバルじゃないのが困りモノだけど)
んで、ファイル名に関してはencodingを指定できる場所がない、と。
filenameとかのプラグマを作ってreaddirを上書きすればいいんじゃね?
0234デフォルトの名無しさん
NGNGそれは文字セット [ ] の使い方間違えてるだけだ
$reg = qr{ <TD> ((?!</TD>).)*? 使用上 .*? </TD> }isx;
$string =~ s/$reg//g;
正規表現、絞込みと再帰が使えたらなあ…
0235デフォルトの名無しさん
NGNGPerl6の正規表現はすごいらしいよ
0236デフォルトの名無しさん
NGNGs{<TD>.*?</TD>}{index($1,'使用上')? '': $1}g
あたりでどうだろうか
0237デフォルトの名無しさん
NGNGs{<TD>.*?</TD>}{index($1,'使用上')? '': $1}ge
0238デフォルトの名無しさん
NGNGありがとうございました。
<<231
参考に使用している本を教えてくださいな。
<<235
更に正規表現が難しくなるのか・・
0239デフォルトの名無しさん
NGNGレスアンカーくらいまともに打てないのかね?
0242デフォルトの名無しさん
NGNG1バイトずれてマッチする問題の対策が入ってないな。
use utf8前提ならいいがそうでないなら厳密には
まずそう。3文字もあるとそうめったに偶然マッチ
することはないけどね(笑) たとえばEUCで1バイト
ずれると「藩兢」が含まれるがこんな文字列は今
はじめてみたので実用上どの程度まずいかは疑問。
「使用上」の部分が固定文字列じゃなくてどっか
からもらうならちゃんとしなくちゃだけどね。
0243デフォルトの名無しさん
NGNGカッコが抜けている
indexの見つからなかったときの戻り値は$[-1
s{(<TD>.*?</TD>)}{index($1,'使用上')>=0? '': $1}ge
0244デフォルトの名無しさん
NGNGひょっとして$&を知らないのか?
0245デフォルトの名無しさん
NGNG$&使うといらないとこでもマッチ結果を保存するようになるから
あきらかにそこしか正規表現がないような使い捨てスクリプトじゃ
ない限りなるべく使わない。
0246デフォルトの名無しさん
NGNGただのお遊びならかまわんが、仕事がらみじゃ即座にクビだぞ。
0247デフォルトの名無しさん
NGNG漏れはてっきり、タグ中の"使用中"も拾っちゃうとか、再帰的なタグが処理できないとか
そういう部分のこと言ってるんだとおもってたよ
プロののくせに、その今更な子供みたいな文句はなんだorz
…大丈夫だよ。ぼくちゃんが心配しなくても、みんな最初にどうにかしてるから
0248デフォルトの名無しさん
NGNGコースじゃつらいんじゃないかね。HTMLのパースしてくれる
モジュール使ったほうがいいと思われ。
0249デフォルトの名無しさん
NGNG@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メモ」の全角カタカナ、漢字にマッチするものです
0250デフォルトの名無しさん
NGNGとしたらうまくいきましたorz
スマソ...
0251デフォルトの名無しさん
NGNG先読み (?= ... ) 使えばいいんじゃないか?
/ なんかマッチさせたい文字列 (?= 後ろの文字 ) /x
0253デフォルトの名無しさん
NGNG0254デフォルトの名無しさん
NGNGMainWindowが余分に出ちゃいます。
MainWindowを出さずにすませるか、見えなくする方法ってないでしょうか?
0255_gunzip
NGNGMainWindowを作って隠す、という方法が手っ取り早いかな。
#!/usr/bin/env perl
use Tk;
my $mw = new MainWindow();
$mw->withdraw();
my $target = $mw->getOpenFile();
#以降不要なら$mw->destroy();
0256デフォルトの名無しさん
NGNG仕方がないので、HTML出力するものを文字列として$mojiに保存して、
クッキー出力後に、
print"$moji";
をしています。
結果としては正しい物が出力されるのですが、普通はこのようなやり方をするのでしょうか?
また、この方法だとprintf出力ができません。
何かいい方法は無いでしょうか。
0257デフォルトの名無しさん
NGNGまず>>1をゆっくり"声に出して"読め
0258253
NGNGの二つのパッケージを入れて
$PERLDB_OPTS="ReadLine=t" perl -d -e foo.pl
これでヒストリ機能が使えるようになりました。一応報告まで。
0259デフォルトの名無しさん
NGNGreadline 先にインスコしてから Perl インスコすれば最初から使えるんじゃなかったっけ?
他のツールでもハマることが多いので、
漏れは OS インスコ後真っ先に入れるもののリストに readline を入れてる。
0260デフォルトの名無しさん
NGNGuse 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です。
よろしくお願いします。
0261254
NGNG>MainWindowを作って隠す、という方法が手っ取り早いかな。
>my $target = $mw->getOpenFile();
>#以降不要なら$mw->destroy();
これだと、
my $target = $mw->getOpenFile();
の時点で、getOpenFileが終了するまで実行止まっちゃっちゃうので、
getOpenFileダイアログ出てる間はMainWindowも出てしまいます…
できれば、最初からgetOpenFileダイアログだけを出すようにしたいです。
0263デフォルトの名無しさん
NGNG止まらなきゃ困るだろ。
>getOpenFileダイアログ出てる間はMainWindowも出てしまいます…
でねーよ
0264263
NGNG0265デフォルトの名無しさん
NGNGその-Mってのはなんの目的で入ってるの?
0266デフォルトの名無しさん
NGNGたぶんカレントディレクトリがファイルリストつくったところとちがうので-Mがundef返してるんだろ。
ディレクトリ補ってフルパスにするか適切にchdirすれ
0267デフォルトの名無しさん
NGNGこう書くと更新日時がプロセス起動より新しいファイルを弾けるんじゃないですか?
>>266
やってみます
0268デフォルトの名無しさん
NGNG私はあえてcygwinで動かしたいのです。
0269デフォルトの名無しさん
NGNGさすがPerllスレ
0270デフォルトの名無しさん
NGNG0271デフォルトの名無しさん
NGNGhoge_func($) {
hogehoge;
}
とか、
piyo_func($;$) {
piyopiyo;
}
関数名のあとの、($)とか($;$)ってどういう意味があるのですか?
0272デフォルトの名無しさん
NGNG0273デフォルトの名無しさん
NGNGいきなり Google の URL 示さなくても "Perl のプロトタイプだYO!" って言えばいいのに。
とりあえず>>271はラクダ本を買えってこった。
0274デフォルトの名無しさん
NGNG0275デフォルトの名無しさん
NGNGついこないだまでは繋がったのに、、、。
0276デフォルトの名無しさん
NGNG普通に見えるが?
0277デフォルトの名無しさん
NGNG今まではネットでPerlを紹介しているページで勉強していたのですが、本気で勉強しようと思ったら、
オライリーの本を買って勉強したほうがいいのでしょうか?
今ちょうど手元に『初めてのPerl』があるのですが、最初のスカラーデータから読み直したほうがいいですか?
オライリーのPerl本は色々あるんですね。
初めてのPerl (続)
Perlクックブック
プログラミングPerl
色々ありますが、どのような順番で勉強していけばキチンと身につけられますか?
それともオライリー以外のほかの書籍で『これは読んどけ』って言うのがあったら教えてください。
0278デフォルトの名無しさん
NGNGプログラミングPerlで勉強していくのが一番いいと思うよ。
0279デフォルトの名無しさん
NGNG初めてのPerlは頭から熟読するべし
その次に読むとしたら 続・初めての かな
クックブックは、まだ要らないと思う
プログラミングPerlは、金が余ってるなら買ってもいいけど
お布施みたいなもんだから、金が無いなら買わなくていい
オライリー以外なら、EffectivePerlあたりがコストパフォーマンスが良くてオススメ
初めてのPerl読み終わったら買うといい。
0280デフォルトの名無しさん
NGNGスマートな正規表現があったら教えていただけませんでしょうか。
想定するFrom:ヘッダとしては
(1) aiueo <[email protected]>
(2) [email protected]
(3) [email protected] (aiueo)
くらいでよいと思うのですが。("aiueo"が表示名のつもりです)
とりあえず(1)からアドレスと取り出す方法として
if ($from =~ /<(.+@.+)>/)
{
print "$1\n";
}
というのを作ったんですが、他の形式にも対応させようとして、いろいろやったんですけど
うまくいきませんでした。(初心者で申し訳ありません)
0281デフォルトの名無しさん
NGNGまずはふつうにパッケージを解凍して、
$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の段階で氏ぬ。
ぉιぇτ、工□い人
0282デフォルトの名無しさん
NGNGきちんとやるなら素直に Mail::Header つかうのが吉。
0283デフォルトの名無しさん
NGNGあまりよく分かりませんでした。
getメソッドが使えるのかな。
Fromヘッダの内容は、変数に入れてあるんですけど、
new Mail::Headerには、標準入力か、ファイルディスクリプタ?しか
渡せないんですかね。(ファイルからの入力しかできない?)
すこし試してみます。。
0284デフォルトの名無しさん
NGNG>>279
意外と、『クックブック』は早めに手に入れておいた方がいいと思うな。
というのも、『初めて』『続・初めて』と進んできて、
一番問題になるのは、リファレンスとオブジェクトの理解だと思うんだわ。
特に、『続・初めて』だけだと、オブジェクト指向のあたりは、
理解は難しいと思う。
自分の場合、
『続・初めて』で分からないとき、同じ項目を『クックブック』で引いてみると、
ああ、なるほどと分かることが多かった。
基礎部分は、『初めて』『続・初めて』『クックブック』だけでいいと思う。
あとは、なにをするかによって、専門分野のを選ばないと。
CGI なのか DBI なのか、それ以外のなにかなのか…
0285デフォルトの名無しさん
NGNGごめん、おもいっきり誤読してた。
Email::Address がそれっぽい。
0286デフォルトの名無しさん
NGNG0287デフォルトの名無しさん
NGNGできました!ありがとうございます。
<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>
0288デフォルトの名無しさん
NGNG0289277
NGNGとりあえず、
�@初めてのPerl
↓
�A続・初めてのPerl (⇔プログラミングPerl⇔クックブック ⇔ EffectivePerl)
↓
�BプログラミングPerl ⇔ クックブック ⇔ EffectivePerl
というような順番で読んでいけばいいのでしょうか。
ここまでがDBIとか専門分野に進んでいく『一般教養』と考えていいのですか?
大学の授業に例えるならこんな感じかな、と思ったのですが・・・。
0290デフォルトの名無しさん
NGNGプログラミング言語なんてのは使ってなんぼのもんなので
覚えるためのもんじゃないんで、
どこまで覚えりゃいいなんてものはないし
覚えると誉めてくれる人なんていないわけ。
いいたかないが、かまって君なら板違い。
仮眠前に覗くんじゃなかったわ。
0291デフォルトの名無しさん
NGNG0292デフォルトの名無しさん
NGNGもまえもその程度の事でストレス溜めてどうするよ
どうせネタなんだからスルーしる
0293デフォルトの名無しさん
NGNG十分すぎると思うんだが…
0294デフォルトの名無しさん
NGNG>今まではネットでPerlを紹介しているページで勉強していたのですが、本気で勉強しようと思ったら、
>オライリーの本を買って勉強したほうがいいのでしょうか?
>今ちょうど手元に『初めてのPerl』があるのですが、最初のスカラーデータから読み直したほうがいいですか?
みんな親切だね
0295デフォルトの名無しさん
NGNG>>293-294
中途半端で間違った知識付けて、下らない質問されるよりは
真っ当な道教えておいた方がいいだろ
0296デフォルトの名無しさん
NGNG0297デフォルトの名無しさん
NGNG初めてのPerl 続・初めてのPerl クックブック
くらいまでが、一般教養。
(ここまでやって、ようやく構造化とか、リファレンスとか、
オブジェクトの触りくらいまでは、分かるようになる)
DBIやらなにやらの専門分野はそのあと。
プログラミングperl なんかも、ここらあたりになると
持っているべきと思う。
(ここまで来ないと、理解できる本じゃない)
perlのいいところは、すべて知らなくても、
それなりに使えるというとこ。
ただ、きちんと学べば、もっと楽しく使えるよ。
0298デフォルトの名無しさん
NGNG0299デフォルトの名無しさん
NGNGそこら辺りまで行くと、ラクダ本じゃなく perldocで十分じゃないか?
0300デフォルトの名無しさん
NGNG本の宣伝してるんだろうよ。
0301デフォルトの名無しさん
NGNGこいつ、バカ?
オライリーがこんなとこで宣伝するかよ!
0302デフォルトの名無しさん
NGNG0303名無しさん@ゴーゴーゴーゴー!
NGNG0304デフォルトの名無しさん
NGNGkentのサイトは、ちらとしか見たことないが…。
いや、だからね、perlのいいところは、そこそこしか知らんでも、
とりあえずなんとかなるというとこ。
リファレンス使えない奴はダメだ、とかいい始めると、
それはいかにも perl らしくない。
だけど、そういうことを知ってると、それはそれで、
とってもいいこといっぱいあるよ、ということ。
どこまで必要かは、自分で考えりゃいい。
0305デフォルトの名無しさん
NGNGかぶらないようにするには、どういう規則で名前を付ければいいでしょうか?
0306デフォルトの名無しさん
NGNG色々見て回りましたがうまくいきません。
詳しく書いてあるサイトなど、何か情報はありませんか?
0307デフォルトの名無しさん
NGNG0308デフォルトの名無しさん
NGNGスマートな正規表現か
便利なモジュール等ありましたら
教えていただけませんでしょうか。
想定しているヘッダの書式は以下のような感じです。
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でいいと思っています。
0309デフォルトの名無しさん
NGNG0310デフォルトの名無しさん
NGNGhttp://search.cpan.org/
ここをブックマークしとけ。
0311デフォルトの名無しさん
NGNGCPAN等で公開しないんなら、アンダースコア(_)で始めればいいんじゃね?
0312デフォルトの名無しさん
NGNG>>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呼んでるだけだったけどな。
0314デフォルトの名無しさん
NGNGありがとうございます。マジ助かります。
0315デフォルトの名無しさん
NGNG$hash->{'abc'}
$hash{'abc'}
$hash{"abc"}
↑の違いは何かあるんですかねぇ・・・
統一してほしいんですが・・・
0316デフォルトの名無しさん
NGNG0317デフォルトの名無しさん
NGNG0318デフォルトの名無しさん
NGNGどういうふうに違うんですか?
0319デフォルトの名無しさん
NGNG$hash->{...}と$hash{...}が同じだと思ってる段階でアウト。
perlの基本を勉強して出直して来い。
%hash = (a=>1);
$hash = {a=>2};
print "(1) $hash{'a'}\n";
print "(2) $hash->{'a'}\n";
0320デフォルトの名無しさん
NGNG少なくとも、
$hash->{'abc'}
$hash{'abc'}
では、意味がぜんぜん違う。
前のは、リファレンスをデリファレンスする、
あるいは、メソッドの呼び出し ということになる。
0322デフォルトの名無しさん
NGNG0323デフォルトの名無しさん
NGNG人格くさった奴は、rubyスレに帰れや。
松本に、いい性格をオブジェクト指向で生み出してもらうように
してもらえ。
それとも、perlでアタマをハッシュしてやろうか?
0324デフォルトの名無しさん
NGNGうんとか、すんとか、なんか抜かせよ、ヴォケ。
んじゃ、ruby と クソ をbless してやるな。
メソッド、ケツ拭け!
0325デフォルトの名無しさん
NGNG0326デフォルトの名無しさん
NGNGだから、そういうときは、 -> 使えって。
そして矢印を、デリファレンス とでも頭の中で読めばいい。
(メソッドの場合もある)
何々 => ○○ は、
何々 の値 ○○ とでも読めばいい。
[ ] が、やや唐突に出てきたら、
無名配列のリファレンスとでも、頭の中で読めばいいんだし、
{ } が、やや唐突に出てきたら、
無名ハッシュのリファレンスとでも、頭の中で読めばいいんだけだ。
ランダル・シュワルツの本とかを読んでも、
向うでもみんなそうしてるように書いてあるぞ。
記号に、意味を表す読みを与えれば、なにも難しくない。
0327デフォルトの名無しさん
NGNG$hash{"abc"}
この二つを並べている事に関しては
文字列の基本をやり直せと言って置こうか
0328デフォルトの名無しさん
NGNG$hash{"$abc"}
だと結果が異なるし
0329デフォルトの名無しさん
NGNG0330デフォルトの名無しさん
NGNGprint "$1\n" if ($from =~ /パターン1/);
print "$2\n" if ($from =~ /パターン2/);
print "$3\n" if ($from =~ /パターン3/);
でいいんじゃない?
カンペキを求めるなら(不可能らしいけど)次を参照
ttp://www.din.or.jp/~ohzaki/perl.htm#Mail
0331330
NGNG恥ずかしいので見なかったことにしてくれよ。
0332デフォルトの名無しさん
NGNG0333デフォルトの名無しさん
NGNGmy $hoge = 1;
nochange $hoge;
$hoge = 2 → エラー
みたいな感じです。
0334デフォルトの名無しさん
NGNGScalar::Readonly
ttp://search.cpan.org/~gozer/Scalar-Readonly-0.01/lib/Scalar/Readonly.pm
説明によるとXSでSvREADONLYフラグなるものをいじるらしいです。
perlだけで書こうとするとtieでSTOREをなんかするぐらいしか
オレも思いつかんな。
0335デフォルトの名無しさん
NGNGとかでいけないっけ?
0336デフォルトの名無しさん
NGNGglobつかうからmyで宣言した変数には使えないと思われ。
0337333
NGNG結局Readonlyという物を利用する事にしました。
Scalar::Readonlyと比較すると
+ pure perl
+ array,hashにも使える
+ 変数に格納したリファレンスの変更も監視出来る
- パフォーマンスが劣る
- readonlyのon、offが出来ない
のような感じです。
中身見てみるとtieしてstoreをごにょごにょしてるだけですた。
0338デフォルトの名無しさん
NGNGInternals::SvREADONLY($var, 1); # $varをREADONLYにする。
0339神の愛の証言者 ◆IHSXPiND6Q
NGNG$ 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とかで解決できないですか?
0340デフォルトの名無しさん
NGNG0341デフォルトの名無しさん
NGNG0342デフォルトの名無しさん
NGNGhttp://hobby.2ch.net/test/read.cgi/dog/1066313320/854
0343デフォルトの名無しさん
NGNGと
$hash{"abc"} = 10
とする場合の、
それぞれのメリットと
デリメットについて教えていただけないでしょうか?
0344デフォルトの名無しさん
NGNG何も無い
何も無い
0345デフォルトの名無しさん
NGNG代入すること自体に両者のメリット、デメリットの差はまずないけど
($hash->{}はデリファレンスのコストがほーーんのちょっとかかるといえばかかるが)
沢山中身を詰めたハッシュをサブルーチンに渡す/返すときなんかはスピードに差が出ます。
ハッシュじゃなくても、普通のスカラーに1MBのテキストファイル入れて
参照渡しにするかコピー渡しにするか試してみると、かなり差が出るよ。
0346デフォルトの名無しさん
NGNG配列やハッシュやサブルーチンを入れるもんだと
思うよ。それで、配列の配列や、配列のハッシュ、
ハッシュのハッシュ、ハッシュのサブルーチン
とか作るんだよ。
メリットはいっぱいあって、簡単に書けないほど。
一例をあげれば、トリガーとなるキーワードを
ハッシュのキーとし、値の方にサブルーチンのリファレンスを
入れておけば、ケースによって振る舞いを変えられる。
Aというケースなら、これこれになになにするが、
Bというケースなら、しかじかになになにする。
しかし、Cというケースなら、こうでなくちゃならないし、
でも、Dというケースなら、なにもしちゃいけないし、
というようなとき。
AはサブルーチンAAを、BにはサブルーチンBBを、
CにはサブルーチンCCを…。
いちいちメリットを書いていったら、きりがない。
0347デフォルトの名無しさん
NGNG0348デフォルトの名無しさん
NGNGIllegal 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に限ってエラーが出るんですけど、なんででしょうか?
0349デフォルトの名無しさん
NGNG釣りか?
0350デフォルトの名無しさん
NGNGもしかして根本的に間違えてる?
0351デフォルトの名無しさん
NGNG0352デフォルトの名無しさん
NGNG>Illegal octal digit at - line 1, at end of line
英語が読めませんか?
0353デフォルトの名無しさん
NGNGこれはなんでエラーになるんでしょうかね?
perlにおいて0から始まるリテラルは8進数とみなされます。
ラクダ本のリテラルの項目をよく読んでみてください。
0354デフォルトの名無しさん
NGNG0355デフォルトの名無しさん
NGNGすいません、今調べて判りました。
みなさんホントにごめんなさい。
0356デフォルトの名無しさん
NGNGあんたに限った話じゃないが、中学生英語程度のメッセージなのに何で読もうとしないんだい?
0357デフォルトの名無しさん
NGNG0358デフォルトの名無しさん
NGNG英語ってだけで拒否反応おこしてんだろう。
0359デフォルトの名無しさん
NGNGんなこと言ったら、コンピュータ言語自体に拒否反応でちゃうと思うんだが。
つーか、一般的にこういう人はかなりの割合でいるんだろうか?
それとも、特異な人だけが、掲示板やMLでこの手の質問するんで目立つんだろうか?
前者だとしたら、メッセージを日本語にするいいかげんなパッチでも作ったら
需要あんのかな?とか
0360デフォルトの名無しさん
NGNG出力メッセージのエンコーディングやらロケールやらで、
混乱する要素がひとつ増えるだけの悪寒。
0361デフォルトの名無しさん
NGNGセキュリティ上何に気をつけたらいいですか?
とりあえず、taintモードで、use re 'eval'は宣言してません。
0362デフォルトの名無しさん
NGNG0363デフォルトの名無しさん
NGNG少なくとも中学では習わん
0364デフォルトの名無しさん
NGNG0365デフォルトの名無しさん
NGNG文法は中学レベルだろ。
中学で辞書の引き方を習わなかった、とかなら仕方ないが。
0366デフォルトの名無しさん
NGNGあてにならん情報読むために四苦八苦するなんて面倒だろう。
このメッセージの場合、行末がどうとか書いてあるっぽくてでも行末はちゃんとしてるから
その地点で読むのやめる。
百歩譲って読んでみたとして、octalがわからないし、8進数も知らないから
Illegal digit at - line1, at end of line
となって、違法数字atがline1,行末だといわれても何のことやらわからんのですよ
0367デフォルトの名無しさん
NGNGこじつけもいいとこ(´д`;)何で前から読まないんだ
0368デフォルトの名無しさん
NGNGエラーメッセージ当てにならないってことはないし、
人に聞くくらいならあるだけの情報は吟味しとかないと。
何度もミスってればそのうちメッセージしっかり読まなくても
その字づらだけでどういうバグか程度は分かるようになるから。
むくれずガンガレ。
0369デフォルトの名無しさん
NGNG出力先を画面とファイルと同時に出力させることは出来ますか?
例:
$logfile = './log/log.txt';
$log='レポート結果';
open(LOG,'>> ' . $logfile);
print LOG $log; #ファイルに出力
close(LOG);
print $log; #画面に出力
みたいに二回同じ物をprintせずに一度で済む方法はありますでしょうか?
0370デフォルトの名無しさん
NGNG0371デフォルトの名無しさん
NGNGIO::Teeかな
ttp://search.cpan.org/~kenshan/IO-Tee-0.64/Tee.pm
0372デフォルトの名無しさん
NGNG|run
|Illegal Function Call in line 40
|OK
|■
|list 40
:
0373デフォルトの名無しさん
NGNGIllegal octal digit
(F) 8 進数で 8 か 9 を使いました。
これでもわからん奴はどうしましょうね(笑)
0374デフォルトの名無しさん
NGNGそれを喜んで叩いてるやつも池沼。くだらんからスルーしろ。
0375デフォルトの名無しさん
NGNG>Illegal octal digit at - line 1, at end of line
Illegal llegal(合法な)の否定形 非合法な
octal 八角形の
digit 数字
at -line1 1行目で
at end of line 行の最後で
総合的に訳すrと
1行目の最後に不正な八進数があります
か?
0377神の愛の証言者 ◆IHSXPiND6Q
NGNG0 は 8 進 数 な ん で す か?
0378デフォルトの名無しさん
NGNGPerlでは0が頭にあれば8進数として認識するんだが?
だからこの問題が起きてる。
ついてきてない奴はだまっとけ
0379デフォルトの名無しさん
NGNGhttp://pc5.2ch.net/test/read.cgi/unix/1083993713/58
58 :神の愛の証言者 ◆IHSXPiND6Q [sage] :04/07/07 12:52
less
sshd
vim
最新のカーネル
ncftp
0380デフォルトの名無しさん
NGNG0381デフォルトの名無しさん
NGNGいくらなんでも結城浩に失礼だからやめれ
0382デフォルトの名無しさん
NGNGISWEBのサーバー500エラーを返します
Perlのパスや設定はきちんと合わせたんですが何故でしょうか?
0383デフォルトの名無しさん
NGNG0384デフォルトの名無しさん
NGNG0385デフォルトの名無しさん
NGNG0386デフォルトの名無しさん
NGNGfunc(\@array_real, \%hash_real);
sub func{ my ($array,$hash) = @_; $array->[foo] = ... ; $hash->{bar} = ... ; }
とかしてリファレンス使ったら?
0387デフォルトの名無しさん
NGNG0388デフォルトの名無しさん
NGNG0389デフォルトの名無しさん
NGNGreturn \%hash, \@array;
}
じゃ駄目なの?
0391デフォルトの名無しさん
NGNG5つの英文字をランダムに表示することは、できないのでしょうか。
0392デフォルトの名無しさん
NGNG0393デフォルトの名無しさん
NGNGあるファイルの入出力で、レコードフォーマットがよくかわるので
そのたびに、プログラム修正が大変です。他の言語ならば、入出力はマクロ化などをしますが
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);
0394デフォルトの名無しさん
NGNGコードがあるのだけど
これWindows上でもまともに動きますか?
あと図面や文献環境などややこしいのは全部
スキップしてくれても良いので、簡単な
コードありませんか?
0395デフォルトの名無しさん
NGNG行の書式がちがっても各要素の書式さえ同じなら正規表現ですんなり行くが、そういうわけでもないのか?
0396デフォルトの名無しさん
NGNGそのとおりです、書式さえあえば動きます
しかし、共通化できれば一箇所の修正でいいのですが、
数十箇所も毎回修正するので大変なんです
0397デフォルトの名無しさん
NGNGたとえば$DATEの部分が
20041218とか12月18日とかが混じってるようならダメだけど、
そうでないなら、($DATE,$ID ...が($ID,$DATE ...みたいな順になっていても
各要素を正規表現で取り出せるんじゃないか?という話。
ちがうならもっと偉い人の降臨待て。
0398デフォルトの名無しさん
NGNGいや、Perlでも入出力をモジュールにすればいいだろ?
なんで他言語で出来てPerlで出来ないと思うんだろ。
サンプルをみる限り、Perlをまともに知らないだけか……。
foreachで$#とか使ってるし、
いまさらjcode.pl使ってるみたいだし。
0399デフォルトの名無しさん
NGNG# $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";
0400デフォルトの名無しさん
NGNG要素が増えたりするので修正がかかるんですー
正規表現で取り出すって意味が、厨房でわかりますえん すまそ
>>398
モジュール化は簡単にできるけど、
どのレコードを読み込むか?(キーの要素が毎回変わる 条件も複数)
このレコードを読み込んだらループを抜ける
上記のように、DBのようにキーが固定されているわけでもなく、
検索条件も a=b && c ne d 等と毎回変わるので 共通モジュール化は
できないと思ってます
0401デフォルトの名無しさん
NGNG同じことすればいいでしょ。
0402デフォルトの名無しさん
NGNGそしたらレコードフォーマットが変わってもその後の処理に問題ないっしょ。
0403デフォルトの名無しさん
NGNG<>で区切ってあるだけまだましなんだが。
0404デフォルトの名無しさん
NGNGthx子 やってみます
0405デフォルトの名無しさん
NGNGmy @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;
...
0407デフォルトの名無しさん
NGNGreaddirも、関数への引数も、コマンドラインの引数すらも、標準入力扱いじゃないから自動変換してくれない
open(IN,"ファイル")じゃ動かなくて、open(IN,encoding("shiftjis","ファイル名"))。
print shift; もだめ。あほか。
jcode.plで正規表現使うときだけ変換して騙し騙し動いてたのが、
encodingにしてからコード中encode,decodeだらけになっちまった
どうすりゃいいんだ
0408デフォルトの名無しさん
NGNG0409デフォルトの名無しさん
NGNGじゃだめなのか?
0410デフォルトの名無しさん
NGNGまったくその通りだよな。
5.8 で use encoding の1行を入れればJperl と同様に動く、
なんてウソッパチもいいところだ。
オレ、いまだに昔のJperl が手放せないよ。
0411デフォルトの名無しさん
NGNG時代に取り残されてますね。
可哀相に・・・
0412デフォルトの名無しさん
NGNG0413デフォルトの名無しさん
NGNGおまいら、信じてないだろ…つかencoding使ったこと自体ないだろ?
宣伝文句聞きかじった知識だけでバカにしやがって畜生くそ(略
実験.pl
use encoding "shiftjis";
print shift;
open(IN,"実験.pl") or die;
これだけだ
>実験.pl あいうえお
encoding付けたのと外したので、試してみろよ
0414デフォルトの名無しさん
NGNGとか思わなくもないケド、
openのラッパ書けばいいじゃん。>encodeだらけ
なんで書かないの?
0415デフォルトの名無しさん
NGNGencoding付けたのと外したので、試してみろよ
これで試してみるとさ、
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";
の一行を取り去ってやってみると、正常に動作するよ。
これじゃ、ダメなの?
0416デフォルトの名無しさん
NGNG話が理解できてないなら首突っ込まなければいいのに・・・
0417デフォルトの名無しさん
NGNGいやいや、その通りなんだが、
やっぱり話がまったく見えない、のも気持ち悪いだろ。
で、いったい何が問題なの?
413 においてさ、要は、引数の あいうえお がプリント文で、
出ればいいんじゃないの?
うちでは、use encoding "shiftjis"; の一行を取り除いたら、
あいうえお 出ましたという話で…。
そういう話じゃないの? 誰か分かるように説明してん。
0418デフォルトの名無しさん
NGNGrequire './config.cgi';
としてて、config.cgi の中で$a を参照するのですが、参照できないみたいです
どうやって値を引き継げばよいでしょうか?
0419デフォルトの名無しさん
NGNG0420410
NGNGほー。そうかい、そうかい。キミのパソコンではUTF-8 で「実験.pl」
という名前のファイルを作れるわけだな。それじゃ、そのUTF-8 の
「実験.pl」の中身を出力してごらんよ。当然、これでできるはずだよな。
use encoding "shiftjis";
print shift;
open(IN,"実験.pl") or die;
while(<IN>){
print;
}
close(IN);
0421デフォルトの名無しさん
NGNGとりあえず小飼弾の赤いPerl本でも読んだほうがいいと思うよ。
0422デフォルトの名無しさん
NGNGあのー、413へのコメントとなってるけど、
もしかして僕へなの? (それとも、自意識過剰???)
僕へだったら、うちのはシフトjisだよ。サクラエディタで確認した。
やってみたけど、
ウチでは、実験.plの中に use encoding "shiftjis";
があると、3行目でこける。
それがないやつは、なにも出力されない。
勘違いしないでほしいけど、僕は別にケンカを売ってるわけじゃないよ。
よく分からないままに言わせてもらえば、君が考えてるより、
perlはもっと早い段階でutfに変換してると思う。
0423422
NGNG0424デフォルトの名無しさん
NGNG既にバッドノウハウの湧き処になっている感はあるがな…。
まぁとりあえずコレでもじっくり読め。
http://www.kt.rim.or.jp/~kbk/perl-5.8/
0425413
NGNGだから動かんっていってるだろ。試してみろっていったのに試さずにしかも間違ってる反論すな
ひょっとして、use open ":encoding(..)"とか,use open ":std"しとけ!!っていいたいのか?
そしたら413のコードも何もかもうまくいくとおもってるのか。あさはかな。
0426デフォルトの名無しさん
NGNG0427デフォルトの名無しさん
NGNG0428デフォルトの名無しさん
NGNG0429422,
NGNGuse encoding "shiftjis";
結論としてどうなるわけ?
誰か、まとめてよ。
僕が思うに、
一部の人が言う use encoding "shiftjis";
の問題は、確かに確認できるけど、
perl5.8がutf-8で内部的に統一して扱っているなら、
実際問題、なにも問題ないと思うんだけど。
perlは、読み込んだ時点もすでにすべてutf-8に変換してる。
それじゃまずいケースって、具体的にどんなとき?
0430デフォルトの名無しさん
NGNG>perl5.8がutf-8で内部的に統一して扱っているなら、
>実際問題、なにも問題ないと思うんだけど。
そう思ってりゃいいよ。
0431デフォルトの名無しさん
NGNG0432422
NGNGまた、投げやりなんだなぁ。
実際には、perl5.8がutf-8で内部的に統一して扱っていないって、
いうこと???
しかし、簡単に試す限り、utf-8で内部的に統一して扱っていると思えるけどなぁ。
それに、もしutf-8で内部的に統一して扱っていること自体が問題というなら、
ことはperlのみならず、たとえばjavaやら他言語も含めた大問題となる。
あー、わけわか。まあ、どうでもいいという結論で。
0433デフォルトの名無しさん
NGNGperlは文字列をutf-8と み な す だけで、変換もなんにもしてくれません
そんでencodingとか色々オプションをくっつけて、
いろんな文字コードをutf-8っぽい内部形式に、正しく変換して読み込むように設定してるわけだが。
それが使いにくいって話。穴が山ほどあって、変換前の文字列が入ってくる機会が多いから困ってる。
0434デフォルトの名無しさん
NGNG0435デフォルトの名無しさん
NGNGimagemagickの使い方
日本語で説明してるページとかありませんか
0436名無しさん@ゴーゴーゴーゴー!
NGNG穴があるというがutf8でスクリプト組めばええ話でねーのか?
eucでスクリプト組むのと同じ感覚で使ってるし、苦労したことないな。
0437デフォルトの名無しさん
NGNG池沼なエディタつかってるんだよ、たぶん。
0438435
NGNG0439デフォルトの名無しさん
NGNG一言礼ぐらい言えよ。
0440デフォルトの名無しさん
NGNG0441デフォルトの名無しさん
NGNG0442デフォルトの名無しさん
NGNG0443デフォルトの名無しさん
NGNG笑いをありがとう
0444デフォルトの名無しさん
NGNGラクダ本は読みすぎてぼろくなってきたので、そろそろ捨てようかなと思ってます。
0445デフォルトの名無しさん
NGNG一言礼ぐらい言えよ。
0446デフォルトの名無しさん
NGNG「ありがとう」って言ってんじゃん
0447& ◆QWv3R1XL8M
NGNG0448デフォルトの名無しさん
NGNG>ことはperlのみならず、たとえばjavaやら他言語も含めた大問題となる。
そのとおりだが。特にjavaやってる人は誰でも文字コードに振り回された経験があるだろう。
0449448
NGNG0450デフォルトの名無しさん
NGNGPerlを厳密に静的解析することはできない。
動的に解析しないと "a << b"という一文さえ、左シフト演算子なのかヒアドキュメントなのかわからないからだ。
0451デフォルトの名無しさん
NGNGそれじゃコンパイルできないじゃん
0452デフォルトの名無しさん
NGNG0453デフォルトの名無しさん
NGNGなんで型づけせにゃならんのだよ。
そんなもんは、本来機械の側がやるべきことを、
人間にやらせてるだけだろ。
俺の友達は、Cの型を覚えるだけで
一生を終えてしまったぞ。
0454デフォルトの名無しさん
NGNG0455デフォルトの名無しさん
NGNGアセンブラとかマシン語には型はあるの?
0456デフォルトの名無しさん
NGNGMASMでは型と言えるかは知らんが、レジスタとかで区別があるものもある。
0457455
NGNGほう。とすると別にハードウェア的にはlongとかunsigned charとかを
理解しているわけではなくて、コンパイラが勝手に作ったルールみたいな
ものなわけですか?
0458デフォルトの名無しさん
NGNG0459デフォルトの名無しさん
NGNGそれより君は、型がないと何か困ることでもあるの???
0461460
NGNGアラートかなんか出すオプションが欲しいなと思うことはときどきあるね。
まあ、クラス化すれば勝手に変なもん突っ込むことはないんだろうけれど。
0462デフォルトの名無しさん
NGNG-w の警告モードと、use strict っていうことになるのかな。
(みんな、せめて -w は使おう!)
それで十分っていうか、Cの型はやりすぎなんじゃないの?
Pythonなんかでも、インデント変えただけでプログラムが
動かなくなるとか聞くが、それもちょっとなぁ。
0463デフォルトの名無しさん
NGNG0464デフォルトの名無しさん
NGNG間違えて変なもの入れちゃうほうがずっといや
結局ユーザは型を意識してプログラミングしなきゃいけないのに、
コードのどこにも型が書いてないからかえって管理しにくい
0465デフォルトの名無しさん
NGNG-eオプションでさくっと処理を多用するおいらみたいなユーザーを
未だ見捨てる気がないからだべさ。
前もあったが、言語仕様を用途を抜きで語るのは不毛。
PHPがタグだらけで不格好だと騒ぐようなもんだ。
オブジェクト指向マンセーならRubyでも使ってれ。
0466デフォルトの名無しさん
NGNG超A型君は更にTaintモードも併用してるんだろうか。
0467デフォルトの名無しさん
NGNGTaintモードはstrictやwarningsとは全く意味が違う。
Taintモードが有益なのは「環境変数や引数などに信頼できないデータが含まれている可能性があるとき」だよ。
因みに老婆心ながらwarningsモードも慣れれば非常に有益。
個人的には、コーディングスタイルを変えてでも警告ゼロを目指すね。
どうしても譲れない時はno warningsを使うし。
0468デフォルトの名無しさん
NGNGそのモジュールが使用できない場合は別のモジュールをテストし……というプログラムを作りたいのですが、
それは可能でしょうか?
できるならばどのような方法がありますでしょうか?
やりたい事は、Encode.pm > NKF.pm > Jcode.pm の優先順位で使用できるモジュールで日本語変換をしたいのです。
0469デフォルトの名無しさん
NGNG気がするけど、 「Encode.pmがあるかどうか」でいいなら、
@INCの中身を順に調べていけばいいんじゃない。
ファイルがあっても使えないっていうケースがあるのかどうかしらんけど。
0470デフォルトの名無しさん
NGNG0471468
NGNGあぁ、ごめんなさい。
あるかどうかで充分です。
なるほど、そういう方法がありますね。
>>470
どのようにevalを使用しておりますか?
いろいろ試行錯誤しているのですが、上手くいかないです orz
0472468
NGNGeval 'use Encode';した後に$@に何か入っていれば次にeval 'use NKF';とやって、
$@が空であれば、そのモジュールで処理すれば良いのですね。
とりあえずこれでやってみます。
ありがとうございました。
0473デフォルトの名無しさん
NGNGmy $date : INTEGER(1..31) の範囲制限できるところとかは便利そうだと思う。
使ったことないけど。
0474デフォルトの名無しさん
NGNG0475デフォルトの名無しさん
NGNGごっつあんです。
0476デフォルトの名無しさん
NGNGsyntax 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.
0477デフォルトの名無しさん
NGNGeval { 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); }
}
とかするのがいいかも?
0478デフォルトの名無しさん
NGNGBEGIN {
eval 'use Encode;';
if ($@) {
eval 'use NKF;';
if ($@) {
eval 'use Jcode;';
if ($@) { die }
}
}
}
0479デフォルトの名無しさん
NGNGあと、文字列の中から特定の文字数だけ取得するのは
どうすればいいですか?(substringみたいな関数)
0480デフォルトの名無しさん
NGNG> 自分自身のファイル名を取得するにはどうしたらいいですか?
http://perldoc.com/perl5.8.4/pod/perlvar.html#$PROGRAM_NAME
> 文字列の中から特定の文字数だけ取得
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_can_I_access_change_the_firs
0481デフォルトの名無しさん
NGNG> 自分自身のファイル名を…
>>480の通りなのだが、$0だとパスまで引いてしまう。
パスを除いた形で取得したいのであれば`basename $0`を使うと幸せになれるかも知れない。
勿論、basenameが使えればの話だが。
0482デフォルトの名無しさん
NGNGありがとうございます。
0483デフォルトの名無しさん
NGNG(File::Spec->splitpath($0))[2]
とか
0484デフォルトの名無しさん
NGNGutf8フラグが付いている文字と連結するときに、
勝手にLatin1と解釈されてutf8な文字列にされちゃうわけですが、
これをLatin1じゃなくする方法ってないんでしょーかね。
utf8フラグがついてない0x80-0xffな文字列を見つけたときの処理方法を
ユーザーが指定できればちょっとウマーな気がするんだけど。
0485デフォルトの名無しさん
NGNG0486483
NGNG・・・素で存在に気づかなかった。
自分でももっと簡潔にならないかなーなんて思いながら書いてたorz
漏れの目は節穴です。ありがとう
use File::Basename;
print basename($0);
簡潔ー
0487デフォルトの名無しさん
NGNG分かりやすく書きますと
検索文字列:XXXAAAXBBBXXXXCCCXX
これを検索させて、適合する文字列である
AAA
BBB
CCC
を抽出したいのですが、こんな事って出来ますか?
文字列は、文節がどこで区切られるか分かりませんので、全体を一文として検索を行いたいのです。
0488デフォルトの名無しさん
NGNG「適合する」がよくわからんのだけど、
辞書みたいなものがあって、ある文字列の中でその辞書に含まれる単語を抽出したい、
ということ?
0489デフォルトの名無しさん
NGNGあったかどうかのチェックなのか?
検索文字列:XXXAAAXBBBXXXXCCCXAAAX
の時に
AAA
BBB
CCC
AAA
でいいのか?
全体を一文としていいのなら
@LINES = ($tmp =~ /(AAA|BBB|CCC)/g);
とか
0490デフォルトの名無しさん
NGNG@LINES = map{ $tmp =~ /$_/g } @DIC;
っていう書き方もあるぽ。
0491デフォルトの名無しさん
NGNG$ENV{'CONTENT_LENGTH'}が100バイト以上になるんですけどどうしてですか?
この入力したフォームのデータの正確なバイト数を調べるにはどうしたらいいんですか?
0492487
NGNG返事が遅くなりました、すみません。
レスありがとうございました。
>>488氏の仰るとおり、つまりは辞書のようなものです。
DBには1000件ほどあります。
これを>>490のように配列@DICに流し込んで、検索文字列$LINESを置換するというのは
あまり効率的ではないかなと思い、質問させていただいています。
0493デフォルトの名無しさん
NGNGフォームってCGI?
CGIに関しては板違い
フォームで送って送られるのではデータだけじゃない。
>>492
$LINESを置換しているわけではなく、検索にHITした物が@LINESに格納されるわけだが。
そもそも配列@DICに流し込んで…じゃなく、
前提条件として「検索する文字が配列@DICに入っているのなら」としたわけだ。
で、>>489がスルーされているのだが、複数HITする物があった場合はどうするのだ?
HITした数だけ結果として必要なのか、それともHITするものが一つでもあるかどうかだけのチェックでいいのか?
049454
NGNG言ってるとこみるとメモリを気にしてるのか?
1000行で各行何バイトくらい?
仮に100バイトだとすると、たった10万バイト。
それを読み込めないメモリなら増設汁。
もちろん一行ずつ読み込んで処理する、もある。
0495デフォルトの名無しさん
NGNGそれまでは
($path, $script) = $0 =~ /^(.*(?:\/|\\))?(.*)$/;
ってやってました。
上の方法とbasename使うのとで一長一短とかありますか?
0496デフォルトの名無しさん
NGNG0497デフォルトの名無しさん
NGNG拡張子も除去できるとか(指定した場合)
0498デフォルトの名無しさん
NGNG0x13で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
0499デフォルトの名無しさん
NGNG0500デフォルトの名無しさん
NGNGprint map chr(ord ^ 0x13), unpack 'A' x length, $_ while read DATA, $_, 1024;
0502デフォルトの名無しさん
NGNG@filenames = glob ("./あ*.*");
print "@filenames";
ファイル名が日本語のものを、globで拾いたいんですが、上のスクリプト
だと拾ってくれません(@filenamesが空になります)。
use encodingを削ると拾ってくれるんですが、use encodingは別の用で
いるもので。
お知恵をお貸し頂きたく。
0503デフォルトの名無しさん
NGNG>>407-
0504デフォルトの名無しさん
NGNG0505デフォルトの名無しさん
NGNGOSは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行目
エラーを解消する方法を伝授してください。
0506デフォルトの名無しさん
NGNG0507デフォルトの名無しさん
NGNGそれもそうだが、
欧米人にこの現状を理解してもらおうと思ったら、
なぜにeucとsift-Jisがあって、しかも
どうしてとっととutfに移れないのかを説明せねばならず、
説明してる間に、
結局、問題の多くがむしろこちら側にこそあるのだと、
気づかされるオチになるのではないかと、小一時間…。
少なくとも、sift-Jisは余計であったよなぁ。
0508デフォルトの名無しさん
NGNG永遠にその日は来ないだろうが。
0509デフォルトの名無しさん
NGNG解決方法は判らないが、エラーの出ている\xCDは半角カナのヘ
その89行目を見ると人っていう字があるが、それはEUCかな?
EUCの人という字は\xBF\xCDなので、その人という字が原因かと思われ。
0510デフォルトの名無しさん
NGNGuse encoding "euc-jp", Filter=>1;
してるんだから、EUCからUnicodeに変換されてるはず
だよな。それがうまくいってないのはなんでだ?
0511505
NGNGEncodeでした。ごめんなさい。orz
>>509
指摘されたとおりだと思いましたので、何でも良いかな?と思いjperl.tに3回記述されていた「人」を「年」と書き直したところすんなりとインストールできました。何か不具合があるかもしれませんが、そのときに考えようと思います。
ありがとうございました。
0512デフォルトの名無しさん
NGNGhttp://www.debian.or.jp/~kubota/mojibake/
を外人には読んでもらえ。
0513デフォルトの名無しさん
NGNGPerl の開発体制を良く知らないのですが、Encode の外人の開発者さんたちは、
そういう問題を理解しようとも思わないひとたちばかりなのでしょうか?
0514デフォルトの名無しさん
NGNGutf-8 に移行するのが先だと思うんだよな。
問題は、もしろ日本側の方にこそあると思う。
ユニコードに移行する道筋できてるのか?
ていうか、出来てないよね???
perlコードはutf-8に変換しておく、というルールはダメなのか?
ちなみに、うちのサクラエディタは、ユニコードはバッチリだが、
ファイル名がshift-jisじゃないと、開けないらしい。ハァー。
0515デフォルトの名無しさん
NGNGUse of uninitialized value in concatenation (.) or string at -e line 1.
この warning ってあまり有用なものではないように思うのですが、
これを抑制するのに良い方法が何かあれば教えて下さい。
0516デフォルトの名無しさん
NGNGno warnings qw(void);
0517デフォルトの名無しさん
NGNGperl -we 'use strict; my $s = "foo"; my$x = undef;print "$1\n" if ($s =~ /foo(o)?/ and $x = $1);'
0518デフォルトの名無しさん
NGNG$1に対応するカッコが使われなかったのに文字列の中で参照しようと
してるのを警告してくれてるんだから十分意味があるだろ。
516の言うようにno warning使ってもいいが、わざわざ-wつけるほど
慎重にプログラミングする主義なら、書き方を工夫して出ないように
するのが本筋だと思われ。一番簡単な書き換えは多分(o)?を(o?)に
することだろうが、お前の意図としてそれでいいかどうかはオレには
わからん。
0519デフォルトの名無しさん
NGNGなるほど、そうですね。
例えば >>517 さんのように $1 をキチンと検査してから使うべきですね。
0520デフォルトの名無しさん
NGNGうん、Unicodeに合わせて日本語変えなきゃね。
0521デフォルトの名無しさん
NGNGC++でいうところの、
struct Hage{
int a;
int b;
}
std::vector<Hage>
みたいなかんじのことをやりたいのですが・・・
0522デフォルトの名無しさん
NGNGpush (@hage_list, $hage_obj);
0523デフォルトの名無しさん
NGNGさんくす。
0524デフォルトの名無しさん
NGNGencoding作ってるのは日本人だよ。
つーか、あんたらどういう実装なら文句言わんのか、
一度整理してみなよ。
0525デフォルトの名無しさん
NGNGつまり、日本語の文字コードの変換なしにすべて正常に動作すること。
それには、日本語がすべてデフォルトでutfに乗っている必要がある
ということ。
だから、そのためには、すべてのosが次期バージョンから
eucとs-Jisのサポートを即刻やめ、
utf以外は文字化けするようにしてもらいたいと、
どこかの力のある団体が期限を限って勧告する。以上。
つーか、書いてて自分で笑ったが…。
しかし、でないと100年経っても変わりそうもない。
0526デフォルトの名無しさん
NGNG真珠の「パール」だと「パ」にアクセントがある感じですが、「Perl」の場合はアクセントをおかずに
平板に読む人もいるような気がします…。(身の回りの若干名ですが)どっちが正しい or 多数派
なのでしょう?
0527デフォルトの名無しさん
NGNG平板に読むのは職業病
0528デフォルトの名無しさん
NGNG0529デフォルトの名無しさん
NGNGその力のある団体というのが存在しないのが問題だよね。
M$がつぶれでもしない限りもう統一は無理だと思うし(笑)。
変換表が複数ある問題あたりさえ解決すれば日本語だけ
ならunicodeにのせてもそう困らなくはなっていると
思う。変換表問題についても、従来全角英字と半角英字
が混在しても検索で適当に同一視する機能なんかが整備
されてなんとかなってたように、たとえば「〜」のU+FF5E
とU+301Cが適当に同一視されるような環境が整備されて
そのうちなんとかなるのかな。Jcodeのような定番モジュール
の登場を期待したい。
0530デフォルトの名無しさん
NGNG専門家はRubyやcurlも?まさかCも?
0531デフォルトの名無しさん
NGNG0532526
NGNG専門家向けには「バール」で、一般の人向けには真珠の方でしょうかね?
通じれば最低限の目的は果たせるんですけど、日本人なので(?)、
みんなはどう発音しているのか気になって・・・。
0533デフォルトの名無しさん
NGNG↓スレの129です。
Perlでリクに答えるスクリプトを作るスレ
http://pc5.2ch.net/test/read.cgi/tech/1086143976/l50
マルチまがいで、すいません。
0534513
NGNGクレジット見る限り、全部が全部 Kogai さんが書いてるわけじゃないですよね?
>>507 で「欧米人にこの現状を理解してもらおうと思ったら」とあったので、
Kogai さん以外はそんなに理解の無いひとたちばかりなのかと思いました。
Encode 自体の実装については、
現在のように Perl 外の制約条件がこれだけ酷い状況下においては、
まあまあの線を行ってるんじゃないかと思ってはいます。
文句が言いたいのは Perl じゃなくて別にあるわけですが、スレ違いなのでやめます。
0535デフォルトの名無しさん
NGNGそのスクリプト計算結果間違ってない・・・?
とりあえず書いたやつのテストで結果つき合わせてみてるんだけど、
5,3,5,1とか与えた場合明らかにおかしいような・・・
atan2の引数のx,y間違えてないかな
それと、時計回り、反時計回りというのがよくわからない。
紙の上で考えた限りでは、半径の正負をひっくり返した場合と
等価に見えるんだけどそれであってる?
0536デフォルトの名無しさん
NGNGy軸は上下どっちをプラスにしたいのかな
数学的なグラフなら上がプラスだし、
画面座標的なものなら下がプラスにもなる。
0537デフォルトの名無しさん
NGNG原語の話だと、Pearlと同じ発音だとラリー・ウォールがどっかに書いてたんだが、
見つけられない...
日本語だと規定はないんだろうけど、おれは真珠のパールと同じく、「パ」に
アクセント付けてるね。「バール」と同じなんて気持ち悪い。
RubyもCurlも頭にアクセント付けてるなあ。
0538533
NGNGまずは、レスと試して下さった事に感謝します。ありがと。
欲を云いますと、あちらのスレでレスして頂けたらさらに嬉しかったです。
マルチ決定>私。ぐすん。もちろん、一言書き加えなかった私が悪いです。
あちらには、謝っておきました。
> そのスクリプト計算結果間違ってない・・・?
あまり自信はありませんが、一応実用化してますので極端に
間違ってはいないと思います。ポイントは最初の点からみた
距離で、絶対座標ではないとこです。
> それと、時計回り、反時計回りというのがよくわからない。
x軸は右を、y軸は上をプラスと考えています。数学的なグラフです。
> 紙の上で考えた限りでは、半径の正負をひっくり返した場合と
> 等価に見えるんだけどそれであってる?
はい。
ある二点を結ぶ円弧は半円で無い限り、4種類存在します。
例えば、x軸上に2点をおき半円でない円弧で結ぶ時、
中心がx軸上の上に来るものと、下に来るものです。
またそれぞれに半円以下の円弧と半円を越える円弧があります。
4種の円弧を決定するため、半径の正負と廻り方を使ってますが、
このスクリプトで決定される中心点は2点(または存在しない)のうちの
どちらかだけです。サブルーチンして受け取る引数としては冗長ですが
他との関連上、そう致しました。
0539デフォルトの名無しさん
NGNG「バール」と真珠の「パール」は同じアクセント。
0540535
NGNGすみません、配慮が欠けておりました。
はじめの5,3,5,1は机上で下向きの座標系とつき合わせてた・・・
これはあってましたね。
が、5,-6,5,-1の場合、x0.101230, y4.998975の値が正しいような。
x4.899, y-1.001となって、これは遠方の値では・・・
仕様に関しては了解です。
0541533
NGNG> すみません、配慮が欠けておりました。
とんでも、私こそ。
> 5,-6,5,-1の場合、x0.101230, y4.998975の値が正しいような。
> x4.899, y-1.001となって、これは遠方の値では・・・
おっしゃる通りです。orz
x0.101, y-4.999(yは負)が、得たいデータでした。
洗練化どころか、バグバグじゃないですか…私。
0542デフォルトの名無しさん
NGNGそっちは日本語での発音の話だよ? バールのほうは平坦に発音しないか?
0543デフォルトの名無しさん
NGNG0544535
NGNG計算ロジックから作り直したので別のバグが出てるかもですが
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行になりました。
0545533
NGNGうわぁぁぁぁい、ヽ(⌒▽⌒)/
ありがとう! 神さま、いえサンタさん。
なんて、かっちょ良いコード!
ちゃんと 座標=sinθ,cosθになってる。
中心点の選択、角度計算、角度→座標の実質たったの3行ですよね?
acos2がさらって出てくるところとか、ホレちゃいそうですよ。
じつは、私もはじめはそのように挑戦したのですが、さんざん悩んで
角度の向きが判らなくなって、あえなく自爆。情けないですorz
もう一度、ほんとぉぉぉっっっに、ありがとうございました。
0546デフォルトの名無しさん
NGNGperlかどうかはどうでもいい気がするのだが
三角関数使わない別解。
(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に落とすだけ。
0547デフォルトの名無しさん
NGNGmy($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);
}
0548535
NGNG計算用紙二枚が丸だらけになりますた。
>>546-547
うゎ、そっちの方法も考えたのにどうして思いつかなかったんだろう・・・
無理だと思い込んで、図形的な変換を行って計算しちゃった
その変換のほうが処理速度も速いだろうし・・・
0549533
NGNG>>546,547
ありがとうです。
三角関数を使用しないで中心点を求める所は、私の晒したバグコードと
同じですが、547さんのコードはバッチリ整理されていて比べものになり
ませんね。私の判定式なんて三角関数まで使って、しかもトチ狂ってるし。
詰めて書いてるのに、数値に小数点とゼロを付けて可読性をあげてらっしゃる
ので、とても見やすいです。出来る人は、センスが違うのですねぇ。
$iX*$iXを$iX**2としないのも、なにかこだわりを感じます。(もしかして
処理速度が、向上するのでしょうか?)
ご指導、ありがとうございました。m(_ _)m
>>535
長い時間、お付き合い頂い大変感謝です(TдT) アリガトウ
貴重なお時間を浪費させてしまい、申し訳ありませんでした。m(_ _)m
0550デフォルトの名無しさん
NGNGなんだか、昔のN88 Basic かなんかみたいな話題だよね。
いいね、こういうの。
perlよ、N88 Basic を目指せ!ってね。
なんというか、実用一点張りというのではなくて、
もっとゲームとかにも気軽に使うという動きがあっても
いいと思うんだけどね。
0551デフォルトの名無しさん
NGNGそういうお前は顔文字の入力に貴重な時間を浪費してると思わんのか。
まあいい。
0552デフォルトの名無しさん
NGNG0553デフォルトの名無しさん
NGNGじゃあ、Perlの話題に戻るぞ
でも発音の話題は勘弁な
0554デフォルトの名無しさん
NGNGファイルを上書きでopenするときは、
open FH, ">> test.txt";
とするとできるのですが、
ファイルの後ろにシステム日付時刻を付けたいときは
(test-yyyymmddhhmm.txt)
どのようにすればよいのですか?
どなたかヒントだけでも教えていただけないでしょうか?
0555デフォルトの名無しさん
NGNGつーか上書きになってないよそれ。
0556デフォルトの名無しさん
NGNGopen FH, ">> test$now.txt" ;
ではうまくファイルができないのですが、
どういうふうに書けばいいのですか?
0557デフォルトの名無しさん
NGNGor die $^E でもつけれ。
0558デフォルトの名無しさん
NGNGできた!!
0559デフォルトの名無しさん
NGNGできた!じゃないだろ?まず、555さん(仮面ライダー?確変?)に
礼を云って、指摘された追記を上書きに直して、顛末を書きsageだ。ボケッ。
0560デフォルトの名無しさん
NGNGこんな感じのsubのレファレンスの変数$testを
引数付きで実行するにはどうすればいいですか。
0561560
NGNG&$test("OK");
でOKでした。
0562デフォルトの名無しさん
NGNGそのモジュールを使っているスクリプトを
perl -CDS hoge.pl
のように実行しても、-CDSがモジュール内部のI/Oに適用されず
読み込んだ文字列のutf8フラグが立ちません(ASCII文字以外でも)。
モジュールを書き換えないでその中のI/Oを:utf8にするには
どうしたらよいのでしょうか?
Perlは5.8.4で試しています。
0563デフォルトの名無しさん
NGNG->()
じゃないのかえ?
定型以外、頭に入っとりませんが、なにか???
0564563
NGNGつーか、てめえ、560、
とっとと配列かハッシュに入れてから、
デリファレンスの仕方、聞けー、
というより、逝ってきます >わし
0565デフォルトの名無しさん
NGNGそこから ある文字列を検索してヒットした位置から
ある特定の文字("等)までを 複数行にわたって出力するCGIを作りたいのですが
どうやればいいのでしょうか?
0566デフォルトの名無しさん
NGNG0567デフォルトの名無しさん
NGNG0568565
NGNG0569デフォルトの名無しさん
NGNG>>1
0571デフォルトの名無しさん
NGNG0572デフォルトの名無しさん
NGNGそれはさすがに質問しすぎ。
0573571
NGNGすいません
私は
open(IN, "file.txt");
@xx = <IN>;
foreach $yy (@xx) {
if($yy =~ /hoge/){
print $yy;
}
}
close(IN);
とやっているのですが これはかなり負荷が高くなってしまうと思い
皆さんはどうしてるのかと思い質問させていただきました
すいませんがよろしくお願いします
0574デフォルトの名無しさん
NGNGかまわんよそれで。鯖屋やってるわけじゃないんだろ。
0575デフォルトの名無しさん
NGNG0577デフォルトの名無しさん
NGNG「マシンパワー」って何の事かね
0578デフォルトの名無しさん
NGNG状況次第。いいかげんうざいよ。
0579デフォルトの名無しさん
NGNG0580デフォルトの名無しさん
NGNGただそれだけの処理ならこう
open(IN, "file.txt");
while (<IN>) {
print $_ if /hoge/;
}
close(IN);
まあ自分が書くなら、ファイル開くにはIO::File使うけど
0581580
NGNG0582デフォルトの名無しさん
NGNG一回だけスキャンすればいいじゃん。
0583デフォルトの名無しさん
NGNGバカでかいテキストファイルだったら嫌じゃね?
0584デフォルトの名無しさん
NGNG結局状況次第になっちゃうよねえ。
- テキストのサイズ
- 1行あたりの長さ
- 行をまたぐのか否か
- 実行する状況/環境
- マッチ位置を全部見つけるのか否か
などなどで。
0585デフォルトの名無しさん
NGNGいずれにせよ、スキャンしないで何かを探すのは無理じゃないの?
あらかじめインデックスみたいの作っとくにせよ何にせよ。
0586デフォルトの名無しさん
NGNG\sとか\dみたいなやつ。
2バイト文字が5文字以上連続しているところを探したいんですけど。
jperlってスレ違いですかね?
0587デフォルトの名無しさん
NGNGスレ違いじゃないけど過去ログ嫁
過去ログ読んだら空気も嫁
そういう事で頼む
0588デフォルトの名無しさん
NGNGBNFファイルを元に字句解析や構文解析をするモジュールって
ありますでしょうか?
0589デフォルトの名無しさん
NGNG0590デフォルトの名無しさん
NGNGrequire './cgi-lib.pl';
がエラーになってしまいます。(これ以外は問題ない。)
どうすればよいでしょうか?
0591デフォルトの名無しさん
NGNG0592デフォルトの名無しさん
NGNG0593デフォルトの名無しさん
NGNG0594デフォルトの名無しさん
NGNGこれ書く奴って大概他がおかしい。
0595デフォルトの名無しさん
NGNG0596デフォルトの名無しさん
NGNGでも require './cgi-lib.pl'; をコメントアウトするだけで
CGIプログラムエラーのため表示することが出来ません。(500 Internal Server Error)
はでなくなります。
0597デフォルトの名無しさん
NGNG>>1読めねーの?
板違いだからどっか行ってね。
0598デフォルトの名無しさん
NGNGhoge, fuga の次は puyo ですか?
0599デフォルトの名無しさん
NGNGpuyoは聞いたことない。
個人的にはgikoとmonaを使っている。
0600デフォルトの名無しさん
NGNG俺漏れも
0601デフォルトの名無しさん
NGNG0602デフォルトの名無しさん
NGNG0603デフォルトの名無しさん
NGNGfoo bar hoge fuga puyo の検索結果 約 4 件中 1 - 2 件目 (0.35 秒)
ここPerlスレだよな?
全く関係ないわけじゃねぇけどさ
0604デフォルトの名無しさん
NGNG0605デフォルトの名無しさん
NGNGここPerlスレだよな?
全く関係ないわけじゃねぇけどさ
0606デフォルトの名無しさん
NGNGperlでジョイパッドの振動を検知したいんですが、可能ですか?
可能であればヒントください。
0607デフォルトの名無しさん
NGNG0608デフォルトの名無しさん
NGNGMP3::Infoモジュールで、MP3ファイルのタグ操作をしようとしています。
my $tag = get_mp3tag($file);
でタグ情報を得た後、それぞれの要素の文字コードを変換したいのですが、
$tag->{TITLE}
みたいなハッシュのリファレンスの場合、eachは使えないのですね。
こういう場合どんな風に書けばよいのでしょうか。初心者スマソ
0609デフォルトの名無しさん
NGNGwhile(my($key,$value) = each(%{\tag})){
#処理#
}
0610デフォルトの名無しさん
NGNGwhile(my($key,$value) = each(%{$tag})){
#処理#
$tag->{$key} = $value;
}
0611デフォルトの名無しさん
NGNGオブジェクトとかクラスとか絡んで来ると、
Perlって全く違った言語みたいになりますね。
やっぱプログラミングPerl買った方がいいか.....。
どうもありがとうです。
0612デフォルトの名無しさん
NGNGどうすればいいでしょうか
0613デフォルトの名無しさん
NGNG漏れの場合は、自分の権限の及ぶディレクトリにモジュールを設置しといて、
そのディレクトリを環境変数 PERLLIB に設定する。
0614デフォルトの名無しさん
NGNGのような感じではできないのでしょうか?>>612
依存関係があると、インストールが凄く手間がかかると思うのですが
0615デフォルトの名無しさん
NGNGttp://homepage3.nifty.com/hippo2000/perltips/CPAN.htm#FAQ
5) rootではありません。どうすれば個人的なディレクトリにインストールすることができますか?
あと、make_arg や makepl_arg なんかに --prefix を設定するのが良いと思う。
(たしかCPANの初回起動の設定時に、非rootはそうしろというメッセージがあった)
0616デフォルトの名無しさん
NGNGspliceを使えば良いのでしょうか?
すみません、誰か「こうしたらよい」と言うのがあれば教えてください。
0617デフォルトの名無しさん
NGNGman perlfunc
0618デフォルトの名無しさん
NGNGsplice @array, 99;
>>617
せめてperlfunc -f spliceと言ってやれよ
0619デフォルトの名無しさん
NGNG0620デフォルトの名無しさん
NGNG0621デフォルトの名無しさん
NGNGopen みたく、第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 に似せたい、ということです。
0622デフォルトの名無しさん
NGNGuse 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;
0623デフォルトの名無しさん
NGNG質問者(>>621)ですお答えいただきありがとうございます。
やはり use strict 下でユーザー作成なサブルーチンの引数に Bareword 書くのはちょっち無理がありっぽそうですね〜(汗
'=>' を ',' に変えて
<PRE>Foo->my_open(BAR, '>', 'bar.txt')</PRE>
とすると駄目。(use strict をはずすと OK。)
'=>' を使うと何も言われないのは、$hash{'key'} と $hash{key} を等価とするルールが効いてるんでしょうか。
ややこしいよ! > Perl。
それはともかく、caller を使って呼び出し元のパッケージ名を得て、シンボルの完全修飾するところはとても勉強になりました。
ありがとうございます。
0624デフォルトの名無しさん
NGNGperlsub(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;
0625デフォルトの名無しさん
NGNG>>623 で寝ぼけたこと書きましたが、これは >>622 に対する感動のあまり、perlsub に書かれてる
A "*" allows the subroutine to accept a bareword, ...(ry
という事実を失念してたせいです _| ̄|○|||
Symbol モジュールについては初耳ですた。ソース読んで見ます。
ドキュメントももっと真面目に読んでみます _n。
しかし、>>622 でも片鱗が垣間見れましたが、シンボルをデータとして扱えるあたり、
まるで Lisp さんのようだ。
0626デフォルトの名無しさん
NGNG$aは1以上5以下とする場合は
if (1 <= $a <= 5) {
}
で認識されますでしょうか?
確認できる環境にありませんのでご教授ください
0627デフォルトの名無しさん
NGNG0628デフォルトの名無しさん
NGNG0629デフォルトの名無しさん
NGNG0630デフォルトの名無しさん
NGNGperldoc perldos
0631デフォルトの名無しさん
NGNG0632デフォルトの名無しさん
NGNGabc(tab)xyz
def(tab)123
こんなのが1万行以上続くファイルがあって、
Search('abc')でxyzが返ってくるようなサブルーチンを作ろうとした場合
m/$pattern\t([^\n]*)/
ではあまりに効率が悪いと思うんですが、もっと良い方法ってあるんでしょうか?
0633デフォルトの名無しさん
NGNGabc(tab)123
abc(tab)456
みたいに重複したらどーすんの?
0634デフォルトの名無しさん
NGNGDB_Fileとか使った方が楽だよ
0635632
NGNG>>634 サンクスコです。DB使うと速いんだろうなーとは思っていたんですが、DBについて全く無知
なものでなんとなく遠慮してました。ちょっと勉強してみます。
質問自体は純粋な興味も含んでますのでテキスト形式で速い方法があれば、教えて頂きたいです。
0636デフォルトの名無しさん
NGNGforeach(@data){
$_ =~ /([^\t]+)\t(.+)/;
$list{$1} = $2;
}
print $list{'abc'};
とか。
只、ループのコストはしらね。
0637デフォルトの名無しさん
NGNG- hashに読み込んで使う
- suffix arrayを使う
- テキストをソートして二分探索法を使う
0638デフォルトの名無しさん
NGNG私もDBを使う機会があって勉強したのですが、案外簡単に作れますよ。
一週間でマスターするPerlで、DBの作成方法は載ってたかと。
データベース作成の部分だけ抜き出して使えば、その日のうちに出来ます。
0639デフォルトの名無しさん
NGNG> >>634 サンクスコです。DB使うと速いんだろうなーとは思っていたんですが、DBについて全く無知
> なものでなんとなく遠慮してました。ちょっと勉強してみます。
DB_File類のDBは、エントリの追加、書き換え、取得などをそつなくこなす
ためにチューニングされているので、必ずしも速いとは限らない。
0640デフォルトの名無しさん
NGNGとはいえ、ベタテキストの線形探索より遅いってことはねえべ。
0641デフォルトの名無しさん
NGNG> とはいえ、ベタテキストの線形探索より遅いってことはねえべ。
それは分からん。1万2万程度だったら、まだ線形の方がましかも。
0642632
NGNG確かに対象データによって速度は色々ですよね。あいまいな質問で申し訳ありませんでした。
元はだいたい1万語程度の和英対訳のデータで、線形検索でも実際即座にレスポンスがありました。
データ数が増えれば、線形検索 < 二分探索法 < ハッシュ≒DBと言ったところでしょうか。
ちょっと勉強してベンチとってみたいと思います。大変参考になりました。
0643デフォルトの名無しさん
NGNG0644デフォルトの名無しさん
NGNGundef 変数;
0645643
NGNGありがとうございます!
0646デフォルトの名無しさん
NGNGおめぇ自前でバイナリサーチ書いたことねえべ
適当なことゆってると笑われるぞ
0647デフォルトの名無しさん
NGNGほっといてやれ。彼には一生理解できまい。
0648デフォルトの名無しさん
NGNG> おめぇ自前でバイナリサーチ書いたことねえべ
> 適当なことゆってると笑われるぞ
DB_Fileには、わたしが書いたコードも入ってる。
0649デフォルトの名無しさん
NGNG0650デフォルトの名無しさん
NGNGSocket.pmにはわたしが書いたコードが入ってる。
結構日本人も手を入れてるんだよ。
そんなに珍しい話じゃないよ。
0651デフォルトの名無しさん
NGNG0652デフォルトの名無しさん
NGNG0653デフォルトの名無しさん
NGNG頼もしいなあ。
0654デフォルトの名無しさん
NGNGそうじゃなくて、手を入れたからってその中身が全て理解できてんの?
という意味で言ったの。
Jcode.pm にはわたしが書いたコードも入ってるが、中身はさっぱりわかってないしな。
0655デフォルトの名無しさん
NGNG素朴な疑問なんですが、n 個のデータの並びがランダムなら、
探索に擁する平均の時間計算量は
線形探索:O(n) = n / 2
バイナリサーチ:
ソーティングに O(n) = n * log(n)
サーチ単体に O(n) = log(n)
なのであって、n がどうあろうとも平均的には線形探索が速くありませんでしょうか??
(データの並びがランダムなら、むしろ線形探索より速度有利なのはハッシュぐらいなのでは?)
0656デフォルトの名無しさん
NGNGソーティングは最初に一回やればいいんですね・・・_| ̄|○|||
0657デフォルトの名無しさん
NGNGすでにソートされてる所に新しく要素を追加するならそんなにかからないよ。log(n)でいい。
0658デフォルトの名無しさん
NGNGスクリプト言語の場合、変数へのアクセスやユーザ定義の
サブルーチン類の実行が非常に遅いので、オーダーの件が
影響し始める前に、コードの単純さやビルトインのルーチ
ンのみで済むかどうかがものをいうことが多々あるな。
最近のマシンでの閾値がどれくらいなのかは知らんが。
0659デフォルトの名無しさん
NGNGぼけたこと書いた身なので指摘するのは心苦しいのですが、それは挿入位置をバイナリサーチで見つける手間ですよね。
んで、バイナリサーチがその手間で適用できるということは、データはリンクリストでなくて、配列状に格納されてなきゃならないわけで、
挿入の際、後続要素をずらす手間が別途かかりますがな。(平均で O(n) = n/2)
>> 655 (漏れだよ_| ̄|○|||
最後の () 内は大嘘。前提に誤解がある。
・・・perl から離れてスマソ
0660デフォルトの名無しさん
NGNGトライとかB木とかパトリシア木とかダブル配列とか
出てきて底なしだから、どこかで妥協するのが現実的な
ソリューションだろう。だいたいそのうちスクリプト言語で
書いている自分に空しさを感じはじめるし。
0661デフォルトの名無しさん
NGNGま、とにかく、辞書をソートして良いのなら、
look.plやSearch::Dictを参考にバイナリサーチを書けばそこそこの
スピードのものが簡単に出来るんじゃないか?
DB_Fileは、使用中にデータが変更されるのでなければ
大げさすぎだろ。
0662デフォルトの名無しさん
NGNGDB_Fileを使ってハッシュに入れてしまえばプログラミングが
楽だってことでしょう。
わたしなら空間効率の良いCDB_Fileを勧めるけどね。
0663デフォルトの名無しさん
NGNG>>632 に書いてあるパタンマッチの方法でも、そんなに遅くないんじゃないの?
0664デフォルトの名無しさん
NGNGあらかじめファイルに保存しておき、
単に検索時に該当するファイルを開いて読むのが
サーチ時間もデータのロード時間も一番短いんでね〜の?
0665デフォルトの名無しさん
NGNGやけになっちゃダメです!!
ディレクトリ検索はコストゼロじゃないし(線形探索では?)、
1エントリごとに最小ディスクブロック(8KB?)占有するし
でかなり高コストだと思う。
0666デフォルトの名無しさん
NGNG正規表現のコンパイルおよびマッチングエンジンは
ネイティブコードで書かれてるわけで、スクリプトで書いた探索ルーチンなど問題外な動作速度のはず。(未検証)
特に >>632 程度のパターンならコンパイル時間など一瞬で無視し得るだろうし、
マッチング中にバックトラックが発生する危険もない。
>>664 それ正論ですね!
いや私も >>657 書いて初めて認識しましたが、一たびランダムな順序になってしまった(<これ重要)
n 個のデータの探索は、どんなアルゴリズム使っても結局トータルで O(n) = n になっちゃう。
データの追加の時点で、将来の検索を見越して、ファイルに分けるなりB木にするなりの準備をして、
いかにランダムせずに済ますかが O(n) = n の壁を破る肝かと。
>>665 というわけで、>>664 は別にやけになってないと思うにゅ。
まあ、たしかに n が比較的小さければ、>>665 や >>658 の方が言うような
細かなコストの積み重ねが時間決めちゃうんだろうけど。
0667デフォルトの名無しさん
NGNG> >>663 確かに最速かも。
> 正規表現のコンパイルおよびマッチングエンジンは
> ネイティブコードで書かれてるわけで、スクリプトで書いた探索ルーチンなど問題外な動作速度のはず。(未検証)
> 特に >>632 程度のパターンならコンパイル時間など一瞬で無視し得るだろうし、
> マッチング中にバックトラックが発生する危険もない。
純粋なマッチングに関して言うと、regexpは相対的に遅いので、
メタ文字を使わないことが可能なマッチングなら、indexでsubstrの
ほうが良い。
0668デフォルトの名無しさん
NGNG> いや私も >>657 書いて初めて認識しましたが、一たびランダムな順序になってしまった(<これ重要)
> n 個のデータの探索は、どんなアルゴリズム使っても結局トータルで O(n) = n になっちゃう。
> データの追加の時点で、将来の検索を見越して、ファイルに分けるなりB木にするなりの準備をして、
> いかにランダムせずに済ますかが O(n) = n の壁を破る肝かと。
いや、ランダム順のファイルに対し、suffix arrayとか、
バイナリサーチを仕掛ける方法はある。
> >>665 というわけで、>>664 は別にやけになってないと思うにゅ。
> まあ、たしかに n が比較的小さければ、>>665 や >>658 の方が言うような
> 細かなコストの積み重ねが時間決めちゃうんだろうけど。
わかった。やってみんしゃい、やてみんしゃい。
0669デフォルトの名無しさん
NGNG「細かなコスト」という悪い表現つかっちゃったけど、そういうものを軽視はしていないつもり。
>>666 は、n が 10 兆と 100兆 とかの雲の上のケースで、しかも検索初回でのみ成立する空論だということで一つ 人´Д`;)
(2 回目以降ならデータはソート済みのため、たしかに O(n) = n より早くできる。)
0670デフォルトの名無しさん
NGNG(少なくとも UNIX では) >>665 の言うとおり open(2) はディレクトリを線形探索するので、
ひとつのディレクトリに数万ファイルとかあるとそれなりに重くなる。
ので、ファイルはディレクトリ細かく分けて配置するのが良い。
たとえば ./a/b/c/abc.dat みたいな感じにディレクトリ切るのがおすすめ。
0671デフォルトの名無しさん
NGNG検索することに走りすぎで、元のファイルの作成・管理を
考えたら、ファイルを分けるとか、ディレクトリを切るとか、
やってられないと思う。
だいたいにおいて、一つの値がいくつかの属性を持ってて、
別の属性で調べろとか言われたら破滅でしょ。
(名前、年齢、住所と並んでて、名前じゃなくて年齢でと言われた場合)
DB_Fileなら、MLDBMと組み合わせれば、それもバッチリらしいよ。
しかし、ここまできて、DBIに誰も触れないのは不思議。
MySQLとかPostgreSQLとかまでいかなくても、
CSV(つまり、カンマ区切りテキストですが)でも、
DVD::CSVを使えば利用できるようなんだけど…。
0672デフォルトの名無しさん
NGNGあうっ、DBD::CSV
0673デフォルトの名無しさん
NGNG> ので、ファイルはディレクトリ細かく分けて配置するのが良い。
> たとえば ./a/b/c/abc.dat みたいな感じにディレクトリ切るのがおすすめ。
ディレクトリ構造は、ディレクトリごとに異なるシリンダグループに
配置されたりするから、これはディスクアクセスの量を増大させるし、
ディスク上の局所性も悪い。
また、最小ファイルサイズの問題もある。これがまたディスクアクセスの
量を増大させる。もちろん、各ファイルの後方のフラグメントは、他の大
きなサイズのファイルから利用可能だけど、数が多すぎです。
squidやccacheとは粒度が違うでしょ、粒度が。
っていうか、もはやどういう制限があって何がしたいのかと言う話が
めちゃくちゃになってるし。
0674デフォルトの名無しさん
NGNG0675デフォルトの名無しさん
NGNG排泄器に。
0676デフォルトの名無しさん
NGNG> 検索することに走りすぎで、元のファイルの作成・管理を
> 考えたら、ファイルを分けるとか、ディレクトリを切るとか、
> やってられないと思う。
そういうツールを書けばよいだけ。
> だいたいにおいて、一つの値がいくつかの属性を持ってて、
> 別の属性で調べろとか言われたら破滅でしょ。
それはまた別の話。
> (名前、年齢、住所と並んでて、名前じゃなくて年齢でと言われた場合)
> DB_Fileなら、MLDBMと組み合わせれば、それもバッチリらしいよ。
MLDBMはそういうことは出来ないと思うが。
だいたい、プレフィックスなどつければ、
ふつうにDB_Fileでもできるし。
> しかし、ここまできて、DBIに誰も触れないのは不思議。
だから、そこまで大げさな話じゃないってことさね。
0677デフォルトの名無しさん
NGNG0678デフォルトの名無しさん
NGNG0679デフォルトの名無しさん
NGNG>MLDBMはそういうことは出来ないと思うが。
MLDBMの具体的使用例は、CGIプログラミング第2版(オライリー)
で見た。P280
これを見ると、ハッシュでキーと値というだけでなく、
ネストされたデータ構造を持てる。
マリーさんの電話番号の、1番目のじゃなく2番目のやつ
を特定して取り出せるというの。
ハッシュの値に、配列のリファレンスが
入ってるということだよね。
MLDBMはそういう機能をもってるらしい。
MLDBMを使わないとなると、SQLまで行かないと出来ないんじゃない?
0680デフォルトの名無しさん
NGNG> >MLDBMはそういうことは出来ないと思うが。
>
> MLDBMの具体的使用例は、CGIプログラミング第2版(オライリー)
> で見た。P280
MLDBMは最初のリリースから使ってる。
> これを見ると、ハッシュでキーと値というだけでなく、
> ネストされたデータ構造を持てる。
そうだ。
> マリーさんの電話番号の、1番目のじゃなく2番目のやつ
> を特定して取り出せるというの。
> ハッシュの値に、配列のリファレンスが
> 入ってるということだよね。
だからできない。まず、「マリーさん」を検索してデータ構造を取得し、
―ここでマーシャリングされていたデータ構造が展開される(激重)―
その中の2番目を取得するというステップを踏む必要がある。
> (名前、年齢、住所と並んでて、名前じゃなくて年齢でと言われた場合)
> DB_Fileなら、MLDBMと組み合わせれば、それもバッチリらしいよ。
の例なら、まず、すべての名前の一覧を取得して、それで検索し、
ひとつひとつ展開して、合致する年齢を探し出す必要がある。
そこまでやるのなら、すっぴんDB_Fileにプレフィックスをつけたエントリを
直接展開した方が速い。
0681デフォルトの名無しさん
NGNG>>632の方法と、index-substrと、sort-binsearchのみっつくらいで。
キーの重複はないって条件付きだからそこは悩まなくてもよさ下。
0682デフォルトの名無しさん
NGNGO(n) がAAに見えて仕方ありません…
ヒロシです… ヒロシです… ヒロシです…
0683デフォルトの名無しさん
NGNG質問者がよってこなくなるぞ、と。
仮眠前にこのスレ見るのはもうやめよう・・・。
けど>>681の結果は知りたいな。
0684デフォルトの名無しさん
NGNG内容ファイルを分ければいいじゃない。
0685デフォルトの名無しさん
NGNG0686デフォルトの名無しさん
NGNGつきつめていくとBerkeley DBの再発明になりそうな予感。
0687デフォルトの名無しさん
NGNGそれは、MLDBMの再発明になると思われ。
0688デフォルトの名無しさん
NGNG昔1万レコードくらいのテキストファイルを>>632の方法と
BerkeleyDBで比較したら10倍くらい>>632の方法が速かったよ
0689デフォルトの名無しさん
NGNG予めDBに入れておいてです。
0690デフォルトの名無しさん
NGNGたとえば、DBIを考えてみれば、
DBD::CSVでカンマ区切りテキストを扱えたり、
サーバを必要としない DBD::SQlite が使えるよ。
汎用性とか、使いまわしの容易さとか、他と違うと思う。
たとえばの話、DBIx::Dumper モジュールを使うと、
EXCELファイルにも即、出来るらしいよ。(クックブック第2版P705)
0691デフォルトの名無しさん
NGNGこんなシンプルな問題で汎用性を考えたら、
地獄に落ちるのは目に見えている。
0692681
NGNG下準備↓
== makedata.pl
use strict;
for my $i (1..20000) {
print "@{[$i*2]}\t", crypt($i, reverse $i), "\n";
}
== console
%perl makedata.pl > data.txt
(長いので続く)
0693681
NGNGuse 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]}; }
0694681
NGNG%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)
0695681
NGNGbinsearchは結構いい加減なプログラムですまん。splitのコストがどれくらいだろうなぁ。
ただデータがソートされていない場合は別途ソートの必要有りなことに注意。
キーの重複もダメね。今回はキー重複は無視していいみたいだけど。
hashはとりあえずはやい。ただこのベンチマーク結果はハッシュ構築のコストは計ってない。
あと、空間コストが一番多くかかってるのはこれじゃないかな(予想)。
Perlのハッシュ実装がどうなってるかは知らんですが。
あとやっぱしキーの重複はダメね。
0696デフォルトの名無しさん
NGNG> おいおまいら。ベンチマークとってみましたよ。
とってないじゃん。
0697デフォルトの名無しさん
NGNG問題が違うんじゃない?
線形を甘く見るなというのは、ぼくも先輩から言われたことがある。
スクリプト言語だとデータ構造の構築にも時間がかかるから、
データの数が少ない時には、さっさと線形サーチでやってしまった方
がいいという話だと思うけど、でもそれって、一度の起動で検索一度の
ケースだよね? みんなその前提で書いているようだけど、そういう条件なの?
0698デフォルトの名無しさん
NGNG0699デフォルトの名無しさん
NGNG0700デフォルトの名無しさん
NGNG逸れてないって。
要するに、大は小を兼ねるでさ、DBIのたとえばSQLiteでもいいさ、
使っておけば、後から予想もしない何事かを要求されても、
平然としてられるでしょ。
0701デフォルトの名無しさん
NGNGクックブック第2版p725にある。
誰か、もっと詳しい紹介があったら、教えて。
日本語は、utf-8でokでいいよね?
0702デフォルトの名無しさん
NGNG必要になったら必要になった時にそれを使った
システムを書けばいいだけじゃん。
0703デフォルトの名無しさん
NGNG要するに、過ぎたるは及ばざるがごとしでさ、(ry
0704デフォルトの名無しさん
NGNG>>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 (オロオロ(´д`;)
0705デフォルトの名無しさん
NGNG$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 は未修正。)
0706デフォルトの名無しさん
NGNGいや、だからそういう問題じゃないと思うんだけど。
0707デフォルトの名無しさん
NGNGDB_Fileを使った時と、単純に線形探査したときの比較の話じゃなかったの?
で、ワンショットコマンドでというのも条件?
0708デフォルトの名無しさん
NGNG個人ならそれでいいけど、これが会社とかでの話になると
新規に作るには時間もかかるし、当然人件費がかかる。
ならば今ある物に手を加えて……と、スパゲッティプログラムへの道を歩むことになる。
実際は新規に作った方が短時間になるケースが多いんだけどね。
未だに誤った選択をしてしまう会社は多いよ。
0709デフォルトの名無しさん
NGNGサブルーチン foo の中でサブルーチン bar を呼び出したとき、
bar が失敗したらウォーニングを表示して即座に undef を返したいんですが、
$x = bar() or warn "$!\n", return;
と書くだけで本当に大丈夫なんでしょうか? (この構文において、返される undef は一体誰が作ってるんでしょう?)
0710デフォルトの名無しさん
NGNGSQLite
http://perldoc.jp/docs/modules/DBD-SQLite-0.19/SQLite.pod
RDBMSを動かすためには、単にこのモジュールをインストールすることだけが必要です。
他には何もありません。
0711デフォルトの名無しさん
NGNGよく分からんけど、
http://perldoc.jp/docs/perl/5.6.1/perlvar.pod
に下のように書いてある、 $SIG{__WARN__} が使えない?
警告メッセージを表示しようとするときに $SIG{__WARN__} で
示されたルーチンが呼び出されます。
警告メッセージは最初の引数として渡されます。
__WARN__ フックがあると、通常の STDERR への警告の出力は行われません。
これを使って、警告メッセージを変数にいれたり、
あるいは以下のようにして警告を致命的エラーに変えたり出来ます:
local $SIG{__WARN__} = sub { die $_[0] };
0712デフォルトの名無しさん
NGNG読み込んだテキストファイルをそのまま標準出力すると、
行末がcr cr nlになってしまいます。入力ファイルの行末はcr nlです。
どう解決すればよいのでしょうか?
環境はcygwinのPerlです。よろしくお願いします。
0713709
NGNGやりたいのはウォーニングを出して 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 が返されたので、すかーり自信喪失してしまい・・・というわけです。
しょうもない質問ですいません(滝汗
0714デフォルトの名無しさん
NGNG0715デフォルトの名無しさん
NGNG複雑に考えずにperlfunc(1)のreturnの説明を読めば
EXPR が指定されなかった場合は、リストコンテキストでは空リストを、
スカラコンテキストでは未定義値を返します。そして(もちろん)void
コンテキストでは何も返しません。
と思いっきり書いてあるわけだが。
0716デフォルトの名無しさん
NGNG入れるとき chomp して、
出すとき \n じゃダメなの?
そういう問題じゃなくて???
0717デフォルトの名無しさん
NGNG隣町や隣の県に行くときは交通手段を変えないと遅くてやっていられない。
だったら初めからコンビニに行くのもスケーラビリティの高い自動車でいく癖をつけとけば単純明快だよ。
0718712
NGNGはい、実際そのようにしています。
ただ、そのままchompをしただけだと行末が
cr ln → cr
となり、さらにこれに\nをつけて出力すると
cr → cr cr ln
となってしまいます。
そこで、chompの前に $/ = "\r\n" を入れれば期待通りの動作になるのですが、
そうすると>>712のコードが以下のように若干汚くなることが気になって質問したのです。
$/ = "\r\n";
while (<>){ chomp; print $_,"\n"; }
0719デフォルトの名無しさん
NGNG> だったら初めからコンビニに行くのもスケーラビリティの高い自動車でいく癖をつけとけば単純明快だよ。
そんな「だったら」は無いだろ(w
0720デフォルトの名無しさん
NGNGbinmodeぶちかますのじゃだめなの?
0721デフォルトの名無しさん
NGNGlnってlfでは?
CR = \r
LF = \n
>cr → cr cr ln
CR にLF足すのにCR+CR+LFになるっておかしくないか?
cygwinのせいなのか?
他環境でも動作させるように考えるなら、s/\r|\n//; でもしてCRもLFも削った方が良いような気がする。
0722721
NGNG○ s/\r|\n//g;
0723デフォルトの名無しさん
NGNG> 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; すること自体には異論はない。)
0724デフォルトの名無しさん
NGNG環境にもよると思うけど s/\n\z/; s/\r\z/; の方が速い鴨。
0725723
NGNGWindowsXP + Cygwin 1.4.11-1 + perl v5.8.5
で試したところ、print while(<>); だけでもリダイレクト結果に "\x0A" しか付かなかった _| ̄|○|||
>>712 において、行末に "\x0D\x0A" が付くのは Win 環境の perl (v5.6.1) だけだった。
役に立たなくてすまね >>712
0726723
NGNGCygwin 環境自体は 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 のようなことは起きない。
0727デフォルトの名無しさん
NGNGその選択によってCRLFの扱いが変わったりすることは無いの?
0728デフォルトの名無しさん
NGNGまた同じXという障害が起きたらBという行動
このように交互に繰り返してループさせるにはどうすればいいんでしょうか。
全くの初心者なんですが、苦悩しすぎてハゲそうです。
お助けを・。
0729デフォルトの名無しさん
NGNGすがどうするのがよいでしょうか?
0730デフォルトの名無しさん
NGNGuse HTTP::Date;
my $a = str2time('Jan 8 18:31:55');
print "$a\n";
0731デフォルトの名無しさん
NGNGある。
$ mount
の結果貼れば解決するかも。
0732デフォルトの名無しさん
NGNGX が起きたのが遇数回か奇数回なのかを状態変数に持たせる。
(下のリストでは $state がそれにあたる。)
同じ入力で、動作を次々変えたいときの常套手段。
my $state = 0;
for (;;) {
#...
if (X 発生) {
if ($state == 0) {
A;
$state = 1;
} elsif ($state == 1) {
B;
$state = 0;
}
}
# ...
}
0733デフォルトの名無しさん
NGNGTHX
0735723
NGNG$ 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 のような摩訶不思議な現象とは無縁だったらしい。
0736727
NGNG>>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)
0737712
NGNG丁寧な分析ありがとうございました。
ほか、私の質問にレスをしてくれた方々、ありがとうございました。
原因はやはりテキストモードにあったようです。
% 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しなおして、バイナリモードに変更したところ、前記の問題は
無事解決いたしました。
ありがとうございました。
0738デフォルトの名無しさん
NGNG枝葉末節の違いをのぞけば、本質的には同じだよね?
0739デフォルトの名無しさん
NGNGIT用語辞典とかで調べたらすぐに判るだろうに
わざわざ恥晒しに来るなんて物好き。
0741デフォルトの名無しさん
NGNGexeファイルとプログラム言語は 本質的には同じだよね?
ぐらいの間違い。
0742デフォルトの名無しさん
NGNG見方によっては間違いでは無い。上のも同じ。
0743Rubyist!
NGNG0744デフォルトの名無しさん
NGNG> 見方によっては間違いでは無い。上のも同じ。
見方によって変わるファクターは「本質的」ではない。
0745デフォルトの名無しさん
NGNG1つ例を挙げてくれよ
0746デフォルトの名無しさん
NGNG0747デフォルトの名無しさん
NGNGえと、皆さん知ってて黙ってるんだとは思いますが、言いたくてしょうがないので言わしてください。
>>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, ... ],
...
}
とすれば可。
0748デフォルトの名無しさん
NGNG> >>695 において、binsearch とハッシュについて、「キーの重複はダメ」と書かれてますが、それは謙遜のしすぎです。
わざわざキーの重複まで網羅していないだけのちょこっと書いた
ベンチマーク目的のコードに謙遜など持ち出すのはまちがい。
0749デフォルトの名無しさん
NGNG0750デフォルトの名無しさん
NGNG0751デフォルトの名無しさん
NGNG0752デフォルトの名無しさん
NGNG$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;
}
0753752
NGNG2.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
となってしまいます。
自分では間違いが見つけられません……どうか間違いをご指摘下さい。
0754デフォルトの名無しさん
NGNGコピペ時点でソース間違ってね?
少なくとも、@INDATA=(2.2,2.3,2.4,2.5,2.6) の後ろの ';' が抜けてて Syntax error だし、
それを直したとしても、$xint = 0.01 のままだと print "$x\t" が 50 回実行されてしまうわけだが。
0755デフォルトの名無しさん
NGNGこんなときの -d !
つーか、まず何をしたいのか、日本語で一回書け!
それが分からんと、わけわかーっ!!!
0756754
NGNGたぶん、>>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 加算をスケーリングして整数の加算に直せ。いじょ。
0757754
NGNG@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;
}
0758752
NGNG#! /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++;
0759752
NGNG$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することで正規分布に近い感じが出せたらと思います。
0760752
NGNG見にくくてすみません。
0761752
NGNGあと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です)
0763デフォルトの名無しさん
NGNG>ハッシュについては、ハッシュ構築時に、$hash{$key} = $value; とするのでなく、
push @{$hash{$key}}, $value;
としてやれば、foreach (@{$hash{$key}}) { ... } によって、同一キーを持つ全ての要素にアクセスできる。
オオボケかますようだけど、それはハッシュなの?
ちょっとだけ、配列かもっていう気がする。
ああいや、気がするだけで、きっと大きな勘違い…
(大日本 perl 初心者連名代表幹事)
0764デフォルトの名無しさん
NGNG自分もちょっと違和感を感じる。
0765デフォルトの名無しさん
NGNG>>747 が意図してるのは「配列への参照のハッシュ」だろう。
つまり、push @{$hash{$key}}, $value; というのを分解して書くと、
push @noname_array, $value;
$hash{$key} = \@noname_array; # ここがハッシュですよ奥さん
まあ、これとは別に >>774 に対して一つ指摘さしてもらうとすれば、
my %hash = { ... }; と、 my %hash = ( ... ); はびみょーに意味が違うってことだ。
前者は無名ハッシュができて、それへの参照を '{}' が返し、その参照への実体が
%hash にコピーされるので、結果は後者と同じだが、実行効率が悪い。
0767763
NGNGうーん、ていうことは、
push @{$hash{$key}}, $value;
というのは、まー、つまり、
push @hash_values, $value;
ということで、valuesの配列がハッシュの値に入ってる、ということか。
無名配列コンストラクタ [ ] の方は、頭に入りやすいんですけどね、
こっちは頭に入りにくいな。
(つーか、頭の容量の関係で、無名配列コンストラクタだけでいいです)
達人の道は遠い…
0768765
NGNGmy %hash = { ... }; で実体がコピーされる、というのは間違い。() と {} は明白に意味が違う。
あと、push @{$hash{$key}} = $value; の分解は、
my $ref_noname_array = (exists $hash{$key}) ? $hash{$key} : [];
push @{$ref_noname_array}, $value;
と書く方が適切だった。
・・・Perl は奥が深いっすついていけないっす(汗
0769765
NGNGmy %hash = { ... }; で実体がコピーされる、というのは間違い。() と {} は明白に意味が違う。
あと、push @{$hash{$key}} = $value; の分解は、
my $ref_noname_array = (exists $hash{$key}) ? $hash{$key} : [];
push @{$ref_noname_array}, $value;
が適切だった。>>765 の書き方だと、push のたびに配列自体が増えちゃうように取れる(汗
・・・Perl は奥が深いっすついていけないっす(滝汗
0770765
NGNGmy %hash = { ... }; で実体がコピーされる、というのは間違い。() と {} は明白に意味が違う。
あと、push @{$hash{$key}} = $value; の分解は、
my $ref_noname_array = (exists $hash{$key}) ? $hash{$key} : [];
push @{$ref_noname_array}, $value;
が適切だった。>>765 の書き方だと、push のたびに配列自体が増えちゃうように取れる(汗
・・・Perl は奥が深いっすついていけないっす(滝汗
0771765
NGNGmy %hash = { ... }; で実体がコピーされる、というのは間違い。() と {} は明白に意味が違う。
あと、push @{$hash{$key}} = $value; の分解は、
my $ref_noname_array = (exists $hash{$key}) ? $hash{$key} : [];
push @{$ref_noname_array}, $value;
が適切だった。>>765 の書き方だと、push のたびに配列自体が増えちゃうように取れる(汗
・・・Perl は奥が深いっすついていけないっす(滝汗
0772デフォルトの名無しさん
NGNG@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回目のループの出力がすべて空行に
なってしまうのでしょうか?
0773デフォルトの名無しさん
NGNGお前のプログラムがそのようになっているから。
eachはハッシュ全部読み終わったら次には空リスト
を返すが、%{$_}は全て要素が1つのハッシュだから
2回目のeachでは空リストが返る。
0774デフォルトの名無しさん
NGNGありがとうございました。
こんなことでずっと悩んでいました。
もっと精進します。
0775デフォルトの名無しさん
NGNG>>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 の反復履歴がリセットされるというのはデマらしい。(今しがた実験した。)
0776デフォルトの名無しさん
NGNGvaluesでリセットできるのですね。
勉強になります。
while (($key, $value) = each(%{$_})) {
print($key . "\n");
}
今回はハッシュのキーが複数になる可能性があるので
こんな感じで解決しました。
0777デフォルトの名無しさん
NGNG>あと、ハッシュにキーを追加すると
>each の反復履歴がリセットされるというのはデマらしい。(今しがた実験した。)
プログラミングperl第3版 p835 によれば、
反復子をリセットするには、ハッシュの要素をすべて読み込むか、
あるいは、keys %hash か values %hash を評価すればよい。
とあるよ。
要素の追加・削除に関しては、順番が保証されないとあるだけで、
反復子のリセット云々は記述がない。
0778デフォルトの名無しさん
NGNG要素の追加・削除に関しては、プログラミングperl第3版 p835 のもうちょっと下を読めば
『each 関数などによって繰り返しを行っている最中に、ハッシュに対して要素を追加したり削除したりした場合、その動作は保障されない』
とあるので、順番が保障されない以前に、each 反復子をあてにしてる状況では、要素の追加・削除はやっちゃいけないっぽい。
>>775 (関連して >>776)
each 反復子のリセットのためだけに values %hash や keys %hash を呼ぶのは時間効率・空間効率の点でどうか、と思わないでもない。
いや、each の実装次第だとは思うので断定はしないけど。(作成されたリストが内部的に保持され、有効活用されるのかも知れないし。)
一つのループ内でハッシュの全要素にアクセスするんなら、each なぞ使わずに
foreach (keys %hash) { ($key, $value) = ($_, $hash{$key}); ... }
とかでどう?
0779778
NGNGforeach (keys %hash) { ($key, $value) = ($_, $hash{$_}); ... }
です。
0780デフォルトの名無しさん
NGNG>一つのループ内でハッシュの全要素にアクセスするんなら、each なぞ使わずに
たださ、ハッシュの全要素にアクセスするのに、
while (($key, $value) = each(%hash)) {
処理;
}
を使うのは、もはや定型パターンだから。
クックブック第2版p194にも載っている。
なにも深いこと考えず、ぽんと当てはめればいいという利点があるよね。
(何事にもオライリーの権威に頼る会会長)
0781デフォルトの名無しさん
NGNGkeys,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.)
0782778
NGNGforeach (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)
0783デフォルトの名無しさん
NGNGプログラミングperl第3版p872にも似た記述があった。
反復子をリセットしたい場合には、keysを無効コンテキストで
呼べば、これ(ハッシュ全体のスキャン)を回避できる。
0784778
NGNGリセット手段があくまで keys や values の副作用扱いで、しかも void コンテキストがからむというのがマニアック。
ここらへんの話は FAQ になりそうですな・・・
にしても、私のような不注意者が、each で反復中にキー追加したらどうすんだ!ヽ(`Д´)ノ
Perl6 に期待(えー
0785デフォルトの名無しさん
NGNG(1) a だけさらに簡略化可能な余分な処理が入って
いることになぜ気づかないのか。
(2) 巨大配列生成に要する時間が要素数に対し不連
続要素があるかもしれないし、おそらくあるだ
ろうということになぜ気づかないのか。
0786デフォルトの名無しさん
NGNGサブルーチンaはもっとシンプルにできるでしょう。
それから、foreach keys 対 each 問題は、eachの反復呼び出しのoverheadと
keysが生成する配列のコストのコンペだったはず。
エントリ数がもっと少ない場合は、また違うんじゃないか?
0787778
NGNG>>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 秒)
0788778
NGNG項番. 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; が速い説に疑問符がつくね・・・?
検定必要?
0789デフォルトの名無しさん
NGNG0790778
NGNG>>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 秒
0792デフォルトの名無しさん
NGNGレス >>787 と >>788 って、>>782 とくらべて a が中途半端に最適化されただけで、特に目新しい情報がないよね。
まあ個人的に >>782 のソース基に追試してみて、a > c なことはよほどのことでもひっくり返りそうにないことがわかったからもういいよ。
0793デフォルトの名無しさん
NGNGperl勉強中の若輩者ですが、諸先輩方のお知恵を拝借したく書き込みます。
ただいま、perl解説本と睨めっこしながら、プログラムを解読してる最中
なのですが、膨大なコードを理解できる部分から逆チャート化し、構造と
内容を判読しています。環境はメモ帳でコード開き、ノートにテンプレートで
流れを書き込み「ああ、なるほど!」と図解で理解を深める低脳児であります。
そこで質問なのですが、
1.諸先輩方の開発環境はどんな構成なのでしょうか?
2.エディタなど活用されていらっしゃると思いますが、エディタ名などをご教授
いただけませんか?
3.長大なコードの全体像を掴むためにどのような工夫をなされておりますか?
諸先輩方は一目でコードを読破されておるとは思いますが
なにぶん、初学者な為、何事も一歩一歩 亀の如く理解してる次第であります。
0794デフォルトの名無しさん
NGNG>1.諸先輩方の開発環境はどんな構成なのでしょうか?
WindowsXP、ActivePerl
>2.エディタなど活用されていらっしゃると思いますが、エディタ名などをご教授
いただけませんか?
MIFES Ver6
>3.長大なコードの全体像を掴むためにどのような工夫をなされておりますか?
技術評論社の「すぐわかるPerl」でPerlの基礎を学び、
同じく技術評論社の「CGI&Perlポケットリファレンス」を片手に
ソースを解読してました。
0795デフォルトの名無しさん
NGNG1. MacOSX 10.3.7
2. Jedit4
3. コメント文を探す
0796デフォルトの名無しさん
NGNG1. FreeBSD
2. vi
3. 初学者の段階で長大なコードの全体像なんて掴めるわけがない
0797デフォルトの名無しさん
NGNG1.FreeBSD
2.vi(elvis),EmEditor
3.最初に大まかな処理の流れを読んでから適当にコメント入れていく
0798デフォルトの名無しさん
NGNG面白いな。うちのマシンでは、要素数が2000以下だとaがもっとも早くなる。
結論: あまりこだわるとパラノイアになってしまう。
×いいノウハウ
○無意味なノウハウ
0799デフォルトの名無しさん
NGNG1.FreeBSDでEmacs
2.Emacs
3.パッケージ名、サブルーチン名を検索しまくり。
> 諸先輩方は一目でコードを読破されておるとは思いますが
> なにぶん、初学者な為、何事も一歩一歩 亀の如く理解してる次第であります。
わたしは「Perlって何?」から自在になんでも書けるようになるのに
1週間くらいかかった。
大学の研究室のボスは、4時間でそこまで行った。
自分で書かないといかんと思うが。
デマンド/アルゴリズムからその記述法を導き出す方向を学ばないと。
0800デフォルトの名無しさん
NGNG1. WindowsXP + ActivePerl (+ Mingw or Cigwin)
2. VisualStudio.NET 2003 (つい習慣で。あとバイナリエディタ使いたさで。)
AzEdit V1.010228
3. まずは先頭から拾い読み後、>>795〜>>797 の併用。付け加えるとすれば、
(1) シンボルのネーミングにも注目する。変数一つとっても、名前から意味が想像できると解読が早い。
(2) 可能なら、モジュールを使った簡単なサンプルプログラムを書いて感じをつかむ。
(3) そのコードを好きになる。我を捨てる。
読んでる間は家族も愛人も自分のコーディングスタイルも忘れて夢中になる。
なお 3. については >>796 の言ってることが私の認識に一番近い気がする。
工夫は人それぞれの適性であって、まずスタイルありきではない。
0801デフォルトの名無しさん
NGNG2バイト文字のメタ文字を無効化する為に、
$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
です。
何が悪いのでしょうか?
0802デフォルトの名無しさん
NGNG切り貼りしたソースそのものに、全角スペースが入ってました
ではでは
0803800
NGNGそれはそうとして、プログラム読むのも書くのも半分科学じゃなくて訓練の世界だと思うのよね。
Perl だからこう、というノウハウなんてあるのか?
0804デフォルトの名無しさん
NGNG> Perl だからこう、というノウハウなんてあるのか?
Perlはたんとバッドノウハウがあるだろ。
$a と $b には警戒せよとか、
無理な拡張を繰り返して奇形化した言語だからね。
0805デフォルトの名無しさん
NGNGPerl は(知ってれば)簡単に書けるのだが読みにくい。
初心者が読む言語としては、獅子がわが子を谷底に突き落とす勢いがある鴨。
0806デフォルトの名無しさん
NGNGつーか、
一般の解説本には、誤った解説がごまんと載っていて、
オライリー本と照合すると、驚かされることが多い。
どうして、あんなに誤りが多いのか…
たぶん、perlの文法、ハナモゲラ説の原因は、
そんなところにもあると思われ。
ほんの一例を挙げれば、
正規表現の /sオプション (改行文字をマッチに含めるようにする)や
/mオプション (^ や $ のマッチの位置を変える)の説明さえ
間違っていたり(複数行マッチをする、とか)、
それどころか、 =~ さえ間違っていたりする
(マッチ対象を$_から変える。しかし、真偽を返す機能となっていたり)。
どうなっているのやら。
0807806
NGNG/sオプション (普段は改行文字にマッチしない . を、
改行文字をマッチに含めるようにする)や
0808デフォルトの名無しさん
NGNG> たぶん、perlの文法、ハナモゲラ説の原因は、
> そんなところにもあると思われ。
Perlの解説書が一つもなかったころから、
みんなPerlのめちゃくちゃさを愛してただよ。
集まると「めちゃくちゃだよな〜」
寄ると「でたらめだよな〜」
と言いあって笑ってたのさ。
0809デフォルトの名無しさん
NGNG2. emacs, meadow
3. 経験をつむ
エディタは、emacs以外は糞
0810デフォルトの名無しさん
NGNG諸先輩の知恵を拝見し先鞭たる愚かさに気がつく次第お恥ずかしい限りであります。
parl習得の目的は先のコードを解読し、力量及ぶなら自ずからコードを足したい所存。
目的まで早道として、先人のコードをお手本にするつもりでありました。反省
皆様の意見を心にし徒手空拳なれど、先人の遺産を頼らずに、稚拙ながら自作のコードを
練り上げます。その折、苦渋の末、解決策が見つからずお知恵を拝借しに参りますので
そのときは宜しくお願い致します。
1.先の質問に付随する疑問なのですが、プログラムの解読のイメージは
フローチャート化された発想が脳内に浮かぶのでしょうか?
それとも、日常会話の如く、判断材料として意識に吸収されるのでしょうか?
低脳なる私はコード→図的脳内イメージ変換しかできぬ愚直者なもですから...
0811デフォルトの名無しさん
NGNG> 目的まで早道として、先人のコードをお手本にするつもりでありました。反省
いや、ある程度読むことも必要だけど、ほどほどにして、自分で書くことも
やらないと。
「やりたいこと」 → 「具体的なコード」
という方向の学習もしないとと。
> 1.先の質問に付随する疑問なのですが、プログラムの解読のイメージは
> フローチャート化された発想が脳内に浮かぶのでしょうか?
フローチャートなんて忘れろ。
0812デフォルトの名無しさん
NGNG読みにくいから普通の日本語で書けよ。
感謝の気持ちとともにあらたまった言い方をしたいのなら、
単語は平易でもいいから謙譲語と尊敬語で通すように。
0813デフォルトの名無しさん
NGNG1.Linux(slackware)側で編集する場合はvi
最近はローカル(windows)で作成/編集してLinux側に転送
2.Linuxはvi
Windows側ではWz-Editor4.0Fを使用
3.バックアップファイルにコメント書き入れ+手元でメモ書き
0814デフォルトの名無しさん
NGNGまずは正しく perl と綴れる様になれ
0815806
NGNGまず、perl自体は仕様の通り正確に動くし、
言語のバグなどはまずないといえるけど、
言語の仕様自体を知るということが、オライリー本以外では
非常に難しいということ。
文法の誤った解説は、(一般解説本の)極めて広範囲に渡っているし、
それが故と思うが、文法ハナモゲラ説さえ言われている。
ハナモゲラは大間違いで、仕様は正確に実現されているけど、
一般解説本を指南書とすれば、ハナモゲラと思うのは無理もない。
それと、処理の結果とかがどんなときに $_ に入るかなどを
知らないと、コードから直接もとのアルゴリズムを知ることは
無理。(なんでも $_ に入るわけじゃなく、仕様として正確に決まっている)
結論として、信頼できる基本的テキストとクックブックなどを
組み合わせるしかないと思う。
0816デフォルトの名無しさん
NGNGLispじゃ考えられないのにねえ
0817デフォルトの名無しさん
NGNGあとPerl4時代の遺物が邪魔。use strictは徹底しろ。
0818デフォルトの名無しさん
NGNG0819デフォルトの名無しさん
NGNGとても力が入ったドキュメントがいっぱいだぞ。
0820デフォルトの名無しさん
NGNG0821デフォルトの名無しさん
NGNG0822デフォルトの名無しさん
NGNGだって、英語わからんし。
とはいえ、公開されてる和訳は役に立つことは立つ。
http://www.att.or.jp/perl/man/
とか。
ただ、これだけで理解できるかと言われれば、うーむ…
0823デフォルトの名無しさん
NGNG原文も見たほうがいいよ。まるっきりウソを書いてるという
経験はないけど、新しい奴だとより説明が明確になってたり、
書いてないことが追加されてたりとかはよくある。
0824デフォルトの名無しさん
NGNG辞書だけで語学を勉強するようなものな気がする。
普通は辞書を横に置きながら教科書をメインに読んで勉強するよね。
0825デフォルトの名無しさん
NGNGべつにそれだけで勉強しろとは言っとらん。
オライリーオライリーとそればっかなので
添付ドキュメントに注意を促しただけ。
それに、チュートリアルもいろいろ入ってるよ。
0826デフォルトの名無しさん
NGNGそれはその通りだがおまいはたぶんもっと辞書をみたほうがいい。
多くの辞書で初学者向けの手引きにページを割いてる。
0827デフォルトの名無しさん
NGNGと書いてから改めて見てみると、
チュートリアル、初心者向けイントロダクション、
クイックスタート、例示集などいろいろあるな。
faqはもちろん外せないし。
0828デフォルトの名無しさん
NGNG何より、CPANなどで手に入るモジュールを読むことがとても
勉強につながる(と思う)。
で、CPANのモジュールを読むきっかけとしては、Perlで何か動く
プログラムを作ることが大切かなぁ、、と。
>> 793
1. Linux か Windows
2. vi か メモ帳
3. 必要なところをすばやく見つけるのは技術。
自分でそれなりに長いコードを書いたりすれば身に付くのでは。
0829デフォルトの名無しさん
NGNG付属のドキュメントだけでやって挫折して、
誰かがオライリーの本ならいいよ、というのを聞いて、
なぜあれがオープンソースじゃないだと悪態をついている
のを何かで読んだよ。
なぜストールマンは挫折したのか?
1 頭が悪かった。 2 付属ドキュメントが悪かった。
正解 性格が悪かった…
0830デフォルトの名無しさん
NGNG0831デフォルトの名無しさん
NGNG0832デフォルトの名無しさん
NGNG100までの3で割り切れる数とかなら、こんなとこかな。
@result = grep !($_ % 3) ,(1..100);
print "@result\n";
0833デフォルトの名無しさん
NGNG> 3で割り切れる数値の表示の仕方を教えてください
my $i = 0;
while (1) {
print $i++ * 3 . "\n";
}
# 終わらない。
え、ちがう?
0834デフォルトの名無しさん
NGNG0835デフォルトの名無しさん
NGNGhttp://www.perl.com/pub/a/2001/01/begperl6.html
> Pragmas are instructions to the Perl interpreter to do something special when it runs your program.
0836
NGNG0838835
NGNG使用のように厳しいコマンドは pragmaと呼ばれます。
Pragmasはあなたのプログラムを動かすとき特別な何かをする
Perlインタプリタへの指示です。
使用厳しい、悪いソフトウェアを書くのをより困難にする2つのことをします:
それで、あなたはすべての変数(「厳しいvars」)を宣言します、そして、
あなたが潜水艦(「厳しい潜水艦」)を使用しているときPerlがあなたの
意志を間違うのをより困難にします。
プログラムで1か2つのタイプの厳しさを使用するだけでありたいなら、
あなたが 使用厳しいpragmaに彼らを記載することができますか、またはあなたは、
あなたが、より早く可能にした厳しさのいずれかすべてをオフにするのに特別な
ノー厳しいpragmaを使用することができます。
0840デフォルトの名無しさん
NGNG> Windowsにてテキストファイルとバイナリファイルを判別する方法ってありますか?
それは主として「テキストファイル」をどう定義するかによるな。
とりあえずfile typeをチェックするモジュールにはFile::MMagicがあったりする。
0841836
NGNGさんくすこ
ここで言うバイナリファイルはACSII文字以外のコード(文字?)が入っているファイルを指します
しかし、使い方というか返り値がよくわからん・・・
0842デフォルトの名無しさん
NGNG日本語はどうする
0843デフォルトの名無しさん
NGNGワロタ
……疲れてんのかな俺
0844デフォルトの名無しさん
NGNG微妙に気になったんだが、Windows上のPerlにて だよな?
0845デフォルトの名無しさん
NGNG0846デフォルトの名無しさん
NGNG0847デフォルトの名無しさん
NGNG0848デフォルトの名無しさん
NGNGそういうシンプルなので良いのなら、昔から、ある程度先まで読んで、
最上位ビットが立っているバイトがあったらバイナリと看做すとか
いうアドホックかつ確率的な方法が用いられていたが……
0849デフォルトの名無しさん
NGNG0850デフォルトの名無しさん
NGNG20% の非 ASCII があったらバイナリと判定する、なんて記述を見たような...
0851デフォルトの名無しさん
NGNGで出来るよ 精度悪いけど
0852デフォルトの名無しさん
NGNG処理系のソースを読んでから本を書くなんて
Perlじゃ考えられないねえ
というのは冗談だが、内容が内容なだけに Perl 処理系のレキシカルアナライザ( 相 当 部分)を読む者は摂食障害を起こすらしいYO。(by O'LEILLY 本 第3版)
ところで、出遅れた話題で恐縮なんですが、Eclipse (epic) の名前が出てこないけどあれは糞なんどうなん?
もっとも漏れは(改行問題には目をつぶるとして)SJIS でコメントや自分用 pod を書ければいいのであって別に Visual Studio + コマンドプロンプトのままでもいいんだけど。
0853デフォルトの名無しさん
NGNGプログラミングperl第3版p115によれば、
ファイルテスト演算子の -B や -T は、ファイルの最初の約1ブロック分の
データを調べて、コントロールコードや最上位ビットが立っている文字
(UTF-8に見えないもの)を捜し、そのような文字が3分の1よりも
多ければバイナリ、そうでなければ、テキストファイルと判定するということだ。
あと、最初のブロックの中に、ASCIIのNULL文字(\0)が含まれている
ものは、バイナリファイルと判定する。
ほかにも判定基準があるようだが、このへんでいいだろ。
0854デフォルトの名無しさん
NGNGEclipseってよく知らんけどさ、
RADツールとかIDEとかは懲りて、止めにしたという人も多いと思うよ。
結局、開発元が開発やめたら、そのコードはどうにも
ならなくなるんだよな。
EclipseのライバルだったとおぼしきvisualCafeとか、
この世から消えてなくなったよねぇ。
Beansとかだって、最近はどうなんだい?
天下のSunがやってるにしては、名前も聞かない。
Eclipseはいつまで持つんだろう?
マイクロソフトだったら大丈夫というもの、それだって、
怪しいもんだ。VisualBasicやってた人たちも .NETになって、
ずいぶん肩身がせまくなって困ってるみたいだし。
IDEとかRADで一番困るのは、言語は同じはずなのに、
ほかのツールで作られたものと組み合わせられない。
エディタだけで書けるのが、一番だよ。
0855デフォルトの名無しさん
NGNG0856デフォルトの名無しさん
NGNGしかし、『RADツールとかIDEとかは懲りて、止めにしたという人も多い』から
『開発元が開発やめ』るんだとしたら再帰的で巣わ(笑)
IDE 相乗的にだめぽ。
0857853
NGNGhttp://perldoc.jp/docs/modules/File-MMagic-1.21/MMagic.pod
ファイルテスト演算子とは、機能的にどうなんだろうかね。
使ってみれば分かるんだが、もう眠いし…。
0858853
NGNGより引用。
Q. バイナリファイルの判定
たとえば、ASCIIコードと改行などわずかなコントロールコードだけで構成される
ファイルの場合、プレーン・テキストだと類推できます。
また、ほとんどのバイナリファイルには特徴的なコードが埋め込まれているので、
そこからどんなタイプのファイルなのかを知ることができます。たとえば、
「%PDF-1.3」で始まる文字列が書き込まれていれば、Acrobatで読むことのできる
PDFファイルであることがわかりますし、先頭に「#!/bin/sh」とあれば
シェルスクリプトです。
バイナリの実行ファイルなども同様で、OSなど実行環境に特有のコードパターンが
書き込まれています。このパターンを「マジック」あるいは「マジックナンバー」と
呼びます。UNIXの file (1) コマンドは、「ファイルシステム>マジック>言語」の
順でチェックを行い、ファイルの種類を判別しています。
マジックにはたくさんの種類がありますので、ぜんぶ自分で調べてプログラムを
つくっていては骨が折れますから、file(1)でも参照しているマジックナンバーの
リスト(/usr/share/magicなど)を利用するとよいかもしれません。
0859853
NGNG●簡単な方法はない。文字コードを調べていく
その前に「何がテキストで、何がバイナリか」という問題があります。
ASCIIテキストファイルだけなら話は簡単なのですが(それぞれのバイトが表示可能か
どうかisprint()関数で調べていけばよい)、日本語など、一文字に複数バイトを使う
言語のテキストファイルだと難しくなってきます。とくに日本語は文字コード
(表現方式)が複数あるため、違う文字コードを想定すると読むことができません。
また「ちょっとだけデータが壊れているテキストファイルをどう扱うか」という問題
もあります。
結論を言うと、簡単な方法はないと思います。あらかじめ文字コードを想定し
(JIS、シフトJIS、EUC、Unicodeなど)、その方式に合致しているかいちいち判別しな
ければならないようです。文字コードの構造、判別方法は煩雑すぎるのでここでは
説明できません。参考資料などを見てください。
もう寝る。それじゃ。
0860デフォルトの名無しさん
NGNG相対的にIDE使ってるやつらが眩しく見えるのだが…
0861デフォルトの名無しさん
NGNGmy @visible_chrs = split(//,
"\t\n\r"
. ' ,!"#$%&\'()*+,-./'
. '0123456789:;<=>?'
. '@ABCDEFGHIJKLMNO'
. 'PQRSTUVWXYZ[\\]^_'
. 'abcdefghijklmno'
. 'pqrstuvwxyz{|}~'
);
my %isprint = ();
foreach (@visible_chrs) {
$isprint{$_} = 1;
}
で、$isprint('x') とかして使う予定は未定。
0862デフォルトの名無しさん
NGNG> エディタしか使えない漏れには
> 相対的にIDE使ってるやつらが眩しく見えるのだが…
そういう時は、IDEを使ってみるといいです!!
わたしゃ、IDEは、自転車の補助輪のようなもんという認識だが。
0863デフォルトの名無しさん
NGNG0864853
NGNG違〜う!
そりゃ、CマガジンのQアンドAのページからの引用だって。
アルゴリズムの部分が参考になると思って、
引っ張ってきただけだってば。
>>857 のFile::MMagicの解説
http://perldoc.jp/docs/modules/File-MMagic-1.21/MMagic.pod
だけど、そこにマジックナンバーってあるでしょ。
>>858 の引用でそれがなんのことか分かったじゃん。
頼む、寝かしてくれ…
0865デフォルトの名無しさん
NGNGただ読んでるうちに、Perl に標準で <ctype> 系関数が付いないと知ったときの困惑と怒りを思い出したまでだ。
0866デフォルトの名無しさん
NGNGEclipseは perl でも利用できるんだから、
ぜひ人柱として挑戦して、レポートしてほしかったりしますが。
0867デフォルトの名無しさん
NGNGPerl は救わない。
なぜなら、全 Pealer が手にしたオライリー本が地上の山や川や木を(ry
0868デフォルトの名無しさん
NGNG0869デフォルトの名無しさん
NGNG0870デフォルトの名無しさん
NGNG0871デフォルトの名無しさん
NGNGPERL.EXE ファイルは
欠陥エクスポート NTDLL.DLL:atoi にリンクされています。
と出て、使えないんですけど、どうすれば使えるようになるでしょうか。
0872デフォルトの名無しさん
NGNGいつもWindows機上で作成して、Linux機上で動作するperlスクリプトを書いているんですが。
0873デフォルトの名無しさん
NGNG最初っからLinux機上でスクリプト書けば良いじゃん?
0874デフォルトの名無しさん
NGNG様々な制約から作業環境はwindowsという点は変更できないのです。
0875デフォルトの名無しさん
NGNGIDEを使うことによって、
なにが出来るようになることを期待してるか、を
はっきりさせないと。
どういうことを期待してるのかなぁ。
単にOSの壁を乗り越えるということならば、
perlはそんなもの必要としてないし。
それと、IDEはコードの製作方法を押し付けてくるからね。
まず、作ろうとするコードがデザインパターンのなにに
あたるかとか、そういうところから始まって、
フィールドは何? メソッドは何? とかね。
それで、RAD機能を売り物にするツールなら、
裏でコードを自動生成してくれるけど、
良し悪しいろいろだから…。ありがたがるか、うんざりするか。
Cプラプラとか、Javaならなけりゃやってられないだろうけど、
perlでIDEはどうだろうかねぇ。
0876デフォルトの名無しさん
NGNG>>484
デフォルトでは Latin 1 だけど、use encoding で文字コードを
指定すると、そのコードになるようだ。
perluniintro の Legacy Encodings を読んでて気づいた。
0877872=874
NGNGOSの壁に関してはおっしゃる通り期待しておりません。
何を期待しているか?と問われると、現状特に不満がないので何も期待していません。
ならいいじゃん?って言われるとごもっともなのですが、
私の想像外で、実際に使って思いがけなく「こんな所が楽になる」というお話が聞ければ…
と、思い質問した次第です。
と、ここまで書いて「一度使ってみれば?」と、自分にレスしたくなりました orz
0878デフォルトの名無しさん
NGNG解説をお願いできませんでしょうか?
バイナリデータというのもよく分かりません。
0879デフォルトの名無しさん
NGNG普通、正規表現の [:print:] とか使わない?
0880デフォルトの名無しさん
NGNGどの辺が解らない?
ttp://www.rfs.jp/sitebuilder/perl/05/func/pack.html
ttp://flex.ee.uec.ac.jp/texi/perl/perl_34.html
ttp://mikeneko.creator.club.ne.jp/~lab/perl/numerical_transform/
ttp://www5a.biglobe.ne.jp/~fnao/cgi_nao/pack.htm
まずはこの辺読んでみて何が解らない?
0881デフォルトの名無しさん
NGNGそのページどうやってみつけた?
0882デフォルトの名無しさん
NGNGhttp://www.google.com/search?hl=ja&lr=lang_ja&ie=sjis&q=pack%8A%D6%90%94
0884878
NGNGありがとうございます。読ませていただきました。
読んでいて使い方は少しずつ分かってきたのですが、
「バイナリ構造体にパックする」というのが
何のことなのかさっぱり分かりませんでした。
0885デフォルトの名無しさん
NGNG基本的には、なにかとデータをやり取りするときに、
データの型とサイズを保証するために使うんだと思うよ。
たとえば、データベース(DBMとかRDB)とやり取りするとき、
データがある型にはまってないと、えらいことになるわけ。
1レコードに入っているのが55バイトで、それは、
最初の何バイトが文字型で、それから何バイトが数値型で、とか。
それが狂うと、めちゃくちゃになっちゃう。
だから、データを登録するとき、packを使って、
サイズとか型を保証するの。
データを出すときも、(packを使って登録したんだから)、
unpackすれば、正しく取り出せるという寸法だよ。
0886デフォルトの名無しさん
NGNGパックするリスト値の型を、型指定通りに解釈するとバイナリ構造体になりますよ
って程度に覚えれば十分。
0887デフォルトの名無しさん
NGNGmy @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*' 以外を使って、バイトサイズ以外のパックもできる。
0888デフォルトの名無しさん
NGNG{
数行
}
{
数行
}
という書き方をすることのメリットを、
0889デフォルトの名無しさん
NGNG0890デフォルトの名無しさん
NGNG裸のブロック( naked block)のことかね。
それは、そこだけ有効なローカル変数が使えるということ
なんじゃない?
それと、裸のブロックは制御構造も提供する。
たとえば、lastで抜けることが出来る。
0891デフォルトの名無しさん
NGNGmy @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" として表示される。(後を濁さない)
同様のテクは $[ なんかでも使うね。漏れは。
0892デフォルトの名無しさん
NGNGえ、そうなん!?
確かめなくちゃ。
0893デフォルトの名無しさん
NGNGバイナリ構造体にパックすると言われてもバイナリ構造体が何かも分からんし、パックするとは何をすることかも分からんかった
まぁパックした(とおぼしき)データをファイルに書き出して、バイナリエディタで覗いたりして何とか理解できたなぁ
>>884
やってみそ
とりあえず型指定子のHが理解できれば他も似たようなもんだ
0894デフォルトの名無しさん
NGNG#! /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 になるのが確認できる。
0895デフォルトの名無しさん
NGNGuse utf8;
my @file = <>;
foreach (@file) {
my $hex_line = unpack('H*', $_);
print "$hex_line\n";
}
0897884
NGNGpack関数でつまづいたのが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」について知りたいです。
よろしくお願いいたします。
0898デフォルトの名無しさん
NGNGこれはサイトが間違ってると思われ
0899デフォルトの名無しさん
NGNG分解して考えませう。まず (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' は単に無視される。サイトがまちがってるにしても、結果は'ミケネコ'。
あとは自力でがんばれ。超がんばれ。
0900899
NGNG> 正確には本来、数値のリストを返すんだが、
この部分間違い。pack が返すのはスカラーですじゃ(unpack と混同した)。
「数値のリスト」は「バイト列」に読み替えてちょ。
0901デフォルトの名無しさん
NGNGこれは感覚的にわかるけど、正しい言い方はどうなん?
この伝でいくと、1234 という十進数の unpacked BCD 結果である 0x1234 を指して、
「ニブルサイズに pack した十進数」と言えてしまうわけだが。
0902デフォルトの名無しさん
NGNGなにをどうしたいのか、よく分かんないけど、
packはともかく、もしurlエンコードをしたいというなら、
それ用のモジュールを使うことで解決かと。
車輪の再発明をしても仕方ないし。
HとかCとかいったってさ、単に16進文字列と
char型(1バイト長符合なし整数)というだけなんじゃ?
H2なら、それが2バイトとちゃうん?
C言語の型に直してるというだけだよね???
(C言語、よく分かってない奴だから、怪しさ100%!)
0903デフォルトの名無しさん
NGNG> 一般のエディタでVSのIntellisenceが使えたらいいなぁ
Emacsの上に高度開発環境を実現するパッケージで、Intellisenseも入れているのが
あるな。
0904デフォルトの名無しさん
NGNGエディタの普通の入力補完じゃダメなの?
たとえば、サクラエディタでは、
設定メニューのタイプ別設定から、支援タプを選ぶと、
入力補完用のファイルを選べるんだが、ここで、
サクラエディタのファルダの中からperlのキーワードの
ファイルを選んで設定しておくと、
最初の1文字か2文字で該当するperlのコマンドの一覧が
出てくるよ(コントロールキーとスペースキーを押すとね)。
w を推すと、while とか 頭に w の付くコマンドが出てくる。
(warn wait wantarray とか、数えたら全部で6個だった)
普通のエディタのこういう機能で十分じゃないの?
それ以上の機能のことを言ってるの???
0905デフォルトの名無しさん
NGNGだれにたいして言っているの?
0906デフォルトの名無しさん
NGNG> > 一般のエディタでVSのIntellisenceが使えたらいいなぁ
>
> Emacsの上に高度開発環境を実現するパッケージで、Intellisenseも入れているのが
> あるな。
と思ったら、Perlはサポートしてないな(まだ?)
CEDET - Collection of Emacs Development Emvironment Tools
http://cedet.sourceforge.net/semantic.shtml
のことだが。
他にもあるかな?
0907デフォルトの名無しさん
NGNG> エディタの普通の入力補完じゃダメなの?
しらん。
> 最初の1文字か2文字で該当するperlのコマンドの一覧が
> 出てくるよ(コントロールキーとスペースキーを押すとね)。
> w を推すと、while とか 頭に w の付くコマンドが出てくる。
Emacsのperl-modeはもっと毛むくじゃらなこともできる。
みんな最初は「すげ〜、すげ〜」と驚嘆するが、やがて
オフにする。
0908デフォルトの名無しさん
NGNG> Emacsのperl-modeはもっと毛むくじゃらなこともできる。
> みんな最初は「すげ〜、すげ〜」と驚嘆するが、
どうやるの、おせーて。
0909デフォルトの名無しさん
NGNG> > エディタの普通の入力補完じゃダメなの?
>
> しらん。
( ゚д゚).....baka?
0910デフォルトの名無しさん
NGNG質問だぜ
wantarrayみたいなコトをやりたいんだけど、
関数の呼び出し元が「ハッシュ」で求めてるか「配列変数」で求めてるかを
関数側で認知したいんだけどどうしたらいいんだい?ベイビー
0911897
NGNG>>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進数についてはほとんどよく分からないので何か間違っているかもしれません)
0912デフォルトの名無しさん
NGNGいいセンいってますなあ。置換演算子 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。
0914デフォルトの名無しさん
NGNGCPANのWant.pm
コンパイルが必要だが。
0915デフォルトの名無しさん
NGNGサブルーチン 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 と表示される。
0916デフォルトの名無しさん
NGNG最近 Time::Local の timelocal がエラーを出すようになり、
どうもその原因が localtime の引数に負の値を入れると undef になることのようなのです。
(undef の変数で計算しようとするため Use of uninitialized value in ... と言われる。)
print(localtime(-1)); をテストすると、linux や solaris では
595981070400 が表示されるようですが、Windows では何も表示されません。
しかし最近までは Time::Local でエラーは出ていなかったので、
この現象はなかったと思うのですが、他にW2Kで同様のエラーが出る方はいますでしょうか?
最近の変化といえばWindows Updateが幾つかあったことくらいですが、
それがlocaltimeに影響を及ぼすということがあるんでしょうか…?
0917デフォルトの名無しさん
NGNGperl を 5.8.6-2 に入れ替えたら、windows98でも使えるようになりました。
0918デフォルトの名無しさん
NGNG0919デフォルトの名無しさん
NGNG横からだけど、ちょいと思ったことを。
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の分かる人は、すぐ分かるんだと思うな。
0920デフォルトの名無しさん
NGNG上位下位というよりもオーダーだろ
Hは上位下位の順、hは下位上位の順
だからH2とすれば上位4bit、下位4bitの順で16進値が出てくる、と
pack("H*", "837E8350836C8352")
こういうことが出来るし
0921デフォルトの名無しさん
NGNG>だからH2とすれば上位4bit、下位4bitの順で16進値が出てくる、と
これじゃunpackだorz
16進値を上位4bit、下位4bitの順で割り当てる、と読み替えてください・・・
0922910
NGNG今回は諦めることにしたぜ。
0923919
NGNG日本語は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文字扱えるということになるね。
ややこしいね。失礼、一人相撲だね。
あら、レスくれてた方がいた。つき合わせて、ごめん。
0924デフォルトの名無しさん
NGNG/ ̄ ̄ ̄`ヽ、
/ ヽ
/ / \ │
| (彡) ( ミ)||| |
\ | // ̄⌒ ̄ヽヽ |
ハァー | | .l~ ̄~ヽ | |
/ | ヽ  ̄~ ̄ ノ |
|  ̄ ̄∪ |
0925デフォルトの名無しさん
NGNG0926デフォルトの名無しさん
NGNGラクダ本「バイナリと16進数のパックでは、countは、生成されるバイト数ではなく、ビットやニブルの個数を表す。」
(゚д゚)
0927デフォルトの名無しさん
NGNG0928デフォルトの名無しさん
NGNG覚えとけばあんたらの処理には問題ないんじゃないのか?
0929911
NGNGあともう少しで分かってきそうです。
>>912の1は分かります。2、3もほとんど分かりました。
でも4のところが分かりません。
"\x83P"と"\x83\x50"をprintで見てみたところ、どちらも「ケ」になりましたが
前者("\x83P")が何故そうなるのかがよく分かりませんでした。
これは最初のpack関数の話からそれているかもしれませんが、
よろしければ解説をお願いいたします。
0930デフォルトの名無しさん
NGNGhttp://e-words.jp/p/r-ascii.html
Pの16進のところ見ろ
0931デフォルトの名無しさん
NGNG何を?
0932929
NGNGPの16進コードが0x50なのは分かるのですが、
print "\x83P";
では、pack関数みたいなものも使っていないのに、
どういう処理で「P」→「\x50」と変換されるのかが分かりません。
print "P";
だと普通に「P」だけが表示されるのに。
print文は、前の文字が16進数だと後の文字も16進数に変換する…とかでしょうか?
0933デフォルトの名無しさん
NGNGまずマルチバイト文字がどういうものかわかってないようだね
この場合、文字コードはShift JISなわけだけれど、その構造が、
1バイト目が81〜9F、E0〜FCなら次のもう一バイトとあわせてひとつの文字になる。
で、「ケ」という文字は83 50なわけだけれど、ここから83をとってやると50が残る。
50は単体出てくるとPという文字になる。
逆に、Pの前に83を取り付けてやると、ケになる
それとPと\x50が等価というのもわかっているか怪しい文面だな・・・
Perlは文字列リテラル中に\xHHがあると、それを1バイトの文字に展開する。
だから"P"と"\x50"は同じもの
0934デフォルトの名無しさん
NGNG何を言ってるのかさっぱりわからん。かっこいいなおめーら
0935デフォルトの名無しさん
NGNGいかんせん >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.は不可能」とか言う人、います?
0936デフォルトの名無しさん
NGNG>3.
は実際に Want.pm を試して確認したんだろうな?
0937935
NGNG確認した。疑う気持ちはわかるんだが(漏れも信じられんので)、@{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 は、多分コンパイル済み中間コード?かな?(まさかネイティブコードでないよね・・・)
0938デフォルトの名無しさん
NGNGこれだよね?
誰か、解析、よろしく。
http://search.cpan.org/src/ROBIN/Want-0.08/Want.pm
0939デフォルトの名無しさん
NGNG>Want.dll は、多分コンパイル済み中間コード?かな?(まさかネイティブコードでないよね・・・)
そのまさかでそ。Want.cなんてものついてるし
0940デフォルトの名無しさん
NGNGhttp://perldoc.com/perl5.8.4/pod/perl.html#Internals-and-C-Language-Interface
0941デフォルトの名無しさん
NGNGやれやれ、呼ばれているサブルーチンから、
呼び出し先の型を見分けるのか。
perl の中には内部的な型がいろいろあるわけだけどさ、
それは基本的に、ref関数で返されるよね。
SCALAR
ARRAY
HASH
CODE
GLOB
REF
LVALUE
IO::Handle
ところが、perlにおけるすべての値は、SV(スカラー値のこと)から
派生したクラスのメンバーとして扱われる。
すべての値は、実はC言語の SV*ポインタ ということらしい。
うーむ、ややこしい。
ただ、ref で見分ければ十分じゃないのかなぁ。
0942935
NGNGほーこれが噂の 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 においてカナーリご不満だったご様子だ。
0943941
NGNGおっと、まだまだ実は内部的な型があるんだね。
IV (内部的整数型)と NV (内部的な浮動小数点数型)とか。
SV (内部のスカラー型)がすべての型の親クラスらしいが、
AV(内部の配列型) CV(内部のサブルーチン型)
GV(内部のグロブ型) HV (内部のハッシュ型)
IV (上で書いた通り)NV (上で書いた通り)
PV (内部的ポインタ値)RV (リファレンス型)
これらはみんな、C言語でtypedefされた型らしい。
ふーん。型がないように見えるperlも
本当はこれだけ型があるわけか…
0944941
NGNGにはもっと詳しく書いてあった。
そこには、I32 とか I16 とか、
UV U32 U16 とかもある。
いずれの型も p@erlgutsドキュメントに記載されている
Cの関数によって操作することができると書いてあるよ。
そして、
perl を拡張するには、C関数との結合部を作るために、
これらの型について知らねばならないとあるな。
Cとの結合のためには、XS と XSUB かい。
ああ、その前にC言語…。ふー。
0945デフォルトの名無しさん
NGNG0946デフォルトの名無しさん
NGNG面白いのがお望みなら、
rubyスレにいけよ。
もう、大笑いできるぞ。
俺は、JavaでUMLとかは飽き飽きしたので、
オブジェクト指向はしばらくはいいけど。
しかし、Cはちょっとおもしろそうだな。
0947デフォルトの名無しさん
NGNG確かに ruby スレは大笑いできる傾向にある。
やはり、ruby には perl ほどのトラップがないから、ヒマをもてあますあまり
ネタに走ったり布教活動始めたりするからだろうね。
0948デフォルトの名無しさん
NGNGというスレでも作って、初心者が、みんな知ってることを
自慢気に開陳しても嘲笑されたりうるさがられたり
しないようにするという解決法を提案します。
0950デフォルトの名無しさん
NGNGEffective Perlを買ってきたが、なんじゃこの訳?
ともかく文のリズムが悪くて読みづらいのはがまんするとして、どうにも
意味が取りづらい文が大杉(原書は読んでないが、たぶんオリジナルは
普通にわかりやすい文だと思う)。おそらく自分でも意味が分からずに
訳しているのだろう。どっかの大学の英文科に安い翻訳料でやらせたのモロばれw
まぁコンピュータ関連の翻訳の程度なんて元からひどいのがおおいが、
オライリの近藤嘉雪氏の訳がこなれているだけに、つい比較してしまう。
まず「序言」読んだ瞬間に、翻訳者の程度の低さがわかってしまう。
ここに出てくる「英語(English)」は、こういう文脈の場合「国語と訳せ」
というのは翻訳のごく初歩。完全に素人。ひさしぶりに糞翻訳読んで腹がたった
0951デフォルトの名無しさん
NGNG飯食ってた私は思ふ……
だってね〜
翻訳会社に行って6人くらいで黙々とUNIXの本の翻訳を校正してるわけよ(大声)!!
それで、他の人がUNIX用語の日本語訳の慣習を無視した訳語に修正しているから、
なんだと思ったら、私以外、「UNIXって何?」っていう連中だったのよ(絶叫)!!
0952932
NGNGマルチバイト文字は調べて大体分かってきたんですけど、
後半のところがよく分かりません。
>Perlは文字列リテラル中に\xHHがあると、それを1バイトの文字に展開する。
のところで、"\x50"→"P"となるのは分かるのですが、
何故"P"→"\x50"となるのでしょうか?
あとあまり関係ないかもしれませんが、
print "\x83P";
では「ケ」になりますが
print "\x83PPP";
では「ケPP」になりました。
0953デフォルトの名無しさん
NGNGPと書いたファイルを、バイナリで見てみると 50 になっている。
一方向の問題ではなく、等しいのですよ。 P = \x50
そもそも、キャラクタなんていうものは人が理解するために割り当てている物。
普段使うテキストファイルだって、実際には内部では0と1の集まり。
Pと書いたファイルは、プログラムでは\x50と認識しているだけ。
後半の所は、P = \x50を理解した後に試すと解るが、
83 50 50 50 というバイナリのファイルをエディタで見る、若しくはケPPPというファイルをバイナリで見れ。
0954941
NGNG楽勝でわかるんだろ。え?!(まあ、俺でもなんとなく分かるけどな)
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*);
0955941
NGNGwant.pmの謎を説く基礎になるんじゃないか、
ということだからな。
初心者なんで、優しく頼むぞ。ボケ
0956941
NGNG早くしろ。ボケ
0957デフォルトの名無しさん
NGNGまずテキストデータをバイナリデータとして見ることもできる。
\x83 \x50 というデータをそのまま扱ってもいいし、
SJISで頭から「ケ」と読んでもいいし、
前半だけ\x83のままで置いといて\x50が「たまたま」「P」に対応してるから置換えてもいい。
例えば2chでメル欄に「sage」と入れると上がらないだろ。
メル欄に「sage」(=\x73 \x61 \x67 \x65)があるかどうかを探してるわけだ。
そして「都age」をバイナリデータで表すと「\x93\x73 \x61 \x67 \x65」。
\x73\x61\x67\x65が入ってるので上がらない。
0958デフォルトの名無しさん
NGNG0959デフォルトの名無しさん
NGNG0960デフォルトの名無しさん
NGNG0961デフォルトの名無しさん
NGNG0962デフォルトの名無しさん
NGNGPerlを使っている人はあまりGUIを作りたいとは思わない(そういう用途には使わない)のでしょうか?
wxPythonというものの存在を知ってちょっと検索してみたのですが、
wxPerlというものもあるけど、あまり盛り上がってないというか、日本語でその話をしている所がほとんどなさそうです。
どうしてでしょうか。
0963デフォルトの名無しさん
NGNG0964デフォルトの名無しさん
NGNG厨な質問にお答えいただきありがとうございました。
0965デフォルトの名無しさん
NGNGそれは、知らん。
オライリーから本でてるし、情報得やすいことは確かだろうが。
0966デフォルトの名無しさん
NGNGJavaとの比較しか分からんけど、
イベントとかの扱いは、問題にならないほど簡単みたいだったよ。
(だった、というのは、ちょっと試しただけだからだけど。
JavaはRADの支援がないと、とてもやってられないと思う)
ただ、日本語もいちおう扱えるみたいだけど、
まだまだ問題があるみたい。
0967デフォルトの名無しさん
NGNGperlで、LWP::UserAgentモジュールを使って特許庁のHP
http://www2.ipdl.ncipi.go.jp/begin/be_search.cgi?STYLE=login&sTime=
から、特許の検索を自動化しようとして、次のコードを書いてみたんですが
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
my $url = 'http://www2.ipdl.ncipi.go.jp/begin/be_search.cgi';
$times = time();
$times = $times . '000';
my %formdata = (STYLE => 'search', S_WORD1 => '画像処理', R_TYPE1 => '02', BE_SEARCH => '検索実行', sTime => $times);
my $req = POST($url, [%formdata]);
$ua = LWP::UserAgent->new;
$ua->agent("Mozilla/8.0");
$res = $ua->request($req);
print $res->content;
本来なら50012件ぐらい、ヒットするはずが
「初心者向け検索」というタイトルの真っ白なエラーページに
飛ばされてしまいます。フォームデーターは完璧だと、思うのですが
もし解析できるかた、解決できる方いらっしゃったらhelp!
0968デフォルトの名無しさん
NGNGPOPfileとか、あれどのように実現してるんでしょうか?自前で組んでるんですか?
0969デフォルトの名無しさん
NGNGuse 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
の例文に習ってこんな感じでいーんじゃないの?
0970デフォルトの名無しさん
NGNGあらやだ、
my $url = 'http://www2.ipdl.ncipi.go.jp/begin/be_search.cgi';
が抜けてたorz
ちなみに漏れの名前で検索したら出てきたyo. orz
0971デフォルトの名無しさん
NGNGうーん...だめみたい。
他に誰か特許庁のHPから特許検索を自動化したことある人いないかな…?
0972デフォルトの名無しさん
NGNGuse 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から
検索したときのように結果が返ってこないんです。うーん……
0973デフォルトの名無しさん
NGNGまずまともに検索できるブラウザでどういうやりとりを
してるか調べて、それをなるべく忠実に再現するのが
一番じゃないかな。
ありがちなのは
(1) refererをチェックしている
(2) agentをチェックしている
(3) クッキー食わないとだめ
あたりか。
0974971
NGNGrefererの設定の仕方を調べてみます。
それでもダメなら
etherealを使って調べてみようと考えました。
もしだれか、「perlから検索通ったぞ!」って方、いたらば
こうやりなっせ、とレスください。
yahooとかgoogleとかだったらフォームをpostできるのに...
特許庁のバカーン 俺の技術の無さバカバカーン 。・゚・(ノД`)・゚・。
0975デフォルトの名無しさん
NGNGhttp://www2.ipdl.ncipi.go.jp/begin/be_search.cgi?STYLE=login&sTime=
ブラウザー(mozilla)からを開いて、食べたクッキーを全部消してreloadし、
検索実行したら、
「クッキーないよ!」というエラーメッセがでました!!
これが原因かも... 微妙にperlからpostしたときとエラーメッセージが異なりはしますが...
(「サーバーが混雑してます」のようなメッセージが出ます。)
レスありがとうございました。
0976デフォルトの名無しさん
NGNGhttp://search.cpan.org/~gaas/libwww-perl-5.803/lib/HTTP/Daemon.pm
http://sourceforge.net/project/showfiles.php?group_id=63137&package_id=59947
0977952
NGNGP = \x50 というのは理解できたつもりなのですが、
何故「\x83P」とすると「\x83」と合体して1つの文字になるのかが分かりませんでした。
それで父に聞いてみたんですが…(すみません(汗))
(Shift JISの)「83」というのが2バイト用のコードなので
その次の1バイトも足されて1文字になる、みたいなことを言ってました。
2バイト用のコードというものの具体的な範囲はちょっと分かりませんが、
その範囲内の値であれば同じような動作をするということみたいですね。
…父はPerlは知らないので、もしも何か間違っていればまたご指摘下さい。
この度は色々とありがとうございました。
0978デフォルトの名無しさん
NGNG次のリクエストで通ったよ。というわけで、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 ぐらいは入れたほうが良いかも。)
0979デフォルトの名無しさん
NGNG0980デフォルトの名無しさん
NGNG> 何故「\x83P」とすると「\x83」と合体して1つの文字になるのかが分かりませんでした。
何故って、表示端末が「\x83\x50を受け取ったら」「"ケ"を表示する」って設定されてるから。考えすぎ。
0981デフォルトの名無しさん
NGNGありがとうございます!!libwwwってクライアントだけと思ってました。。。
0982デフォルトの名無しさん
NGNGmy $ua = LWP::UserAgent->new(
agent => qq|mozilla/8.00|,
cookie_jar => { file => "./.cookies" }, # これを追加して・・・
);
my $res = $ua->get(sprint qq|http://www2.ipdl.ncipi.go.jp/begin/be_search.cgi?STYLE=login&sTime=%d|, time);
$ua->cookie_jar->save; # 久喜を保存するとよいかモナー
0983デフォルトの名無しさん
NGNG0984デフォルトの名無しさん
05/01/17 00:42:11>2バイト用のコードというものの具体的な範囲はちょっと分かりませんが、
>>933
>1バイト目が81〜9F、E0〜FCなら次のもう一バイトとあわせてひとつの文字になる。
0985デフォルトの名無しさん
05/01/17 00:59:440986デフォルトの名無しさん
05/01/17 01:13:35続けるなら書店で文字コードの本買ってひととおり読んできてからにして欲しいですよ。
0987デフォルトの名無しさん
05/01/17 01:44:090988デフォルトの名無しさん
05/01/17 04:59:41このぐらいの数を管理するのに良い方法ってありますか?
使っているサーバはPHPは使えません。
今まで修正・削除などを
「ファイル開く→全データ取り込む→該当データを検索→処理→処理結果を反映して保存」
この単純な方法でやってきたんですが、もっと良い管理方法がありますか?
0989デフォルトの名無しさん
05/01/17 05:07:25>>1嫁
0991988
05/01/17 17:19:100992デフォルトの名無しさん
05/01/17 17:31:420993デフォルトの名無しさん
05/01/17 17:34:00死ね
0994デフォルトの名無しさん
05/01/17 17:34:070995デフォルトの名無しさん
05/01/17 17:35:110996デフォルトの名無しさん
05/01/17 17:37:280997デフォルトの名無しさん
05/01/17 17:39:100998デフォルトの名無しさん
05/01/17 17:40:200999デフォルトの名無しさん
05/01/17 18:25:191000デフォルトの名無しさん
05/01/17 18:26:0510011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。