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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。

CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc5.2ch.net/php/ )

CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。

http://www.perl.org/get.html
● 2004/11/28現在の最新版: 5.8.5
● 2004/11/28現在の開発版: 5.9.1
2デフォルトの名無しさん:04/11/28 22:41:38
3デフォルトの名無しさん:04/11/28 22:42:00
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: 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
4デフォルトの名無しさん:04/11/28 22:47:36
>>1-3
スレ立て乙!
5デフォルトの名無しさん:04/11/29 00:00:51
v5.8.6age
6デフォルトの名無しさん:04/11/29 00:24:10
>>5
http://www.perl.com/CPAN/src/
まだ出ていないのか、もうすぐ出るのか、ガセなのか、、、
7デフォルトの名無しさん:04/11/29 00:29:26
>>6
あれ?なんでperl.comに無いんだろう。

http://search.cpan.org/~nwclark/perl-5.8.6/
8デフォルトの名無しさん:04/11/29 00:33:06
お前ら音速が遅すぎ
9デフォルトの名無しさん:04/11/29 12:50:17
cpanがどうのいう人は英語がわかるんですか?
10デフォルトの名無しさん:04/11/29 14:04:02
>>6-7
それよか、5.8.5→5.8.6の変更点教えれ。
それによってインスコするかどう−か考えるから。
11デフォルトの名無しさん:04/11/29 14:11:26
・perl-5.8.6 が出ています。

メンテナンスリリースです。
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
12デフォルトの名無しさん:04/11/29 14:31:06
>>11
Changes より perldelta の方が嬉しい人多いんじゃないかな。
http://search.cpan.org/src/NWCLARK/perl-5.8.6/pod/perl586delta.pod
13デフォルトの名無しさん:04/11/29 15:32:49
>>11-12 thanks
結構、バグフィクスありまつね。utf-8の扱いで不正な文字があっても
正常に対応できるようになったとか。漏れなんか、utf-8で多言語扱って
るからバージョンアップした方がいいみたい。
14デフォルトの名無しさん:04/11/29 18:37:20
Linux colinux 2.6.8.1-co-0.6.2-pre6 #58 Sun Oct 24 21:48:46 IST 2004 i686 GNU/Linux
Debian GNU/Linux 3.1 colinux tty1
This is perl, v5.8.4 built for i386-linux-thread-multi

colinux/Debian で環境構築中です。
CPANからいろいろモジュールをインストしようとしてるのですが、
たとえばJcodeを入れようとすると、

/usr/lib/perl/5.8/CORE/perl.h:380:30: sys/types.h: No such file or directory
/usr/lib/perl/5.8/CORE/perl.h:411:19: ctype.h: No such file or directory
(延々と続く)

などといわれてインストールできません。
他に、Email::Valid::Loose はテストに失敗するようで、
これも駄目でした。

RHL9環境下の This is perl, v5.8.4 built for i686-linux では問題なく
インストールできているのです。

最初、makeがないといわれてmakeをいれ、次にccがないと怒られたので
gcc入れました。

原因わかる方いらっしゃいますか?
15デフォルトの名無しさん:04/11/29 18:46:16
レスしたくないよなあ、こういうの
16デフォルトの名無しさん:04/11/29 18:57:18
DebianならDebianのパッケージとして入れればいいじゃん。
なんのためにメンテナーががんばってると思ってんじゃボケ
17デフォルトの名無しさん:04/11/29 19:00:01
#apt-get install libc6-dev
18デフォルトの名無しさん:04/11/29 19:07:54
指定したURLのHTMLファイルをダウンロードしたいのですが、
wget を使って実現するにはどうすればよいでしょうか。
19デフォルトの名無しさん:04/11/29 19:09:55
koko ha perl sure desu.
20デフォルトの名無しさん:04/11/29 19:14:12
>19
すいません。>18はperlの話です。
21デフォルトの名無しさん:04/11/29 19:15:09
system("wget options...");
2214:04/11/29 19:15:24
>>17
ありがとうございました。
>>16
DebianのパッケージでPerlモジュール入れられるの
知りませんでした。ありがとうございました。
ただ、探すの大変です。
23デフォルトの名無しさん:04/11/29 19:17:31
>21
そういうことじゃないです。脳が少ないようなのでもういいです。
24デフォルトの名無しさん:04/11/29 19:20:19
>>23
もっとちゃんと説明する必要があるんじゃないの?
>>18 の質問だと、おそらくみんな >>21 が正解だと思うよ。
25デフォルトの名無しさん:04/11/29 19:21:18
>24
みんなって誰と誰と誰ですか?
あなたの脳内の人たちですか?
26デフォルトの名無しさん:04/11/29 19:22:21
つまんない。
27デフォルトの名無しさん:04/11/29 19:23:57
>26
ウワ。逃げやがった。
28デフォルトの名無しさん:04/11/29 19:25:44
>>25
まあ私の脳内と思ってもらってもいいけども、
実際、ちゃんとしたレスがもらえて無いじゃない?
29デフォルトの名無しさん:04/11/29 19:28:55
はい。あなた含め、皆さんの脳が少ないために
ちゃんとしたレスがもらえませんでした。
30デフォルトの名無しさん:04/11/29 19:29:24
つまんない。
31デフォルトの名無しさん:04/11/29 19:39:45
>30
また逃げやがった。
32デフォルトの名無しさん:04/11/29 19:40:23
>21
そういうことじゃないです。脳が少ないようなのでもういいです。
33デフォルトの名無しさん:04/11/29 19:44:33
>24
みんなって誰と誰と誰ですか?
あなたの脳内の人たちですか?
34デフォルトの名無しさん:04/11/29 19:51:10
日時っぽぃ文字列をマッチさせるために以下のようにしました。

$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で確認

あるいは他にいい正規表現があれば教えてください。
35デフォルトの名無しさん:04/11/29 20:13:07
>>34
たとえば、 (:?$date1|$date2) に着目すると、
$date1 か $date2 のどちらか片方にマッチしたとしても、
そこだけで $1 から $6 まで占めちゃう。

ので、@dateval の内容を取り出す際に、
$1, $2, $3 または $4, $5, $6 のうちのセットされているどちらか一方だけを
とりだして 年,月,日 とするようにすればいいかと。
36デフォルトの名無しさん:04/11/29 21:31:14
>>35
> たとえば、 (:?$date1|$date2) に着目すると、
> $date1 か $date2 のどちらか片方にマッチしたとしても、
> そこだけで $1 から $6 まで占めちゃう。

なるほど。
たしかに例えば「2004/11/29 235959」という文字列に対してマッチングさせたら
@dateval[0 .. 2]と@dateval[9 .. 11]にキャプチャされていて
仮に時間が省略されていたとしてもマッチさえすれば
$#dateval=11になっていることも確認できました。
ありがとうございましたm(_"_)m
37デフォルトの名無しさん:04/11/29 23:30:38
cpan> i Filter::Simple
Strange distribution name [Filter::Simple]
Module id = Filter::Simple
DESCRIPTION Simplified source filtering
CPAN_USERID DCONWAY (Damian Conway <[email protected]>)
CPAN_VERSION 0.79
CPAN_FILE D/DC/DCONWAY/Filter-Simple-0.79.tar.gz
DSLI_STATUS RdpO (released,developer,perl,object-oriented)
MANPAGE Filter::Simple - Simplified source filtering
INST_FILE /usr/local/lib/perl5/5.8.6/Filter/Simple.pm
INST_VERSION 0.78

直して欲しいかも。

$VERSION = '0.78';
のままだし。。。
38デフォルトの名無しさん:04/11/29 23:36:02
>>37
あれ?CPANのは0.79になっているなぁ。。。
39デフォルトの名無しさん:04/11/30 00:44:58
正規表現でのマッチングで、『\S』というのはスペース以外の文字を表しますよね。
これを使って、『半角文字5個分』のマッチングを行いたいのです。
例えば、

:abcde:
:fgh__:
:ijkl_:
:m____:
:no___:
(_ は半角スペースだと思ってください)

のようにコロンとコロンの間に半角文字5個分の領域を取って書いてあるテキストで
パターンマッチングを行いたいのですが、:と:の間のマッチングを
どのように記述していいのかわからないのです。

\w{5} を使えば:abcde: の部分はマッチングが行えますが、他の4行はダメですよね。
\S{5} を使っても、\Sは『スペース以外の全ての文字』なのでダメだと思います。
全ての文字と、スペースを含めて半角5個分をマッチングさせる方法があったら教えてください。
よろしくお願いします。
4039:04/11/30 00:46:18
すみません。
>>39の最初の1行は余計です。
\Sを使うことにこだわりはありません。
41デフォルトの名無しさん:04/11/30 00:47:33
.....
42デフォルトの名無しさん:04/11/30 01:25:26
>>39
これでいい?
/[\w\s]{5}/
43デフォルトの名無しさん:04/11/30 01:25:49
[\w ]{5}でよいのではないかと思われ。
4439:04/11/30 01:26:36
ありがとうございます!
45デフォルトの名無しさん:04/11/30 01:34:41
.................
46デフォルトの名無しさん:04/11/30 01:39:59
\sには\tとか\nも含まれるからね・・・
47デフォルトの名無しさん:04/11/30 08:10:54
\w{1,5}
48デフォルトの名無しさん:04/11/30 13:29:34
テキストデータに表示不可能文字(バイナリ?)が混ざったファイルとテキストのみのファイルを
見分ける手段というのはありますでしょうか?
別にPerlじゃなくたってこれでできるというのがあれば、ポインタでも教えて頂ければありがたいです。
49デフォルトの名無しさん:04/11/30 14:54:18
>48
あるかないかと言えばある。回答終わり。

ポインタ?
50デフォルトの名無しさん:04/11/30 15:58:44
>>48
jcode.pl の getcode() 関数を使うとできるかも。
51デフォルトの名無しさん:04/11/30 18:02:19
>>49
ポインタっていうか、ここ見たらあるから見れとかそういうのでもってことでした。
ちなみに、手間でなければその方法をお教え願えないでしょうか?m(_ _)m
>>50
ありがとございます。
試みてみます。
52デフォルトの名無しさん:04/11/30 21:40:42
>>48
$binary = 1 if $str =~ /[\x0-\x8\xb\xc\xe-\x1f]/;
こんな感じかな。どうせ厳密なのはできないし。
53デフォルトの名無しさん:04/11/30 21:48:31
>>52
それだと ISO-2022-JP が救えなさそうだけど大丈夫かな?
54デフォルトの名無しさん:04/11/30 21:52:57
MS-wordのファイルをテキストファイルにするスクリプト書いた香具師いる?
見てみたら、ドイツ語と日本語混在のDOCてutf-16で書かれてたよ。
>>48は、ひょっとして同じことやろうとしてるのか。
55デフォルトの名無しさん:04/11/30 21:56:39
>>54
COM でやれば?
56デフォルトの名無しさん:04/11/30 21:58:24
57デフォルトの名無しさん:04/11/30 21:58:53
>>54
wv でやれば?
5854:04/11/30 22:18:58
>>55-57
情報、どもども。
とりあえず、wv(うぉーunix対応)ダウソしてみまつた。
これまで、xdoc2txt(free)つーのと「なんでもテキスト屋さん」
(share)つーの試して未丹やけど、日本語はうまくいくんだが、
ドイツ語特殊文字がぜんーぶダメポだったんよ。
でけたら、いつか報告始末ね。(今日は忙し)
5954:04/11/30 22:22:17
あ、わっしが作ったword2txt.plも結構行けますたよ。英語とか独語
だけだと。何つうかな、記号類(機種依存文字かな)をいちいち指定
しないとダメポですたが。
6054:04/11/30 22:30:16
あちちち、wvてwindows用だた。unixでこいうのあれば、
OpenOffice入れなくて済むのにぃ。
61デフォルトの名無しさん:04/11/30 22:30:18
リッチテキストファイルの表の部分を
カンマ区切りかタブ区切りかぐらいにしてくれるツール無い?
perlで作ったやつ一人くらい居そうな気がするんだが
62デフォルトの名無しさん:04/12/01 03:11:03
あるけどおまえにはやらん
63デフォルトの名無しさん:04/12/01 04:16:01
>>61
で、 CPAN は調べたんだろうな?
64デフォルトの名無しさん:04/12/01 11:42:12
初歩的な質問で恐縮なんですが・・・
foreach (@abc) {
 と
foreach (@$abc) {
の違いって何でしょうか?
前者は 配列 abc の各要素毎の処理で、
後者は 変数 abc で示された文字列の名称の配列の各要素毎の処理、
という理解であってますか?
65デフォルトの名無しさん:04/12/01 12:19:05
後者は$abcという変数に格納された「配列へのリファレンス」が示す配列の各要素
@{$abc}の省略記法です。ラクダ本のリファレンスの章を読んでみると分かりやすいと思います。
66デフォルトの名無しさん:04/12/01 12:49:27
>>65
あえがとうございます。
リファレンス、ですね。
勉強してみます。
67デフォルトの名無しさん:04/12/02 06:52:06
あのー、ウインドウズでPerlができるソフトは何があるのでしょうか。
68デフォルトの名無しさん:04/12/02 07:04:23
>>67
ActivePerl
ttp://www.activestate.com/

GUI作りたいならPerl/Tk使っとけ
69デフォルトの名無しさん:04/12/02 07:49:09
$ua = LWP::UserAgent->new;
$ua->cookie_jar($cookie_jar);
$ua->timeout(600);
$request = POST("https://〜hogehoge〜/" ,[%form_data]);
$res = $ua->request($request);
$_ = $res->content;

上で'500 read failed:'って帰ってくるんですけど、対処方法はないですか?
timeoutは意味をなしていない見たいだし。
70デフォルトの名無しさん:04/12/02 08:11:34
いや、Win32::Guiだ
71デフォルトの名無しさん:04/12/02 11:20:48
use strict;
$c=4;
ではエラーになる(当然)のに、
use strict;
$a=4;
ではエラーにならないのはなぜですか? $aを$bにしても同じです。
72デフォルトの名無しさん:04/12/02 11:27:29
sort() によって使われるという理由で $a と $b はこのチェックの適用外という特別扱い
73デフォルトの名無しさん:04/12/02 11:29:14
っていうかperldoc見ると普通に理由書いてあるぞ
ちゃんと読め
74デフォルトの名無しさん:04/12/02 11:37:10
あれ?
DBDにSQLserver用のドライバありませんでしたっけ?
前に見た記憶があるんですが..私の記憶違い??

CPANさんやーいorz
75デフォルトの名無しさん:04/12/03 11:37:17
のーびすな質問です。
CPAN
って、どう読めばいいのでつか?
76デフォルトの名無しさん:04/12/03 11:46:22
>>75
惜しい! 7秒前に書き込めば・・・
77デフォルトの名無しさん:04/12/03 15:53:49
どちらの板が正式なのかわからなかったので、両方に質問します
ハッシをまだ使いこなせていません。例えば、
一つのファイルは、
106 1473
106 764
1762 48
1762 38
1762 91
と、左の数字に対して、いくつかデータがあって、もう一つのファイルは、
106 30
1762 50
と、左の数字に対して一つしかデータがないものがあった時に、
これを、
106 1473 30
106 764 30
1762 48 50
1762 38 50
1762 91 50
のようにハッシュをつかって表示させるのはどうやればいいのでしょうか?
78デフォルトの名無しさん:04/12/03 15:56:42
ループ{
$hash[$file1_leftvalue} = $file1_rightvalue;
}
ループ{
printf("%d %d %d\n", $file2_leftvalue, $hash{$file2_leftvalue}, $file2_rightvalue);
}
79デフォルトの名無しさん:04/12/03 17:18:59
質問します

@NEW1 ← 1データ
@NEW2 ← 2データ


@NEW100 ← 100データ

が入っており
これを 
if (!open(OUT,">$ufile"))
print OUT @NEW1;
close;
if (!open(OUT,">$ufile"))
print OUT @NEW2;
close;

と別のファイルに出力します。@NEWの数が多いので
下記のようにループでやろうと思うのですが、print 分の@NEWの記載方法がわかりません
@NEW1 @NEW2 **** @NEW100 のようにカウントを用いたいのですがうまく認識してくれませんでした。
お願いします。

foreach my $num(1..100){
$ufile = $UDATA_DIR_C[$num].;
if (!open(OUT,">$ufile")) { &error('個人ファイルが書き込めません'); }
print OUT "@NEW$num";     ←   これではだめでした
close(OUT);
}

80デフォルトの名無しさん:04/12/03 17:22:40
if (!open(OUT,">$ufile"))
print OUT @NEW1;
close;
if (!open(OUT,">$ufile"))
print OUT @NEW2;
close;

同じファイルに出力しているようなのですが?・・・
81デフォルトの名無しさん:04/12/03 17:23:39
>>80
$ufile = $UDATA_DIR_C[$num].;
としているので、違うファイルです
82デフォルトの名無しさん:04/12/03 17:26:19
print OUT eval("\@NEW$num");
83デフォルトの名無しさん:04/12/03 17:27:53
ソフトリファレンス使って

print OUT "@{'NEW'.$num}";

とすればその部分はいけると思うけど、全体見直した方がいくない?



 
84デフォルトの名無しさん:04/12/03 17:29:47
ネタだと思う
85デフォルトの名無しさん:04/12/03 17:48:59
>>82
>>83

まじ、サンクスコです

86デフォルトの名無しさん:04/12/04 01:48:37
質問します
配列の中の空白をとる置換をしようとおもうのですが
@NEW =~ tr/ //;

だと置換が行われないようです。一レコードづつ置換しないとだめでしょうか?
87デフォルトの名無しさん:04/12/04 02:03:21
>>86
YES.

tr/ //d for @NEW;
88デフォルトの名無しさん:04/12/04 02:50:15
>>86
おまえはスクリプトが完成するまで質問し続ける気かね
89デフォルトの名無しさん:04/12/04 02:58:26
作ってくださいスレへ行け、と。
90デフォルトの名無しさん:04/12/04 04:44:54
質問の>>77>>79を見る限り
最初はハッシュ要素に配列入れようとしてたが、方法が分からずに
>>79みたいな変な実装になってるんだろう

>>78は全然間違った回答してるしw
91デフォルトの名無しさん:04/12/04 09:53:07
>>87
サンクスです
92デフォルトの名無しさん:04/12/04 10:57:10
質問します
foreach $num (0 .. $#STOCK) {
$line = $STOCK[$num];
($WORD,$PRON,$MEAN,$LVL,$CAT1,$CAT2,$YOBI1,$YOBI2,$YOBI3,$YOBI4,$YOBI5) = split(/@@@/,$line);
$line2 =$WORD.'@@@'.$CAT1.'@@@0@@@'.$CAT2.'@@@0@@@'.$YOBI1.'@@@0@@@'.$YOBI2.'@@@0@@@'.$YOBI3.'@@@0@@@'.$YOBI4.'@@@0@@@'.$YOBI5.'@@@0@@@'."\n";
#カテゴリーごとにユーザファイルを分割する
if ($CAT1 > 100 && $CAT1 < 200){push(@NLINE,$line2);}
}

@STOCKの内容を取り出して、条件に合えば、@NLINEに吐き出すのですが、
一行目が AAAAAAA だとするとちゃんとはいるのですが、2レコード目以降
BBBBBBだとすると先頭に半角の空白が入って@NLINEにはいってしまいます 具体的には

AAAAAA
BBBBBBB
CCCCCCC

です。直前(PUSHする前の)$line2のダンプを取ってみても空白は、まったくはいっていないので
pushをすると自動的に空白がはいってしまうようです。なぜでしょうか?
93デフォルトの名無しさん:04/12/04 13:57:22
>>92
前スレ866さん、出番です(笑)

866 名前:デフォルトの名無しさん 投稿日:04/11/23 19:26:38
>>864
どっかで
print WRITE "@value";
とかやってんだろ。

94デフォルトの名無しさん:04/12/04 13:58:33
>>92
おまえはスクリプトが完成するまで質問し続ける気かね
95デフォルトの名無しさん:04/12/04 14:10:14
Sir! No! Sir!
Sir! 完成後も続けます! Sir!
96デフォルトの名無しさん:04/12/04 14:21:17
質問箱なんだからはよおしえれ
97デフォルトの名無しさん:04/12/04 14:29:45
改行コードじゃないの
98デフォルトの名無しさん:04/12/04 14:34:39
>>97
んや、半角の空白
どう考えてもおかしい pushする直前にダンプしてもはいてないけど、push後にははいっている
perl5のバグかな
99デフォルトの名無しさん:04/12/04 14:39:34
そんなしょーもないバグがあるはずないんですけど。
'@@@0@@@'."\n";

'@@@0'."\n";
ではだめですか?
10092:04/12/04 14:47:55
>>99

どうもです、今試したんですが
なぜかうまくいきました・・・ サンクスです
が理由がわかりましぇん
101デフォルトの名無しさん:04/12/04 14:56:19
どうでもいいが、

foreach $num (0 .. $#STOCK) {
$line = $STOCK[$num];

なんてやるぐらいならはじめから

foreach $line (@STOCK) {

にしろよ。$numそこでしか使ってないからいらないだろ。
102デフォルトの名無しさん:04/12/04 15:01:15
見てて吐き気のするコードだなおい
103デフォルトの名無しさん:04/12/04 15:05:30
ほんとにどうでもいいです。
10492:04/12/04 15:10:30
解決したからまあいいや
105デフォルトの名無しさん:04/12/04 17:05:55
週末はこのスレはreadonly
それがPerl流
10654:04/12/04 18:26:16
書き込めるけど読めません。chmod間違えてませんか。>>105
107デフォルトの名無しさん:04/12/04 18:26:57
Perl6の正規表現ってやばすぎですよね。
108デフォルトの名無しさん:04/12/04 20:42:43
間の悪い時にくだ質御免。

while(open(IN,<*.txt>)) {

みたいなファイルの開き方しちゃった時、
ループ内で「今開いとるファイル名」を得る方法ってありませんでしょか。
前もって$filename = glob("*.txt");
とかするより楽な方法が、なんかあるんじゃないかと気になって眠れない。
109デフォルトの名無しさん:04/12/04 22:27:48
>>108
そんなファイルの開き方しちゃダメです。@負荷増大
opendir Dir_entry, './' or die;
for (grep /\.txt$/, readdir Dir_entry){
open IN, '<', $_ or last;
...
}
とか。
110デフォルトの名無しさん:04/12/05 00:39:05
そうなんですか。ありがとうです。
ひとつひとつ横着せずにやりますか。
111デフォルトの名無しさん:04/12/05 02:31:00
while(<*.txt>)) {
open IN $_;
my $file = $_;

とか
112デフォルトの名無しさん:04/12/05 02:37:43
ループの最後でちゃんとcloseしてれば問題ない気がするが
113デフォルトの名無しさん:04/12/05 09:56:38
えっと、ワイルドカード(<*.txt>、glob(*.txt))が負荷を掛けているってことですので、、、
114デフォルトの名無しさん:04/12/05 13:06:26
>>107
どうやばいの?
115デフォルトの名無しさん:04/12/05 13:47:38
>>114
超使いやすい。やばすぎる。
116デフォルトの名無しさん:04/12/05 18:08:06
117デフォルトの名無しさん:04/12/05 23:32:40
質問します。
Win32のActivePerl5でドライブのレディ状態を調べたいのです。

if ( &drive_ready_check( 'A' ) ){
print "Aドライブはレディー状態です\n";
}else{
print "Aドライブはノットレディー状態です\n";
}

という感じで使いたいのです。
よろしくお願いします。
118デフォルトの名無しさん:04/12/05 23:49:39
>>117
CPANぐらい検索しろよ。driveとreadyをキーワードでひけば

ttp://search.cpan.org/~mblaz/Win32-DriveInfo-0.06/DriveInfo.pm

てのが一発で出るよ。これのIsReadyってのがソレっぽい。

119デフォルトの名無しさん:04/12/06 00:00:51
>>118
早速の返答ありがとうございました
やってみます
120デフォルトの名無しさん:04/12/06 02:08:23
>>116
Parse::RecDescent(以下、P::RDと呼びます)はnew() モジュール・メソッドを使って新しい文法を作ります。
各P::RD文法は、P::RDクラスにブレスされたオブジェクトになり、文法中の各ルールはメソッドとして、
アクションを起こすために使用します。P::RD文法は構文解析プロセスに統合された 一部として、
それぞれのルールにアクションを関連付けます。これは非常に重要なことです。
Perl 5では構文解析は自分自身へのイベントであり、アクションは、大都会に至る道すがら、
遠くからでも猫を混乱させることが証明されている拡張構文を使って轢き殺した、路上轢死体のようなものです。
この違いにより、一致が検出された時に何かが起こるようにするという点で、
P::RDはPerl 5の正規表現よりもずっと効果的なものになります。

翻訳されてても読めません、先生。
121デフォルトの名無しさん:04/12/06 03:02:06
>>113
どうやばいの?
122:04/12/06 10:38:27
よく使うサブルーチンがいっぱいあって、いちいちコピペするのが面倒なんですが、
その場合は
routine.pl
に全部入れておいて、呼び出す方のファイルに
require "routine.pl";
と書けばいいだけなのでしょうか?
123デフォルトの名無しさん:04/12/06 10:51:56
>>122
そだね"1;"を忘れないように。
ってかファイル名気持ち悪いので複数形に汁
124デフォルトの名無しさん:04/12/06 10:52:37
もおプログラミングするのツカレタ・・・・
125:04/12/06 10:58:22
ありがとうございました。
できたのですが、最後の1は何か意味があるのでしょうか。よく理解できません。
126デフォルトの名無しさん:04/12/06 11:30:48
>>125
perlfunc(1)のrequireの項よめ。

初期化コードの実行がうまくいったことを示すた
めに、ファイルは真を返さなければなりませんから、真を
返すようになっている自信がある場合を除いては、ファイ
ルの最後に "1;" と書くのが習慣です。 実行文を追加す
るような場合に備えて、"1;" と書いておいた方が良いで
しょう。
127デフォルトの名無しさん:04/12/06 17:20:43
A | ON 1.500000 | OFF 4.000000 | 2.500000
A | ON 2.300000 | OFF 3.400000 | 1.100000
C | ON 0.400000 | OFF 8.200000 | 7.800000
B | ON 4.100000 | OFF 5.500000 | 1.400000

と言うような行が書かれているデータファイルを読み込んで、一番右側の数値でソートし、

A | ON 2.300000 | OFF 3.400000 | 1.100000
B | ON 4.100000 | OFF 5.500000 | 1.400000
A | ON 1.500000 | OFF 4.000000 | 2.500000
C | ON 0.400000 | OFF 8.200000 | 7.800000

といった出力することはできるでしょうか?

if ( $_ =~/(A|B|C) \| ON (\S+) \| OFF (\S+) \| (\S+)/)

の$4でソートをするというのはなんとなくわかるのですが、ソート結果出力を
その値がある行全体を表示して出力する、というやり方がわからないのです。

どなたかわかる方いらっしゃいましたら教えていただきたいです。
よろしくお願いいたします。
128デフォルトの名無しさん:04/12/06 17:25:31
>>127
先に分解するんじゃなくてソートするときに分解したら
129128:04/12/06 17:44:25
>>127
ほれ。

sub get_sortkey ($) {
return $1 if shift =~ /(?:A|B|C) \| ON \S+ \| OFF \S+ \| (\S+)/;
# ちなみにこのフォーマットならこっちのほうが良いかも
# return $& if shift =~ /[\d\.]+$/;
return 0;
}

my @sorted = sort {get_sortkey($a) <=> get_sortkey($b)} @src;
130デフォルトの名無しさん:04/12/06 20:22:32
print map { $_->[ 0 ] }
sort { $b->[ 1] <=> $a->[ 1 ]}
map { [ $_ , m/ (\S+)$/ ] } <>;
131デフォルトの名無しさん:04/12/06 22:45:25
>>128, >>129, >>130

ありがとうございます。
>>129さんの方法を組み込もうと思っているのですが、せっかく教えていただいたのに
使い方がイマイチ理解できません・・・。

>>127の時点で考えていたことは、

sub sort
 {
 $i = 0;
 while ( $_ = <FP> )
  {
   if ( $_=~ /(A|B|C) \| ON (\S+) \| OFF (\S+) \| (\S+)/ )
    {
     $value[$i] = $4;
    }
  $i++;
  }
 }

@value_sort = sort {$a <=> $b} @value;
print WRITE @value_sort;

というような考えだったのです。
>>129さんの最後の行をこの関数sortの中に入れて、関数 get_sortkey を
関数sortの外に記述する、といった感じなのですか?

せっかく教えていただいたのに理解できずに申し訳ないです。
勉強を続けなくては…。
132デフォルトの名無しさん:04/12/06 23:34:25
>>131
そもそもsort関数が、perlで用意されてるのをご存じか?と、訊きたい。
133デフォルトの名無しさん:04/12/07 03:43:22
$a<=>$bってやってるじゃん。つかこの辺の仕組みで誤解して悩んでる気がする
>>127に近い形で書くとすると

use strict;
my @value;

while( <> ) {
 if( /(A|B|C) \| ON (\S+) \| OFF (\S+) \| (\S+)/ ) {
  push ( @value , [ $4, $_ ] );
 }
}

@value = sort{ $a->[0]<=>$b->[0] } @value;
print $_->[1] foreach( @value );


…あんま変わらんか
134デフォルトの名無しさん:04/12/07 08:14:15
135:04/12/07 09:24:49
Perl6ってもうすぐ出るんですか?
>>1を見る限りでは、もうすぐという感じなのですが。
136デフォルトの名無しさん:04/12/07 11:39:33
ここで質問に答えてる人ってすごいスキルあるよね
すれ違いだけど
どんな本読んでるか教えて
おれのは、CGI&PERLポケットリファレンス、perl&CGI入門ゼミナール 
137デフォルトの名無しさん:04/12/07 11:43:48
>>136
とりあえずその本捨てろ、O'Reillyの本を読め

後、スキルあるんじゃないぞ、これ位は普通
ていうか最近質問のレベル低すぎる
138デフォルトの名無しさん:04/12/07 12:16:00
少なくとも>>137を見る限り、一部回答者のレベルの低下ぶりにも
目を覆いたくなるほどのものがある。
139デフォルトの名無しさん:04/12/07 12:31:38
スコープを抜けるときは必ずこれを実行する、みたいな、
ファイナライザみたいなのはできるでしょうか?
たとえば、ネットワーククライアントで、
処理中に途中で例外が発生して return しようすると、
そこで勝手に自動的に close() してくれる、みたいな感じのができるといいのですが。
140デフォルトの名無しさん:04/12/07 13:17:04
use Error qw(:try)
とか使えば?
141デフォルトの名無しさん:04/12/07 13:30:35
>>137
O'Reilly って洋書ジャン
翻訳で挫折しそう 俺の場合は汎用機やってたか
そっちの言語は分かるが、perlの省略した形やデータ属性がないことに違和感を感じるね
142デフォルトの名無しさん:04/12/07 13:41:42
オライリーでぐぐれ
143デフォルトの名無しさん:04/12/07 14:26:41
75でつ
CPAN
の読み方を知りたいっす.....


144デフォルトの名無しさん:04/12/07 14:33:28
>>143
スィーピャヌ
145デフォルトの名無しさん:04/12/07 14:51:23
>>139
オブジェクトにはデストラクタを指定できる。
例えば、IO::Fileなどは自動的にcloseしてくれるし、
CPANで配布されているオブジェクト指向モジュールはその辺適当に始末してくれる事がおおい。
自分でやるにせよ、生のハンドルは使わず、オブジェクトで包んで使うのが無難だな。

>>143
しーぱん

146デフォルトの名無しさん:04/12/07 15:32:52
これからPerlかPHPを勉強しようと思っている学生です。
なんだかPerlよりPHPのほうが強力、という記事をよく見ます。
(CGIに限ってのことかもしれないですが)
ここに現れる皆さんはPerlの熟練者の方達ばかりだと思いますが、
そのような方達がPerlを現在も使っているのはどんな理由からですか?
学生の僕には、

・Unix系のOSには最初からPerlが入っているから
・PerlのCGIで作られたホームページが多いから

といったような、「使っている人が多いから」くらいしか思い浮かびません。
熟練者の方から見て、PHPと比べたPerlの利点・欠点を教えていただければうれしいです。
147デフォルトの名無しさん:04/12/07 16:18:37
>>146
レベルどうこう以前にこういう質問の方が嫌なんだが。すぐ荒れるし。

PerlとPHPでは出自がちがう。
sed awkといったフィルタ言語の流れで生まれたのがPerl。
そのテキスト処理能力があまりに強力なので、CGIに多用された。
PHPはWebサーバー上での使用を念頭に入れて開発された。
そういう場での使用にかなり特化されたつくりをしている。

CGIでPerl使う気にはもうなれんという人がいても別に不思議じゃないが
ターミナル上での書き捨てスクリプトつくるのに俺はPHP使う気にゃなれんし
そういう事例で言語自体の出来を云々するのはオロカ。
オロカな比較は実に多いので気にする必要なし。
てか、言語同士比較してるよりなんでもいいから使ってみ。
148デフォルトの名無しさん:04/12/07 17:28:43
あとPerl、PHPの両刀使いも多いよ。
それぞれ得意、不得意があるからケースバイケースで使い分ける。
荒れるのはPHPしか出来ない奴がPHP至上主義で刃向かってくることが
原因である事が多々ある。
149デフォルトの名無しさん:04/12/07 17:31:17
>>141

http://www.oreilly.co.jp/books/perl/

初めてのperl 正・続 と クックブックがお勧めかな。

続のオブジェクト指向の記述はわけわかだけど
(リファレンスの使い方の記述は分かりやすいんだけどね)、
クックブックのは比較的分かりやすい。
(ほかで、オブジェクト指向の入門的知識を仕入れてないとダメだけど。
 オブジェクト指向が分からんと、もうモジュールもまともに使えないし)

高いけど、オライリーの本をやらないと、結局、ダメだと思うよ。
150146:04/12/07 17:33:30
ありがとうございます。
知らなかったとはいえ、荒れる要素を含む質問をしてしまい、申し訳ありません。
これから活用したいと思うスレが荒れるのはイヤなので回答はもう結構です。
回答してくださったお二方、どうもありがとうございました。
151デフォルトの名無しさん:04/12/07 17:36:46
webでデータベースとしてシステムを構築することだけ考えても、
本当は、mod_perlとDBIを備えるperlの方がより強力なんじゃないの?
(宣伝文句と違い、PHPはmod_perlより早いわけじゃないし、
 DBIなら裏のデータベースが変わっても、らくらく対応だし。
 ボラクルでもどんとこい!)

それ以外の用途では、基本的にperlじゃないとやれないし。
152デフォルトの名無しさん:04/12/07 17:43:23
PHPはマーケティングが上手い
企業対個人って時点で当たり前なんだけど。
153デフォルトの名無しさん:04/12/07 17:50:19
>>146
打ち切った後の回答で悪いが

どちらかではなくて両方覚えるのがイイよ
(同時じゃなくていい、好きな方を先にやって残りを後から)
そして、自分で考えて使い分けるのがいい
154デフォルトの名無しさん:04/12/07 17:56:53
これまた打ち切った後の回答で悪いが、>>146
PerlとPHPのどっちを先に勉強したほうがいいのか、ということじゃないか?
それこそどっちが活躍の機会が多いか、とかのような感じで。
ワシ的にはPerl。
なぜなら、やはり今ではPerlでCGIを使っているシステムが多いから。
別にPerlの使用用途はCGIだけじゃないが。
155デフォルトの名無しさん:04/12/07 18:06:24
>>140, >>145
レスありがとうございます。
>>145 さんのは DESTROY ってやつですね。
これがまさに探していたものでした。これでうまくいきました。
ありがとうございました。
156デフォルトの名無しさん:04/12/07 19:09:18
Webで使うから って理由をベースに考えを進めるよりは
手軽な言語 → Web でも使える
って流れで考えた方が良いと思うが
157デフォルトの名無しさん:04/12/07 20:11:09
cygwin上にてperlの運用と勉強をしようとしています
使おうとしているソフトの中の一機能として、Win32::GUIが必要だとあるのですが、
そのパッケージなどを探してみると、ActivePerl用のPPMパッケージ等しか見つかりません

perlが何たるかもわかっていないところに問題があるとも思いますが、
導入方法に関して取っ掛かりをつけていただけないでしょうか
158デフォルトの名無しさん:04/12/07 20:32:38
>>157
http://search.cpan.org/~lrocher/Win32-GUI-1.0/

モジュールなら、とりあえずCPANで探す癖を付けるのが良いぞ
CPANモジュールを使ったインストール方法も覚えておくべし
159デフォルトの名無しさん:04/12/07 20:50:09
ありがとうございます
CPANというものを使ってやってみようと思います
160デフォルトの名無しさん:04/12/07 21:29:41
>>149
オーレイってシリーズもんでよく書店にあるやつだねー
高くて見てなかったので、見て見ます サンクスコ
161デフォルトの名無しさん:04/12/07 21:33:07
オライリーと読め!!!
162デフォルトの名無しさん:04/12/07 23:29:20
flock関数で、LOCK_SHを指定する意味って何なんでしょうか?
なんで、ファイルよむためだけにロックする必要があるんでしょうか?



>>161
私もオーレイってよんでます。
むしろ、日本語読みすると、オーレイのが正しいしぃ。
163デフォルトの名無しさん:04/12/07 23:38:18
>>130
エンスーっぽい
164デフォルトの名無しさん:04/12/07 23:41:06
perlのstat関数で、ファイルのタイムスタンプを取得すると、

$hoge = stat($time)[9]

print $hoge

で、23424545のような、意味不明な数字の文字列がでてくるんですが、
これを、年月日時分秒のようにわかりやすい形にするにはどうしたらいいんしょ?

165デフォルトの名無しさん:04/12/07 23:49:27
>>162
読むだけ同士ならいくつ同時に読んでもなんともないが、
書き換えをする奴が混ざると書き換え途中の変な状態を
読むかもしれない。なので読むだけの奴はLOCK_SHを、
書き換えする奴はLOCK_EXをそれぞれ使うのが普通。
166デフォルトの名無しさん:04/12/07 23:49:29
>>161
オーライ !
167デフォルトの名無しさん:04/12/07 23:50:11
>>162
O'Reilly自身がオライリーって表記してるんだから...
168デフォルトの名無しさん:04/12/07 23:50:34
るby>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ぺrl
169デフォルトの名無しさん:04/12/07 23:51:01
>>164
POSIX::ctime
170デフォルトの名無しさん:04/12/07 23:51:26
>>164
そのコード通るか?

localtime でググれ
171デフォルトの名無しさん:04/12/07 23:52:05
>>165
オーライ!
172デフォルトの名無しさん:04/12/07 23:53:09
>>169
>>170
ありがとうございます。
ぐぐてみます。
173デフォルトの名無しさん:04/12/07 23:57:23
こうしなきゃ
$hoge = (stat($time))[9]
174デフォルトの名無しさん:04/12/08 00:07:32
どうでもいいがファイルを表す変数に
$timeという名前をつけるのはいかがな
ものかと。

175デフォルトの名無しさん:04/12/08 00:52:01
プロセスを標準エラー込み込みでオープンする場合
open PIPE, "command 2>&1 |";
とか書いたりしますが、標準入力と標準エラーを別々のハンドルで分けて
開くのってどうやったらよいのでしょうか?
176デフォルトの名無しさん:04/12/08 01:04:49
ipc::open3
177デフォルトの名無しさん:04/12/08 01:25:47
>>176
ありがとうございます。
open3でググってみました。waitpidという言葉がところどころ見えるのですが
これは自分でwaitしなくてはいけないと(すればよい)と考えればよいですよね。
178デフォルトの名無しさん:04/12/08 10:17:02
>>158
Cpanでインストしようとしたら

GETはできたのですがmakeの時点で
Writing Makefile for Win32::GUI
Makefile:339: *** ハャホ・オュケ讀遉、、ニ、、、゙、ケ。」テ貊゚。」
/usr/bin/make -- NOT OK
というエラーが出てしまいます

化けてて読めない…orz

# --- MakeMaker xs_c section:

.xs.cpp:
$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && $(MV) xstmp.c $*.cpp
179デフォルトの名無しさん:04/12/08 11:43:11
if($resec[3] eq 0){
print"$resec[3]";
}

という文を実行すると、$resec[3]の内容が表示されてしまいます。
@resecの4番目の要素は、pq370という文字列です。
これはなぜなんでしょうか。
180デフォルトの名無しさん:04/12/08 11:54:18
>>179
もっと詳しく。うちでは表示されない。
181デフォルトの名無しさん:04/12/08 12:06:04
>>178
> Writing Makefile for Win32::GUI
> Makefile:339: *** ハャホ・オュケ讀遉、、ニ、、、゙、ケ。」テ貊゚。」
> /usr/bin/make -- NOT OK
> というエラーが出てしまいます
>

化けの部分は、

Makefile:339: *** 分離記号を欠いています。中止。

だわ。
182デフォルトの名無しさん:04/12/08 12:09:01
if($resec[3] eq 0){
なにしてんの?

if($resec[3] eq '0'){
if($resec[3] eq ''){
if($resec[3] == 0){

どれ?
183デフォルトの名無しさん:04/12/08 12:11:29
>>179
eqで整数と比べるなよ。
184デフォルトの名無しさん:04/12/08 12:18:29
>>181
ありがとうございます
185179:04/12/08 12:57:52
eqと==はどのように違うのでしょうか。
文字を==で比較した場合や、数字をeqで比較した場合はどのようなことが内部で行われているのでしょうか。

今回の場合は、@resec内には0と文字列の両方が含まれています。
186デフォルトの名無しさん:04/12/08 13:00:18
質問があります。
DBI でカラム名(フィールド名)をリストを抜き出す関数ってありませんか?
$sth->fetchrow_array で抜き出す配列と同じ順番で出したいのですが..
187186:04/12/08 13:07:43
> DBI でカラム名(フィールド名)をリストを抜き出す関数ってありませんか?

失礼しました。
perldoc 隅々まで眼を読んだらありました。
スレ汚し申し訳ありません。
188デフォルトの名無しさん:04/12/08 13:10:37
>>185
ドキュメントや書籍を読もうという気は微塵もないのですか?
189デフォルトの名無しさん:04/12/08 13:17:03
>>187
謝るぐらいならどうやればできたかも書けよ
190デフォルトの名無しさん:04/12/08 13:21:18
>>181
Makefile.PLやMakefileなどを見て該当部分の空白をタブに置換したりもしてみているのですが、
何度やっても同じエラーでとまってしまいます

また、そのエラーが出ないときは
Couldn't rename Win32-GUI-0.0.558 to /home/UserName/.cpan/build/Win32-GUI-0.0.558:
Permission denied at /usr/lib/perl5/5.8.5/CPAN.pm line 3948
と出て、その下にエラーが続きます

perl Makefile.PL によってMakefileが作られると考えていたのですが、ほかにどこか修正し忘れのような点はありますか?
191179:04/12/08 13:48:05
じつはおまいらはあんましよくわかってないということがわかりました。もういいです。
192デフォルトの名無しさん:04/12/08 13:50:43
>>191
あいにく養護学校に勤務した経験がないもんでね(w
193デフォルトの名無しさん:04/12/08 13:57:12
>>190
makeのバージョン(ていうか、実装系)を疑った方がいいかもね
Win系のモジュールの中には、特定のコンパイラに依存しているのとかあるし
194デフォルトの名無しさん:04/12/08 14:13:49
>>191
オーレイ一冊買うのすらケチってるとあとでロクなことないですよ
195デフォルトの名無しさん:04/12/08 14:20:05
アーライ!!
196デフォルトの名無しさん:04/12/08 14:24:48
オーレイ
197デフォルトの名無しさん:04/12/08 15:05:53
perlを始めようと思ってます。
DLしたいのですが、どれをどうDLするかとか何処にも書いてないので
全然わかりません
言葉の意味もまともに分かりません

教えて欲しいのですが、板違いならどこの板できけばいいですか?
198デフォルトの名無しさん:04/12/08 15:07:11
199デフォルトの名無しさん:04/12/08 15:12:29
>>197
もろ>>1のリンク先にあるぞ。
英語読めないとはいえOSの名前ぐらいわかるだろ。
200デフォルトの名無しさん:04/12/08 15:24:55
>>193
さらにいろいろやってみているのですが、
Cpan 上で make Win32::GUIとやるとエラーが出るので普通にBash上で
Perl Makefile.PLとやると、エラーも無くMakefileができました
その後Cpanで install Win32::GUI 等とすると、同じディレクトリ内にtmpというディレクトリが作られ、
そちらに全内容を移動して作業した後に、
Removing previously used /home/UserName/.cpan/build/Win32-GUI-0.0.558
Can't remove directory /home/UserName/.cpan/build/Win32-GUI-0.0.558: Device or resource busy at /usr/lib/perl5/5.8.5/CPAN.pm line 3947
Couldn't rename Win32-GUI-0.0.558 to /home/UserName/.cpan/build/Win32-GUI-0.0.558:
Permission denied at /usr/lib/perl5/5.8.5/CPAN.pm line 3948
となります

自分で消したファイルに文句言われても対処のし様が…
あきらめた方がいいのかとも思うのですが。
201187:04/12/08 15:25:56
>>189
す、すまねーorz

  @{$sth->{NAME}}

ここに入ってた
202デフォルトの名無しさん:04/12/08 18:52:18
いっぱいありすぎてどれかわからないです、すみません
あとUNIXとか、コマンドプロンプトとかもよくわかりません

教えて君ですっごい申し訳ないです
203デフォルトの名無しさん:04/12/08 18:55:13
連書きすみません
UNIXのコマンドラインと、プロンプトの二つがごっちゃになってました
204デフォルトの名無しさん:04/12/08 19:34:35
205デフォルトの名無しさん:04/12/08 23:49:52
とりあえずスレ違いというのだけは確かです。。。
206デフォルトの名無しさん:04/12/09 05:11:18
encodingの使い方がよく分かりません。
use encoding "shiftjis" ってやると、shiftjisでコーディングできるようになったとこまではよかったんですが、

opendir ( DIR, $dir );
my @files = readdir( DIR );
@target = grep {/漢字ファイル名/} @files;

ってやっても、望んだファイルが引っかかってくれません。

use open IO => ":encoding(utf8)";
use open ":std";
って入れても一緒でした。
use open IO => ":encoding(shiftjis)";
とすると
"\x{0088}" does not map to shiftjis at ...
みたいなエラーが山ほど出てきて駄目でした。
ちゃんとUNICODEで入ってきてるっぽいです…

やっぱり読み込むたびに手動でUNICODEに変換しなきゃ駄目なんでしょうか?
207デフォルトの名無しさん:04/12/09 06:16:57
LWPについての質問なのですが、
GETリクエストでリダイレクトが返ってきた時、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でやりたいです。
よろしくお願いします。
208デフォルトの名無しさん:04/12/09 08:55:58
>>207
LWP::UserAgentでrequests_redirectableを空にしとけばいいんでねーの?
試してはいないが。
209デフォルトの名無しさん:04/12/09 10:35:58
>>206
readdir は UTF-8 でなくて生でデータがはいってくるはず。そのままでは
SJIS 文字列にマッチしない(1バイトめと2バイトめがなきわかれになって
いることが length をとってみればわかる)ので、Encode::decode とかを
つかって変換してやればオッケー。

use encoding って一見便利なようにみえて動きがわかりづらいのがいやん。
210デフォルトの名無しさん:04/12/09 12:54:29
PerlのCGIの実行を、拡張子を.cgi以外で実行するにはどうしたらいいのでしょうか。
ヤフーなんかは、拡張子が無いようにも思われます。
どなたかご伝授下さい。
211デフォルトの名無しさん:04/12/09 13:23:33
>>210
スレ違い、使ってるWebサーバのスレに行け
212デフォルトの名無しさん:04/12/09 14:02:34
Perlのsort関数でローカル配列って使えないのでしょうか?
下記のサンプルソースで Before と After の内容が変わってしまいます・・・。
どなたかご存知な方、ご教授お願いします。

#!/usr/bin/perl

&aaa(0);
exit;

sub aaa {
local ($m) = @_;
local @ary,arys;

push @ary, $m;
@arys = sort(@ary);

if($m == 0){
print "Before:$arys[0]\n";
&aaa(1);
print "After:$arys[0]\n";
}

print "$arys[0]\n";
}
213デフォルトの名無しさん:04/12/09 14:45:47
イミフメ
214デフォルトの名無しさん:04/12/09 15:01:00
local (@ary,@arys);
215デフォルトの名無しさん:04/12/09 15:12:38
use strict 'subs'
で裸のワードを禁止にするべし。
216207:04/12/09 15:19:12
>>208
できました。
$ua = LWP::UserAgent->new;
@{ $ua->{'requests_redirectable'} } = ();
とし、後は$res->is_redirectでリダイレクトを調べ、$res->header('Location');で全部取得できました。

どうもありがとうございました。
217デフォルトの名無しさん:04/12/09 15:20:52
いまどき新しく書くなら常にuse strictでいいと思うけどな。
218デフォルトの名無しさん:04/12/09 15:51:48
>>214
thx!!!
219デフォルトの名無しさん:04/12/09 21:15:21
>>209
 readdirってopenと違って :encoding() で指定できないからだろうけどね。>use encodingで対応してない

220デフォルトの名無しさん:04/12/10 08:36:18
今更なんだが、>>133のソースを理解するにはどの単元を読めばいい?
[変数, 変数] っていう形が全然何を表しているのかわからん・・。
自分のレベル的にはまだオライリ−の『初めてのPerl』読んでる程度。
この本に載ってなかったらどの本のどこらへんを読めばいいのか教えてくれると激しく嬉しい・・・・。
221デフォルトの名無しさん:04/12/10 09:52:26
222デフォルトの名無しさん:04/12/10 10:17:59
Cygwin で Perl 使っています。
Tkをインスコしようとしたらコンパイルエラーで落ちます。
TK の作者 (Ing-Simmons師) は
http://groups-beta.google.com/group/comp.lang.perl.tk/browse_thread/thread/
454e0eaa6edebb97/ff475a9a5197ccc4?q=perl%2Ftk+cygwin+%22initializer+elem
ent+is+not+constant%22&_done=%2Fgroups%3Fhl%3Dja%26q%3Dperl%2Ftk+cygwi
n+%22initializer+element+is+not+constant%22%26&_doneTitle=Back+to+Search&
&d#ff475a9a5197ccc4
としてサジを投げています。
私は神になりたいです。根性でTkを脳みそコネコネコンパイルします。
223デフォルトの名無しさん:04/12/11 02:25:06
>>222
ActivePerlを入れてる私は、神ですか?
224206:04/12/11 03:16:59
>>209,216
いまさらですがencode,decode使うといけました。ありがd

perlって、読み込んだ文字列がdecode前か後か知ってる癖に、自動で変換とかしてくれないんですね…
これじゃencoding意味ないよ!ヽ(`Д´)ノ
225デフォルトの名無しさん:04/12/11 10:47:19
自動を嫌うのがPerlerです
226デフォルトの名無しさん:04/12/11 11:01:56
>>225
その根拠は?
$_には自動で値が入るし、数値と文字列の相互変換も自動。
そもそも面倒な作業―特にテキスト処理―を自動化するのにこそ、
向いている言語だと思うが違うか?
いや、CGI作るために使ってる香具師には関係無いか
227デフォルトの名無しさん:04/12/11 11:49:15
テキスト処理しか例に出せないのもアレだな
228デフォルトの名無しさん:04/12/11 13:01:13
特定の単語をそれを含むタグとともに削除したいのですが・・

==「使用上」という単語を含む<TD>〜</TD>までの文字列を削除したい==
  
<TD>・・</TD>
<TD>〜使用上〜</TD>
<TD></TD>
============================================================
・下記のパターンマッチを考えては見ましたが、
 文章内に T やD があるとマッチしてくれません。
<TD>[^(<TD>)]*使用上[^(</TD>)]*</TD>

<TD>〜特定の単語 との間に <TD> という文字列が存在しない、
という設定は可能でしょうか?
229デフォルトの名無しさん:04/12/11 13:16:47
s{<TD>.*?</TD>}{}isg;
230デフォルトの名無しさん:04/12/11 13:29:58
s{(<TD>.*?</TD>)}
{
index($1,'使用中')==-1?$1:''
}isge;

いまいちか・・・・
231デフォルトの名無しさん:04/12/11 13:34:02
>>228 >>229 >>230
ちゃんとした本読めよ。
ただのお遊びならかまわんが、仕事がらみじゃ即座にクビだぞ。
232230:04/12/11 13:40:47
>>231
プロフェッショナルな解答みせてくれよ
美しく、効率のいい解答を
233デフォルトの名無しさん:04/12/11 13:56:40
>>224
いやだって、decode前のencodingが分かんないから。
分かってればuse openとかで変えられるわけで。
(もっともuse openはグローバルじゃないのが困りモノだけど)

んで、ファイル名に関してはencodingを指定できる場所がない、と。
filenameとかのプラグマを作ってreaddirを上書きすればいいんじゃね?
234デフォルトの名無しさん:04/12/11 14:02:47
>>228
それは文字セット [ ] の使い方間違えてるだけだ

$reg = qr{ <TD> ((?!</TD>).)*? 使用上 .*? </TD> }isx;
$string =~ s/$reg//g;

正規表現、絞込みと再帰が使えたらなあ…
235デフォルトの名無しさん:04/12/11 15:01:38
>>234
Perl6の正規表現はすごいらしいよ
236デフォルトの名無しさん:04/12/11 15:09:33
ひとつの正規表現ですまそうとせず

s{<TD>.*?</TD>}{index($1,'使用上')? '': $1}g

あたりでどうだろうか

237デフォルトの名無しさん:04/12/11 15:11:08
ごめん、わかると思うけどeがぬけてら

s{<TD>.*?</TD>}{index($1,'使用上')? '': $1}ge

238デフォルトの名無しさん:04/12/11 15:24:41
<<229<<230<<234<<236
ありがとうございました。
<<231 
参考に使用している本を教えてくださいな。
<<235
更に正規表現が難しくなるのか・・
239デフォルトの名無しさん:04/12/11 15:44:23
>>238
レスアンカーくらいまともに打てないのかね?
240230:04/12/11 16:05:32
>>237
それじゃ、だめなんだって。
で、俺はプロのコードを待ってるんだけどね。念のだめ234もチェックしてみたけど違った。
241T女の竹田:04/12/11 16:53:53
>>228
s{(<TD>(.(?!<TD>))*?使用上.*?</TD>)}{}sgi
これでどうかな?
242デフォルトの名無しさん:04/12/11 17:14:13
今まで出てきたコードはどれも2バイトコードに
1バイトずれてマッチする問題の対策が入ってないな。

use utf8前提ならいいがそうでないなら厳密には
まずそう。3文字もあるとそうめったに偶然マッチ
することはないけどね(笑) たとえばEUCで1バイト
ずれると「藩兢」が含まれるがこんな文字列は今
はじめてみたので実用上どの程度まずいかは疑問。
「使用上」の部分が固定文字列じゃなくてどっか
からもらうならちゃんとしなくちゃだけどね。
243デフォルトの名無しさん:04/12/11 17:14:32
>>237
カッコが抜けている
indexの見つからなかったときの戻り値は$[-1

s{(<TD>.*?</TD>)}{index($1,'使用上')>=0? '': $1}ge

244デフォルトの名無しさん:04/12/11 17:19:38
>>243
ひょっとして$&を知らないのか?
245デフォルトの名無しさん:04/12/11 17:25:17
>>244
$&使うといらないとこでもマッチ結果を保存するようになるから
あきらかにそこしか正規表現がないような使い捨てスクリプトじゃ
ない限りなるべく使わない。

246デフォルトの名無しさん:04/12/11 20:16:19
うわ、 $`, $&, $' 使う奴ってホントにいるんだね。
ただのお遊びならかまわんが、仕事がらみじゃ即座にクビだぞ。
247デフォルトの名無しさん:04/12/11 21:38:47
>>242
漏れはてっきり、タグ中の"使用中"も拾っちゃうとか、再帰的なタグが処理できないとか
そういう部分のこと言ってるんだとおもってたよ

プロののくせに、その今更な子供みたいな文句はなんだorz
…大丈夫だよ。ぼくちゃんが心配しなくても、みんな最初にどうにかしてるから
248デフォルトの名無しさん:04/12/11 22:53:56
再帰的なタグをとかなんとかいうともはや正規表現お手軽
コースじゃつらいんじゃないかね。HTMLのパースしてくれる
モジュール使ったほうがいいと思われ。
249デフォルトの名無しさん:04/12/11 23:03:37
文字列から、カタカナ+漢字を抜き出そうとして

@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メモ」の全角カタカナ、漢字にマッチするものです
250デフォルトの名無しさん:04/12/11 23:16:53
$back ='(?: 〜 )';
としたらうまくいきましたorz
スマソ...
251デフォルトの名無しさん:04/12/11 23:17:40
漢字とかよくわからんけど
先読み (?= ... ) 使えばいいんじゃないか?

/ なんかマッチさせたい文字列 (?= 後ろの文字 ) /x
252250:04/12/11 23:18:48
>>251
うおおお
すみません
ありがとうございますた・゚・(ノД`)・゚・
253デフォルトの名無しさん:04/12/12 05:56:29
perlのデバッガにreadline使ったヒストリ機能欲しいな〜
254デフォルトの名無しさん:04/12/12 08:50:04
Tk使って、getOpenFileやchooseDirectoryのウィンドウだけ出したいんですが、
MainWindowが余分に出ちゃいます。

MainWindowを出さずにすませるか、見えなくする方法ってないでしょうか?
255_gunzip:04/12/12 11:55:20
>>254
MainWindowを作って隠す、という方法が手っ取り早いかな。

#!/usr/bin/env perl

use Tk;

my $mw = new MainWindow();
$mw->withdraw();
my $target = $mw->getOpenFile();

#以降不要なら$mw->destroy();
256デフォルトの名無しさん:04/12/12 13:57:37
ある処理をして、その結果をクッキー出力してからHTML出力しなければなりません。
仕方がないので、HTML出力するものを文字列として$mojiに保存して、
クッキー出力後に、
print"$moji";
をしています。
結果としては正しい物が出力されるのですが、普通はこのようなやり方をするのでしょうか?
また、この方法だとprintf出力ができません。
何かいい方法は無いでしょうか。
257デフォルトの名無しさん:04/12/12 14:14:41
>>256
まず>>1をゆっくり"声に出して"読め
258253:04/12/12 15:46:53
Term::ReadKey,Term::ReadLine
の二つのパッケージを入れて

$PERLDB_OPTS="ReadLine=t" perl -d -e foo.pl
これでヒストリ機能が使えるようになりました。一応報告まで。
259デフォルトの名無しさん:04/12/12 17:31:15
>>253
readline 先にインスコしてから Perl インスコすれば最初から使えるんじゃなかったっけ?
他のツールでもハマることが多いので、
漏れは OS インスコ後真っ先に入れるもののリストに readline を入れてる。
260デフォルトの名無しさん:04/12/12 19:49:14
use strinct;
use warnings;
foreach my $bar (@list) {
 next if (-M $bar < 0); #★
 print "$bar\n";
}
と書くと、Use of uninitialized value in numeric lt (<) at ★の行
とワーニングが出まくるんですが、これは何が原因でしょう?
@listにはあるディレクトリのファイルリストが入っています。
$barが初期化されてないって意味だと思うのですが、printできてるので
ファイルリストは取得できています。Perlのバージョンは5.8.5です。
よろしくお願いします。
261254:04/12/12 19:50:36
>>255
>MainWindowを作って隠す、という方法が手っ取り早いかな。
>my $target = $mw->getOpenFile();

>#以降不要なら$mw->destroy();

これだと、
my $target = $mw->getOpenFile();
の時点で、getOpenFileが終了するまで実行止まっちゃっちゃうので、
getOpenFileダイアログ出てる間はMainWindowも出てしまいます…

できれば、最初からgetOpenFileダイアログだけを出すようにしたいです。

262254:04/12/12 19:56:32
>>255
とか思ってたら$mw->withdraw();が抜けてました。
これ入れたらいけました。有難うございます。

早とちりしてスミマセンorz
263デフォルトの名無しさん:04/12/12 19:56:59
>getOpenFileが終了するまで実行止まっちゃっちゃうので、
止まらなきゃ困るだろ。
>getOpenFileダイアログ出てる間はMainWindowも出てしまいます…
でねーよ
264263:04/12/12 19:57:30
ぐふっ
265デフォルトの名無しさん:04/12/12 20:14:24
>>260
その-Mってのはなんの目的で入ってるの?
266デフォルトの名無しさん:04/12/12 20:33:31
>>260
たぶんカレントディレクトリがファイルリストつくったところとちがうので-Mがundef返してるんだろ。
ディレクトリ補ってフルパスにするか適切にchdirすれ
267デフォルトの名無しさん:04/12/12 20:38:21
>>265
こう書くと更新日時がプロセス起動より新しいファイルを弾けるんじゃないですか?

>>266
やってみます
268デフォルトの名無しさん:04/12/12 20:40:55
>>223
私はあえてcygwinで動かしたいのです。
269デフォルトの名無しさん:04/12/13 03:01:32
変態だな
さすがPerllスレ
270デフォルトの名無しさん:04/12/13 08:14:24
Programming Perl 4thはいつでますか?5.10と一緒に発売ですか?
271デフォルトの名無しさん:04/12/13 09:58:24
たまに、関数で

hoge_func($) {
hogehoge;
}

とか、

piyo_func($;$) {
piyopiyo;
}

関数名のあとの、($)とか($;$)ってどういう意味があるのですか?
272デフォルトの名無しさん:04/12/13 10:19:32
273デフォルトの名無しさん:04/12/13 10:54:09
>>272
いきなり Google の URL 示さなくても "Perl のプロトタイプだYO!" って言えばいいのに。
とりあえず>>271はラクダ本を買えってこった。
274デフォルトの名無しさん:04/12/13 11:29:58
3巻組になったりしてね。
275デフォルトの名無しさん:04/12/13 11:45:56
>>221 で紹介されてたとこ、閉鎖されてる?

ついこないだまでは繋がったのに、、、。
276デフォルトの名無しさん:04/12/13 12:31:17
>>275
普通に見えるが?
277デフォルトの名無しさん:04/12/13 13:11:56
テキスト編集をするためにPerlを少しかじったのですが、面白くなってもっと知りたいと思いました。
今まではネットでPerlを紹介しているページで勉強していたのですが、本気で勉強しようと思ったら、
オライリーの本を買って勉強したほうがいいのでしょうか?
今ちょうど手元に『初めてのPerl』があるのですが、最初のスカラーデータから読み直したほうがいいですか?
オライリーのPerl本は色々あるんですね。

初めてのPerl (続)
Perlクックブック
プログラミングPerl

色々ありますが、どのような順番で勉強していけばキチンと身につけられますか?
それともオライリー以外のほかの書籍で『これは読んどけ』って言うのがあったら教えてください。
278デフォルトの名無しさん:04/12/13 13:15:25
やりたいことがあったらその都度
プログラミングPerlで勉強していくのが一番いいと思うよ。
279デフォルトの名無しさん:04/12/13 13:17:12
>>277
初めてのPerlは頭から熟読するべし
その次に読むとしたら 続・初めての かな
クックブックは、まだ要らないと思う
プログラミングPerlは、金が余ってるなら買ってもいいけど
お布施みたいなもんだから、金が無いなら買わなくていい

オライリー以外なら、EffectivePerlあたりがコストパフォーマンスが良くてオススメ
初めてのPerl読み終わったら買うといい。
280デフォルトの名無しさん:04/12/13 17:26:11
電子メールのFrom:ヘッダから、メールアドレスと表示名を取り出したいんですが、
スマートな正規表現があったら教えていただけませんでしょうか。
想定するFrom:ヘッダとしては
(1) aiueo <[email protected]>
(2) [email protected]
(3) [email protected] (aiueo)
くらいでよいと思うのですが。("aiueo"が表示名のつもりです)

とりあえず(1)からアドレスと取り出す方法として
if ($from =~ /<(.+@.+)>/)
{
print "$1\n";
}
というのを作ったんですが、他の形式にも対応させようとして、いろいろやったんですけど
うまくいきませんでした。(初心者で申し訳ありません)
281デフォルトの名無しさん:04/12/13 18:10:51
Perl/Tk を Cygwin で動かす問題について、いくつかやってみた結果を曝します。
まずはふつうにパッケージを解凍して、
$perl Makefile.PL
$make
すると、pTkサブディレクトリで氏ぬから、pTk/Makefile の DEFINE = に -DWINUSERAPI="" を追加して
pTk サブディレクトリについて make を続行する。
つぎに、
pTk/mTk/xlib/X11/Xlib.h の 1206 行を
#include <pTk/tkIntXlibDecls_f.h> に変更してから Xlib サブディレクトリを make する。
Event/tclPlatEvent.c の1行目の下に #include <sys/time.h> を挿入する。
Event/tclPlatNotfy.c の33行目の下に #include <pTk/mTk/unix/tkUnixPort.h> を挿入する。
pTk/mTk/unix/tkUnixPort.hを
l.42 #include <pTk/compat/limits.h>
l.62 #include <pTk/Lang.h>
l.89 #include <pTk/compat/unistd.h>
に変更する。
そのうえで Event/ サブディレクトリを make する。
JPEG/ サブディレクトリに移る。
makeするとJPEG.cのコンパイルで氏ぬので
make JPEG.i で JPEG.iを生成してから
typedef struct HWND__{int i;}*void *;

typedef struct HWND__{int i;}*HWND;
になおす。変更したJPEG.iを手でコンパイルしたらmakeを続行する。
PNG/ サブディレクトリも同様の手順でmakeする。
こまったのは Canvas, Entry, ListBox, Menubutton, Scale, Text の各ディレクトリのmakeである。
こいつらをmakeしようとするとlinkの段階で氏ぬ。
ぉιぇτ、工□い人
282デフォルトの名無しさん:04/12/13 18:13:54
>>280
きちんとやるなら素直に Mail::Header つかうのが吉。
283デフォルトの名無しさん:04/12/13 18:47:09
Mail::Header、自分のPCに入っていたんで、perldocでマニュアル見てみたんですけど、
あまりよく分かりませんでした。
getメソッドが使えるのかな。
Fromヘッダの内容は、変数に入れてあるんですけど、
new Mail::Headerには、標準入力か、ファイルディスクリプタ?しか
渡せないんですかね。(ファイルからの入力しかできない?)
すこし試してみます。。
284デフォルトの名無しさん:04/12/13 19:46:43
>>277
>>279

意外と、『クックブック』は早めに手に入れておいた方がいいと思うな。

というのも、『初めて』『続・初めて』と進んできて、
一番問題になるのは、リファレンスとオブジェクトの理解だと思うんだわ。

特に、『続・初めて』だけだと、オブジェクト指向のあたりは、
理解は難しいと思う。

自分の場合、
『続・初めて』で分からないとき、同じ項目を『クックブック』で引いてみると、
ああ、なるほどと分かることが多かった。

基礎部分は、『初めて』『続・初めて』『クックブック』だけでいいと思う。

あとは、なにをするかによって、専門分野のを選ばないと。
CGI なのか DBI なのか、それ以外のなにかなのか…
285デフォルトの名無しさん:04/12/13 19:52:38
>>283
ごめん、おもいっきり誤読してた。
Email::Address がそれっぽい。
286デフォルトの名無しさん:04/12/14 00:21:55
プログラミングPerlとEffective Perl持ってない奴は偽者
287デフォルトの名無しさん:04/12/14 01:08:30
>>285さん
できました!ありがとうございます。
<code>
use Mail::Address;
my @addrs = Mail::Address->parse($from);
foreach my $addr (@addrs)
{
print $addr->address,"\n";
print $addr->comment,"\n";
print $addr->name,"\n";
}
</code>
288デフォルトの名無しさん:04/12/14 02:46:32
偽者だからなんやねん
289277:04/12/14 07:53:23
質問に答えてくださった皆さん、どうもありがとうございます。
とりあえず、

@初めてのPerl
  ↓
A続・初めてのPerl (⇔プログラミングPerl⇔クックブック ⇔ EffectivePerl)
  ↓
BプログラミングPerl ⇔ クックブック ⇔ EffectivePerl

というような順番で読んでいけばいいのでしょうか。
ここまでがDBIとか専門分野に進んでいく『一般教養』と考えていいのですか?
大学の授業に例えるならこんな感じかな、と思ったのですが・・・。
290デフォルトの名無しさん:04/12/14 09:03:56
あのさ、
プログラミング言語なんてのは使ってなんぼのもんなので
覚えるためのもんじゃないんで、
どこまで覚えりゃいいなんてものはないし
覚えると誉めてくれる人なんていないわけ。

いいたかないが、かまって君なら板違い。
仮眠前に覗くんじゃなかったわ。
291デフォルトの名無しさん:04/12/14 09:16:59
DA----YO----NE--------------!!!!!!!
292デフォルトの名無しさん:04/12/14 09:40:23
>>290
もまえもその程度の事でストレス溜めてどうするよ
どうせネタなんだからスルーしる
293デフォルトの名無しさん:04/12/14 09:53:01
本なんか無くてもネット上に転がっている情報だけで
十分すぎると思うんだが…
294デフォルトの名無しさん:04/12/14 11:23:34
>テキスト編集をするためにPerlを少しかじったのですが、面白くなってもっと知りたいと思いました。
>今まではネットでPerlを紹介しているページで勉強していたのですが、本気で勉強しようと思ったら、
>オライリーの本を買って勉強したほうがいいのでしょうか?
>今ちょうど手元に『初めてのPerl』があるのですが、最初のスカラーデータから読み直したほうがいいですか?

みんな親切だね
295デフォルトの名無しさん:04/12/14 11:39:26
とりあえず「初めてのPerl」読め、次の話はそれからだ。

>>293-294
中途半端で間違った知識付けて、下らない質問されるよりは
真っ当な道教えておいた方がいいだろ
296デフォルトの名無しさん:04/12/14 12:06:15
真っ当な道って・・・
297デフォルトの名無しさん:04/12/14 12:06:15
私が思うに、

初めてのPerl 続・初めてのPerl クックブック

くらいまでが、一般教養。
(ここまでやって、ようやく構造化とか、リファレンスとか、
 オブジェクトの触りくらいまでは、分かるようになる)

DBIやらなにやらの専門分野はそのあと。

プログラミングperl なんかも、ここらあたりになると
持っているべきと思う。
(ここまで来ないと、理解できる本じゃない)

perlのいいところは、すべて知らなくても、
それなりに使えるというとこ。

ただ、きちんと学べば、もっと楽しく使えるよ。
298デフォルトの名無しさん:04/12/14 12:07:32
あぁ、全部 >>277 の自演に見えてきた
299デフォルトの名無しさん:04/12/14 12:09:13
>>297
そこら辺りまで行くと、ラクダ本じゃなく perldocで十分じゃないか?
300デフォルトの名無しさん:04/12/14 12:11:20
>>298
本の宣伝してるんだろうよ。
301デフォルトの名無しさん:04/12/14 12:40:58
>>300
こいつ、バカ?
オライリーがこんなとこで宣伝するかよ!
302デフォルトの名無しさん:04/12/14 13:27:29
ティムが降臨するスレ
kent読んでおかしい所判るようになりゃいいんでねの?
304デフォルトの名無しさん:04/12/14 15:56:38
>>303
kentのサイトは、ちらとしか見たことないが…。

いや、だからね、perlのいいところは、そこそこしか知らんでも、
とりあえずなんとかなるというとこ。

リファレンス使えない奴はダメだ、とかいい始めると、
それはいかにも perl らしくない。

だけど、そういうことを知ってると、それはそれで、
とってもいいこといっぱいあるよ、ということ。

どこまで必要かは、自分で考えりゃいい。
305デフォルトの名無しさん:04/12/14 16:55:57
オブジェクトのパッケージ名が標準モジュールのパッケージ名と
かぶらないようにするには、どういう規則で名前を付ければいいでしょうか?
306デフォルトの名無しさん:04/12/14 17:26:17
ぐぐってたらperlccっていうのがあるって書いてあって使ってみようと思ったんですが
色々見て回りましたがうまくいきません。
詳しく書いてあるサイトなど、何か情報はありませんか?
307デフォルトの名無しさん:04/12/14 17:32:02
gcc使ったことがあるなら普通に分りそうなもんだけど。
308デフォルトの名無しさん:04/12/14 20:00:45
電子メールのDate:ヘッダから、年月日、時分秒を取り出す
スマートな正規表現か
便利なモジュール等ありましたら
教えていただけませんでしょうか。

想定しているヘッダの書式は以下のような感じです。

Date: Sun, 02 Nov 2003 06:07:00
Date: Sun, 02 Nov 2003 06:07:00 GMT
Date: Sun, 02 Nov 2003 06:07:00 +0900
Date: Sun, 02 Nov 2003 07:07:00 +0900 (JST)

RFCの規定では、
曜日と秒は省略可、日にちは1桁でも可
だそうです。
秒が省略されたときは、無条件で0でいいと思っています。
309デフォルトの名無しさん:04/12/14 20:25:05
Mail::Header
310デフォルトの名無しさん:04/12/14 20:38:58
>>308
http://search.cpan.org/
ここをブックマークしとけ。
311デフォルトの名無しさん:04/12/14 20:47:58
>>305
CPAN等で公開しないんなら、アンダースコア(_)で始めればいいんじゃね?
312デフォルトの名無しさん:04/12/14 21:10:15
>>308
>>309
Mail::Headerだと丸ごと文字列として取り出すだけなんじゃ...
中身を解釈したければ、Mail::Fieldじゃねーの?

use Mail::Field;

$date_string = 'Date: Sun, 02 Nov 2003 07:07:00 +0900 (JST)';

$date_field = Mail::Field->new('date', $date_string);

$t = $date_field->time; # unix time

みたいな感じで。unix timeになったらあとはlocaltimeなり
strftimeなり自由に使えるはず。中身ちらっとみたらdate
文字列の解釈はDate::Parse呼んでるだけだったけどな。


313305:04/12/14 21:20:39
>>311
なるほど。それは盲点でした。
ありがとうございます。
314デフォルトの名無しさん:04/12/14 21:38:07
>>312さん
ありがとうございます。マジ助かります。
315デフォルトの名無しさん:04/12/14 22:00:50
ハッシュってなんでいろんな表記方法があるんですか?

$hash->{'abc'}

$hash{'abc'}

$hash{"abc"}

↑の違いは何かあるんですかねぇ・・・
統一してほしいんですが・・・
316デフォルトの名無しさん:04/12/14 22:03:01
haxa?
317デフォルトの名無しさん:04/12/14 22:10:02
違いはあるよ
318デフォルトの名無しさん:04/12/14 22:11:09
>>317
どういうふうに違うんですか?
319デフォルトの名無しさん:04/12/14 22:18:44
>>315
$hash->{...}と$hash{...}が同じだと思ってる段階でアウト。
perlの基本を勉強して出直して来い。

%hash = (a=>1);
$hash = {a=>2};

print "(1) $hash{'a'}\n";
print "(2) $hash->{'a'}\n";
320デフォルトの名無しさん:04/12/14 22:21:59
>>318
少なくとも、
$hash->{'abc'}
$hash{'abc'}
では、意味がぜんぜん違う。
前のは、リファレンスをデリファレンスする、
あるいは、メソッドの呼び出し ということになる。
321デフォルトの名無しさん:04/12/14 22:32:50
>>319
>>320
違うんだったんですね、同じものかとおもいました。
322デフォルトの名無しさん:04/12/14 23:22:05
それにしても腐った文法だな
323デフォルトの名無しさん:04/12/14 23:25:57
>>322
人格くさった奴は、rubyスレに帰れや。
松本に、いい性格をオブジェクト指向で生み出してもらうように
してもらえ。
それとも、perlでアタマをハッシュしてやろうか?
324デフォルトの名無しさん:04/12/14 23:34:18
>>322
うんとか、すんとか、なんか抜かせよ、ヴォケ。
んじゃ、ruby と クソ をbless してやるな。
メソッド、ケツ拭け!
325デフォルトの名無しさん:04/12/14 23:53:35
${hash}{abc}
326デフォルトの名無しさん:04/12/15 00:10:33
>>325
だから、そういうときは、 -> 使えって。
そして矢印を、デリファレンス とでも頭の中で読めばいい。
(メソッドの場合もある)

何々 => ○○ は、
何々 の値 ○○ とでも読めばいい。

[ ] が、やや唐突に出てきたら、
無名配列のリファレンスとでも、頭の中で読めばいいんだし、
{ } が、やや唐突に出てきたら、
無名ハッシュのリファレンスとでも、頭の中で読めばいいんだけだ。

ランダル・シュワルツの本とかを読んでも、
向うでもみんなそうしてるように書いてあるぞ。

記号に、意味を表す読みを与えれば、なにも難しくない。
327デフォルトの名無しさん:04/12/15 00:17:34
$hash{'abc'}
$hash{"abc"}
この二つを並べている事に関しては
文字列の基本をやり直せと言って置こうか
328デフォルトの名無しさん:04/12/15 00:19:43
$hash{'$abc'}
$hash{"$abc"}
だと結果が異なるし
329デフォルトの名無しさん:04/12/15 00:26:43
どちらにせよ滅多に使わないので
330デフォルトの名無しさん:04/12/15 01:41:44
だいたいでいいなら単純に
print "$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
331330:04/12/15 01:45:27
間違えてすごい古いのに回答した..(笑)
恥ずかしいので見なかったことにしてくれよ。
332デフォルトの名無しさん:04/12/15 02:31:21
何番へのレスだったのか一瞬考えてしまったじゃないか
333デフォルトの名無しさん:04/12/15 09:34:37
ある変数を読み出し専用にしたいのですがtie使わないと無理でしょうか?
my $hoge = 1;
nochange $hoge;
$hoge = 2 → エラー
みたいな感じです。
334デフォルトの名無しさん:04/12/15 10:01:40
>>333
Scalar::Readonly

ttp://search.cpan.org/~gozer/Scalar-Readonly-0.01/lib/Scalar/Readonly.pm

説明によるとXSでSvREADONLYフラグなるものをいじるらしいです。

perlだけで書こうとするとtieでSTOREをなんかするぐらいしか
オレも思いつかんな。
335デフォルトの名無しさん:04/12/15 11:40:30
*foo = \('string');
とかでいけないっけ?
336デフォルトの名無しさん:04/12/15 12:07:43
>>335
globつかうからmyで宣言した変数には使えないと思われ。
337333:04/12/15 12:25:39
皆さんありがとうございます。
結局Readonlyという物を利用する事にしました。
Scalar::Readonlyと比較すると
+ pure perl
+ array,hashにも使える
+ 変数に格納したリファレンスの変更も監視出来る
- パフォーマンスが劣る
- readonlyのon、offが出来ない
のような感じです。
中身見てみるとtieしてstoreをごにょごにょしてるだけですた。
338デフォルトの名無しさん:04/12/15 16:30:41
非公式な機能ではあるが、5.8.0からはSvREADONLYフラグをいじる関数が追加されているよ。

Internals::SvREADONLY($var, 1); # $varをREADONLYにする。
Perl/Tk を Cygwin で動かす問題の続き。

$ perl Makefile.PL
でやるのはあきらめた。

$ perl Makefile.PL x
だとうまく逝きそう。

make の前に
$ ln -s ./pTk/tkUnixDefault.h ./pTk/tkWinDefault.h
$ ln -s ./pTk/tkWinDefault.h tkWinDefault.h
する。
(これをやらないと、一部のcファイルが存在しない tkWinDefault.h を読もうとして氏ぬ)
$ make
最後の最後で tk.dll のリンクが失敗するので
-L/usr/X11/lib -lX11
のオプションを付けて手動でtk.dllをリンクするとうまく逝く。

後は万事よし。
このあたり、Makefile.PLとかで解決できないですか?
340デフォルトの名無しさん:04/12/15 18:00:43
名前がキモ杉
341デフォルトの名無しさん:04/12/15 19:03:08
結城浩?
342デフォルトの名無しさん:04/12/16 00:05:04
☆☆今からペットを虐めます 3匹目☆☆
http://hobby.2ch.net/test/read.cgi/dog/1066313320/854
343デフォルトの名無しさん:04/12/16 00:26:02
$hash->{"abc"} = 10

$hash{"abc"} = 10

とする場合の、
それぞれのメリットと
デリメットについて教えていただけないでしょうか?
344デフォルトの名無しさん:04/12/16 00:27:41
何も無い
何も無い
何も無い
345デフォルトの名無しさん:04/12/16 00:36:13
>>343
代入すること自体に両者のメリット、デメリットの差はまずないけど
($hash->{}はデリファレンスのコストがほーーんのちょっとかかるといえばかかるが)
沢山中身を詰めたハッシュをサブルーチンに渡す/返すときなんかはスピードに差が出ます。
ハッシュじゃなくても、普通のスカラーに1MBのテキストファイル入れて
参照渡しにするかコピー渡しにするか試してみると、かなり差が出るよ。
346デフォルトの名無しさん:04/12/16 04:53:21
普通、リファレンスは、

配列やハッシュやサブルーチンを入れるもんだと
思うよ。それで、配列の配列や、配列のハッシュ、
ハッシュのハッシュ、ハッシュのサブルーチン
とか作るんだよ。

メリットはいっぱいあって、簡単に書けないほど。

一例をあげれば、トリガーとなるキーワードを
ハッシュのキーとし、値の方にサブルーチンのリファレンスを
入れておけば、ケースによって振る舞いを変えられる。

Aというケースなら、これこれになになにするが、
Bというケースなら、しかじかになになにする。
しかし、Cというケースなら、こうでなくちゃならないし、
でも、Dというケースなら、なにもしちゃいけないし、
というようなとき。

AはサブルーチンAAを、BにはサブルーチンBBを、
CにはサブルーチンCCを…。

いちいちメリットを書いていったら、きりがない。
347デフォルトの名無しさん:04/12/16 10:27:41
だっせー
348デフォルトの名無しさん:04/12/16 12:08:47
$a{08}="aaa";
Illegal octal digit at - line 1, at end of line

$a{09}="aaa";
Illegal octal digit at - line 1, at end of line

$a{07}="aaa";
普通に通る

$a{10}="aaa";
普通に通る


どうも08と09に限ってエラーが出るんですけど、なんででしょうか?
349デフォルトの名無しさん:04/12/16 12:13:38
>>348
釣りか?
350デフォルトの名無しさん:04/12/16 12:20:23
>>349
もしかして根本的に間違えてる?
351デフォルトの名無しさん:04/12/16 12:22:50
このていどの英語もよめないのか。
352デフォルトの名無しさん:04/12/16 12:23:23
>>348
>Illegal octal digit at - line 1, at end of line
英語が読めませんか?
353デフォルトの名無しさん:04/12/16 12:26:47
$a{0xg}="aaa";
これはなんでエラーになるんでしょうかね?
perlにおいて0から始まるリテラルは8進数とみなされます。
ラクダ本のリテラルの項目をよく読んでみてください。
354デフォルトの名無しさん:04/12/16 12:31:25
すまん、まさかハッシュ名が8進数として認識されてるなんて思わなかった。
355デフォルトの名無しさん:04/12/16 12:32:27
>>353
すいません、今調べて判りました。
みなさんホントにごめんなさい。
356デフォルトの名無しさん:04/12/16 12:37:49
>>355
あんたに限った話じゃないが、中学生英語程度のメッセージなのに何で読もうとしないんだい?
357デフォルトの名無しさん:04/12/16 13:23:18
ていうかperldiag(1)で調べろよ。日本語訳もあるんだしさ。
358デフォルトの名無しさん:04/12/16 13:48:23
>>356
英語ってだけで拒否反応おこしてんだろう。
359デフォルトの名無しさん:04/12/16 14:11:00
>>358
んなこと言ったら、コンピュータ言語自体に拒否反応でちゃうと思うんだが。

つーか、一般的にこういう人はかなりの割合でいるんだろうか?
それとも、特異な人だけが、掲示板やMLでこの手の質問するんで目立つんだろうか?
前者だとしたら、メッセージを日本語にするいいかげんなパッチでも作ったら
需要あんのかな?とか
360デフォルトの名無しさん:04/12/16 14:23:52
>>359
出力メッセージのエンコーディングやらロケールやらで、
混乱する要素がひとつ増えるだけの悪寒。
361デフォルトの名無しさん:04/12/16 14:32:47
CGIから正規表現を受け取ってマッチに与えたいのですが、
セキュリティ上何に気をつけたらいいですか?
とりあえず、taintモードで、use re 'eval'は宣言してません。
362デフォルトの名無しさん:04/12/16 14:51:30
ありゃ、スレ違いっすか・・スマソ
363デフォルトの名無しさん:04/12/16 15:31:26
>Illegal octal digit at - line 1, at end of line
少なくとも中学では習わん
364デフォルトの名無しさん:04/12/16 15:53:32
こんなところにもゆとり教育の弊害が!
365デフォルトの名無しさん:04/12/16 16:10:25
>>363
文法は中学レベルだろ。
中学で辞書の引き方を習わなかった、とかなら仕方ないが。
366デフォルトの名無しさん:04/12/16 19:31:31
エラーメッセージなんて見当違いのことのが多いし
あてにならん情報読むために四苦八苦するなんて面倒だろう。

このメッセージの場合、行末がどうとか書いてあるっぽくてでも行末はちゃんとしてるから
その地点で読むのやめる。

百歩譲って読んでみたとして、octalがわからないし、8進数も知らないから
Illegal digit at - line1, at end of line
となって、違法数字atがline1,行末だといわれても何のことやらわからんのですよ
367デフォルトの名無しさん:04/12/16 19:55:39
>>366
こじつけもいいとこ(´д`;)何で前から読まないんだ
368デフォルトの名無しさん:04/12/16 20:14:42
まあ八進数知らなきゃわけわからんだろうけど。
エラーメッセージ当てにならないってことはないし、
人に聞くくらいならあるだけの情報は吟味しとかないと。

何度もミスってればそのうちメッセージしっかり読まなくても
その字づらだけでどういうバグか程度は分かるようになるから。
むくれずガンガレ。
369デフォルトの名無しさん:04/12/16 20:21:55
質問です。
出力先を画面とファイルと同時に出力させることは出来ますか?
例:
$logfile = './log/log.txt';
$log='レポート結果';
open(LOG,'>> ' . $logfile);
print LOG $log; #ファイルに出力
close(LOG);
print $log; #画面に出力

みたいに二回同じ物をprintせずに一度で済む方法はありますでしょうか?
370デフォルトの名無しさん:04/12/16 20:24:44
tee 使え
371デフォルトの名無しさん:04/12/16 21:06:28
372デフォルトの名無しさん:04/12/16 21:57:12
BASIC全盛期のガキの頃は、俺も、エラーメッセージってのは意味で理解しなくて、経験で覚えたな…。

|run
|Illegal Function Call in line 40
|OK
|■
|list 40
:
373デフォルトの名無しさん:04/12/16 22:09:26
ttp://www.att.or.jp/perl/man/perldiag.1.html より:

Illegal octal digit
(F) 8 進数で 8 か 9 を使いました。

これでもわからん奴はどうしましょうね(笑)

374デフォルトの名無しさん:04/12/16 22:20:22
8進数ネタはもういいよ。8進数も理解できない奴は池沼、
それを喜んで叩いてるやつも池沼。くだらんからスルーしろ。
375デフォルトの名無しさん:04/12/17 10:38:05
厨房の英語レベルの俺が翻訳します
>Illegal octal digit at - line 1, at end of line
Illegal llegal(合法な)の否定形 非合法な
octal 八角形の
digit 数字
at -line1 1行目で
at end of line 行の最後で

総合的に訳すrと
1行目の最後に不正な八進数があります

か?
376369:04/12/17 12:53:17
>>370-371
ありがとうございました。
そこでまた古い話をぶり返すんだよな。
0 は 8 進 数  な ん で す か?
378デフォルトの名無しさん:04/12/17 14:17:16
>>377
Perlでは0が頭にあれば8進数として認識するんだが?
だからこの問題が起きてる。
ついてきてない奴はだまっとけ
379デフォルトの名無しさん:04/12/17 14:18:15
OSを入れて最初にインストールする10のアプリは何?
http://pc5.2ch.net/test/read.cgi/unix/1083993713/58

58 :神の愛の証言者 ◆IHSXPiND6Q [sage] :04/07/07 12:52
less
sshd
vim
最新のカーネル
ncftp
380デフォルトの名無しさん:04/12/17 14:25:10
Perl-Tkはどうしたの?結城浩くん。
381デフォルトの名無しさん:04/12/17 14:32:03
>>380
いくらなんでも結城浩に失礼だからやめれ
382デフォルトの名無しさん:04/12/17 16:58:40
自分のマシンのApacheではちゃんと動くCGIプログラムが
ISWEBのサーバー500エラーを返します
Perlのパスや設定はきちんと合わせたんですが何故でしょうか?
383デフォルトの名無しさん:04/12/17 17:07:31
CGIはWebProg板で聞けって事がわかってないから。
384デフォルトの名無しさん:04/12/17 19:01:06
ナイス
385デフォルトの名無しさん:04/12/17 19:27:54
サブルーチンの返り値として配列とハッシュを返すようにしたいのですが、どのようにすればいいですか?
386デフォルトの名無しさん:04/12/17 19:34:42

func(\@array_real, \%hash_real);


sub func{ my ($array,$hash) = @_; $array->[foo] = ... ; $hash->{bar} = ... ; }

とかしてリファレンス使ったら?



387デフォルトの名無しさん:04/12/17 20:40:12
そりゃ返り値じゃなくて引数じゃないっすか?
388デフォルトの名無しさん:04/12/17 20:47:25
アホすぎ
389デフォルトの名無しさん:04/12/17 20:53:22
sub foo {
return \%hash, \@array;
}

じゃ駄目なの?
390385:04/12/17 21:38:30
>>386, >>389
うまくいきました。ありがとうございました。
391デフォルトの名無しさん:04/12/18 10:55:53
rand関数は、数字しかランダムにできないようエスが、
5つの英文字をランダムに表示することは、できないのでしょうか。
392デフォルトの名無しさん:04/12/18 11:12:39
配列でも使うよろし。
393デフォルトの名無しさん:04/12/18 11:15:38
質問します
あるファイルの入出力で、レコードフォーマットがよくかわるので
そのたびに、プログラム修正が大変です。他の言語ならば、入出力はマクロ化などをしますが
perlの場合は、全てのレコードを読んで独自の判断をする場合がほとんどなので、マクロ化
がしにくいです。例えば下記のようなロジックが数十箇所にあるとすると、splitで分ける文が
レコードフォーマットが変わるたびに全てへんこうになって大変です。
このようなばあい、どのようにして共通化するのでしょうか?、


foreach $num (0 .. $#STOCK) {
$line = $line2 = $STOCK[$num];
&jcode'convert(\$line,'euc');
($DATE,$ID,$BID,$NAME,$EMAIL,$PREF,$SEX,$AGE,$PASS,$COM,$LNGCOM,$BLD,$JOB,$HEIT,$STR,$ACC_MODE_TMP,$PLZX,$BSID) = split(/<>/,$line);
394デフォルトの名無しさん:04/12/18 11:25:21
PERLで書いてあるHTML2LATEXっていう
コードがあるのだけど
これWindows上でもまともに動きますか?

あと図面や文献環境などややこしいのは全部
スキップしてくれても良いので、簡単な
コードありませんか?
395デフォルトの名無しさん:04/12/18 12:12:40
>>393
行の書式がちがっても各要素の書式さえ同じなら正規表現ですんなり行くが、そういうわけでもないのか?
396デフォルトの名無しさん:04/12/18 12:15:33
>>395

そのとおりです、書式さえあえば動きます
しかし、共通化できれば一箇所の修正でいいのですが、
数十箇所も毎回修正するので大変なんです
397デフォルトの名無しさん:04/12/18 12:25:50
いやいや、<>に挟まれた各要素がどのように記述されているか。
たとえば$DATEの部分が
20041218とか12月18日とかが混じってるようならダメだけど、
そうでないなら、($DATE,$ID ...が($ID,$DATE ...みたいな順になっていても
各要素を正規表現で取り出せるんじゃないか?という話。
ちがうならもっと偉い人の降臨待て。
398デフォルトの名無しさん:04/12/18 12:30:29
>>393
いや、Perlでも入出力をモジュールにすればいいだろ?
なんで他言語で出来てPerlで出来ないと思うんだろ。

サンプルをみる限り、Perlをまともに知らないだけか……。
foreachで$#とか使ってるし、
いまさらjcode.pl使ってるみたいだし。
399デフォルトの名無しさん:04/12/18 12:34:45
>>391

# $randWord =randWord($length[,@cara]);
sub randWord($;@){
my$l =abs(int(shift));
return unless$l;
my@c =( @_ ? @_ : 'a'..'z','A'..'Z',0..9 );
join('', map{ $c[int(rand($#c)+0.5)] }1..$l );
}

print randWord(5), "\n";
400デフォルトの名無しさん:04/12/18 12:40:43
>>397

要素が増えたりするので修正がかかるんですー
正規表現で取り出すって意味が、厨房でわかりますえん すまそ

>>398

モジュール化は簡単にできるけど、
どのレコードを読み込むか?(キーの要素が毎回変わる 条件も複数)
このレコードを読み込んだらループを抜ける

上記のように、DBのようにキーが固定されているわけでもなく、
検索条件も a=b && c ne d 等と毎回変わるので 共通モジュール化は
できないと思ってます
401デフォルトの名無しさん:04/12/18 12:44:30
じゃあなんで他言語でできるの?
同じことすればいいでしょ。
402デフォルトの名無しさん:04/12/18 12:49:28
スカラー変数に展開しないでハッシュ変数に入れればいいんじゃねーの?
そしたらレコードフォーマットが変わってもその後の処理に問題ないっしょ。
403デフォルトの名無しさん:04/12/18 12:58:57
中途半端にJAVAはかじりましたが、て感じか。
<>で区切ってあるだけまだましなんだが。
404デフォルトの名無しさん:04/12/18 13:03:32
>>402
thx子 やってみます
405デフォルトの名無しさん:04/12/18 13:38:42
>>391
my @char = ('a'..'z');
print $char[ rand @char ];

>>393
my @field = qw(DATE ID BID NAME EMAIL);
for my $line (@STOCK) {
  my %field;
  @field{@field} = split /<>/, $line;
  ...
406393:04/12/18 15:42:42
>>405

@field{@field} なんてできるんだ!
special thanks ko!
407デフォルトの名無しさん:04/12/18 17:19:03
encodingが使いにくすぎる。
readdirも、関数への引数も、コマンドラインの引数すらも、標準入力扱いじゃないから自動変換してくれない

open(IN,"ファイル")じゃ動かなくて、open(IN,encoding("shiftjis","ファイル名"))。
print shift; もだめ。あほか。

jcode.plで正規表現使うときだけ変換して騙し騙し動いてたのが、
encodingにしてからコード中encode,decodeだらけになっちまった
どうすりゃいいんだ
408デフォルトの名無しさん:04/12/18 17:21:30
未だに encoding なんか使ってるのお前だけだよ(ガハハ
409デフォルトの名無しさん:04/12/18 17:48:05
use encoding "shiftjis";
じゃだめなのか?
410デフォルトの名無しさん:04/12/18 18:23:47
>>407
まったくその通りだよな。
5.8 で use encoding の1行を入れればJperl と同様に動く、
なんてウソッパチもいいところだ。
オレ、いまだに昔のJperl が手放せないよ。
411デフォルトの名無しさん:04/12/18 19:03:29
>>410
時代に取り残されてますね。
可哀相に・・・
412デフォルトの名無しさん:04/12/18 19:03:31
しょぼいな
413デフォルトの名無しさん:04/12/18 19:21:23
>>408-411
おまいら、信じてないだろ…つかencoding使ったこと自体ないだろ?
宣伝文句聞きかじった知識だけでバカにしやがって畜生くそ(略

実験.pl
use encoding "shiftjis";
print shift;
open(IN,"実験.pl") or die;

これだけだ
>実験.pl あいうえお
encoding付けたのと外したので、試してみろよ
414デフォルトの名無しさん:04/12/18 20:08:14
日本語のファイル名なんて使うなよ……

とか思わなくもないケド、
openのラッパ書けばいいじゃん。>encodeだらけ
なんで書かないの?

415デフォルトの名無しさん:04/12/18 20:16:45
>>413
encoding付けたのと外したので、試してみろよ

これで試してみるとさ、
use encoding "shiftjis";
の時は、確かに

Died at 実験.pl line 3.
"\x{0082}" does not map to shiftjis.
"\x{00a0}" does not map to shiftjis.
"\x{0082}" does not map to shiftjis.
"\x{0082}" does not map to shiftjis.
"\x{00a4}" does not map to shiftjis.
"\x{0082}" does not map to shiftjis.
"\x{00a6}" does not map to shiftjis.
"\x{0082}" does not map to shiftjis.
\x{0082}\x{00a0}\x{0082}¢\x{0082}\x{00a4}\x{0082}\x{00a6}\x{0082}¨

となるけど、

use encoding "shiftjis";
の一行を取り去ってやってみると、正常に動作するよ。
これじゃ、ダメなの?
416デフォルトの名無しさん:04/12/18 20:33:10
>>415
話が理解できてないなら首突っ込まなければいいのに・・・
417デフォルトの名無しさん:04/12/18 20:42:24
>>416
いやいや、その通りなんだが、
やっぱり話がまったく見えない、のも気持ち悪いだろ。

で、いったい何が問題なの?
413 においてさ、要は、引数の あいうえお がプリント文で、
出ればいいんじゃないの?

うちでは、use encoding "shiftjis"; の一行を取り除いたら、
あいうえお 出ましたという話で…。

そういう話じゃないの? 誰か分かるように説明してん。
418デフォルトの名無しさん:04/12/18 20:59:29
$a=1
require './config.cgi';

としてて、config.cgi の中で$a を参照するのですが、参照できないみたいです
どうやって値を引き継げばよいでしょうか?
419デフォルトの名無しさん:04/12/18 21:05:12
$'a
420410:04/12/18 21:23:07
>>413
ほー。そうかい、そうかい。キミのパソコンではUTF-8 で「実験.pl」
という名前のファイルを作れるわけだな。それじゃ、そのUTF-8 の
「実験.pl」の中身を出力してごらんよ。当然、これでできるはずだよな。

use encoding "shiftjis";
print shift;
open(IN,"実験.pl") or die;
while(<IN>){
print;
}
close(IN);
421デフォルトの名無しさん:04/12/18 21:47:54
うーん。
とりあえず小飼弾の赤いPerl本でも読んだほうがいいと思うよ。
422デフォルトの名無しさん:04/12/18 21:51:05
>>420
あのー、413へのコメントとなってるけど、
もしかして僕へなの? (それとも、自意識過剰???)

僕へだったら、うちのはシフトjisだよ。サクラエディタで確認した。

やってみたけど、
ウチでは、実験.plの中に use encoding "shiftjis";
があると、3行目でこける。
それがないやつは、なにも出力されない。

勘違いしないでほしいけど、僕は別にケンカを売ってるわけじゃないよ。
よく分からないままに言わせてもらえば、君が考えてるより、
perlはもっと早い段階でutfに変換してると思う。
423422:04/12/18 21:52:16
ああ、ごめん、422は415、417でもあります。
424デフォルトの名無しさん:04/12/18 22:03:09
encoding 周りのインターフェイスが直感的でなく
既にバッドノウハウの湧き処になっている感はあるがな…。
まぁとりあえずコレでもじっくり読め。
http://www.kt.rim.or.jp/~kbk/perl-5.8/
425413:04/12/18 22:47:54
>>420
だから動かんっていってるだろ。試してみろっていったのに試さずにしかも間違ってる反論すな

ひょっとして、use open ":encoding(..)"とか,use open ":std"しとけ!!っていいたいのか?
そしたら413のコードも何もかもうまくいくとおもってるのか。あさはかな。
426デフォルトの名無しさん:04/12/18 23:03:30
jencodingを使って後ろ向きに解決。
427デフォルトの名無しさん:04/12/19 00:04:46
かわいそうに
428デフォルトの名無しさん:04/12/19 00:49:21
今時Jperlて。
429422,:04/12/19 01:59:32
で、結局、
use encoding "shiftjis";
結論としてどうなるわけ?
誰か、まとめてよ。
僕が思うに、
一部の人が言う use encoding "shiftjis";
の問題は、確かに確認できるけど、
perl5.8がutf-8で内部的に統一して扱っているなら、
実際問題、なにも問題ないと思うんだけど。
perlは、読み込んだ時点もすでにすべてutf-8に変換してる。
それじゃまずいケースって、具体的にどんなとき?
430デフォルトの名無しさん:04/12/19 04:06:24
もういいだろがキモイって。
>perl5.8がutf-8で内部的に統一して扱っているなら、
>実際問題、なにも問題ないと思うんだけど。
そう思ってりゃいいよ。
431デフォルトの名無しさん:04/12/19 07:27:53
encodingもtclみたいに使いやすくなればいいのに
432422:04/12/19 10:38:11
>>430
また、投げやりなんだなぁ。
実際には、perl5.8がutf-8で内部的に統一して扱っていないって、
いうこと???
しかし、簡単に試す限り、utf-8で内部的に統一して扱っていると思えるけどなぁ。
それに、もしutf-8で内部的に統一して扱っていること自体が問題というなら、
ことはperlのみならず、たとえばjavaやら他言語も含めた大問題となる。
あー、わけわか。まあ、どうでもいいという結論で。
433デフォルトの名無しさん:04/12/19 12:35:11
>>432
perlは文字列をutf-8と み な す だけで、変換もなんにもしてくれません
そんでencodingとか色々オプションをくっつけて、
いろんな文字コードをutf-8っぽい内部形式に、正しく変換して読み込むように設定してるわけだが。
それが使いにくいって話。穴が山ほどあって、変換前の文字列が入ってくる機会が多いから困ってる。
434デフォルトの名無しさん:04/12/19 12:37:52
結局utf8使わないのがいちばん楽なような気がする(笑)

435デフォルトの名無しさん:04/12/19 13:07:12
すいません
imagemagickの使い方
日本語で説明してるページとかありませんか
>>433
穴があるというがutf8でスクリプト組めばええ話でねーのか?
eucでスクリプト組むのと同じ感覚で使ってるし、苦労したことないな。
437デフォルトの名無しさん:04/12/19 13:16:11
>>436
池沼なエディタつかってるんだよ、たぶん。
438435:04/12/19 13:22:12
ありますた。
439デフォルトの名無しさん:04/12/19 13:26:04
>>438
一言礼ぐらい言えよ。
440デフォルトの名無しさん:04/12/19 13:39:50
だれにですか
441デフォルトの名無しさん:04/12/19 13:54:20
442デフォルトの名無しさん:04/12/19 14:29:11
443デフォルトの名無しさん:04/12/19 14:51:24
>>442
笑いをありがとう
444デフォルトの名無しさん:04/12/19 16:35:36
ラクダ本に書かれている内容は、perldocに全て載っているんでしょうか?
ラクダ本は読みすぎてぼろくなってきたので、そろそろ捨てようかなと思ってます。
445デフォルトの名無しさん:04/12/19 17:19:16
>>443
一言礼ぐらい言えよ。
446デフォルトの名無しさん:04/12/19 17:23:30
>>445
「ありがとう」って言ってんじゃん
447& ◆QWv3R1XL8M :04/12/19 17:59:33
Perlの静的解析ツール知りませんか?
448デフォルトの名無しさん:04/12/19 18:17:13
>>432
>ことはperlのみならず、たとえばjavaやら他言語も含めた大問題となる。
そのとおりだが。特にjavaやってる人は誰でも文字コードに振り回された経験があるだろう。
449448:04/12/19 18:19:29
あ、俺が言ってるのはUnicodeと他の文字コードのマッピングの話ね。
450デフォルトの名無しさん:04/12/19 22:13:13
>>447
Perlを厳密に静的解析することはできない。
動的に解析しないと "a << b"という一文さえ、左シフト演算子なのかヒアドキュメントなのかわからないからだ。
451デフォルトの名無しさん:04/12/19 22:50:46
>>450
それじゃコンパイルできないじゃん
452デフォルトの名無しさん:04/12/19 23:46:48
なんで型付けするのを作者は嫌がってるんだろう?
453デフォルトの名無しさん:04/12/20 00:05:17
>>452
なんで型づけせにゃならんのだよ。
そんなもんは、本来機械の側がやるべきことを、
人間にやらせてるだけだろ。
俺の友達は、Cの型を覚えるだけで
一生を終えてしまったぞ。
454デフォルトの名無しさん:04/12/20 00:07:38
unit testさえしっかりやってりゃ型なんかいらんかも、という気はする。
455デフォルトの名無しさん:04/12/20 00:28:10
よく知らないけど、
アセンブラとかマシン語には型はあるの?
456デフォルトの名無しさん:04/12/20 00:36:09
>>455
MASMでは型と言えるかは知らんが、レジスタとかで区別があるものもある。
457455:04/12/20 00:42:18
>>456
ほう。とすると別にハードウェア的にはlongとかunsigned charとかを
理解しているわけではなくて、コンパイラが勝手に作ったルールみたいな
ものなわけですか?
458デフォルトの名無しさん:04/12/20 00:57:58
なんで型付けされないのをコーダーは嫌がってるんだろう?
459デフォルトの名無しさん:04/12/20 01:00:27
>>457
それより君は、型がないと何か困ることでもあるの???
460457:04/12/20 01:06:37
>>459
ないよ。私も型いらない派です。
(455 = 457 != 452)
461460:04/12/20 01:11:54
それより、ハッシュの要素を自動生成された場合に
アラートかなんか出すオプションが欲しいなと思うことはときどきあるね。
まあ、クラス化すれば勝手に変なもん突っ込むことはないんだろうけれど。
462デフォルトの名無しさん:04/12/20 02:55:44
型づけじゃないけど、perlで型づけに近いものと言えば、
-w の警告モードと、use strict っていうことになるのかな。
(みんな、せめて -w は使おう!)
それで十分っていうか、Cの型はやりすぎなんじゃないの?
Pythonなんかでも、インデント変えただけでプログラムが
動かなくなるとか聞くが、それもちょっとなぁ。
463デフォルトの名無しさん:04/12/20 05:49:15
なんですかこの変な流れは・・・
464デフォルトの名無しさん:04/12/20 08:34:22
読み出すときだけ別の型に変換してくれりゃいい。何でも書き込める必要なんてあるか?
間違えて変なもの入れちゃうほうがずっといや

結局ユーザは型を意識してプログラミングしなきゃいけないのに、
コードのどこにも型が書いてないからかえって管理しにくい
465デフォルトの名無しさん:04/12/20 09:03:08
Perlが可読性を損なうくらいまで省略に拘るのは
-eオプションでさくっと処理を多用するおいらみたいなユーザーを
未だ見捨てる気がないからだべさ。
前もあったが、言語仕様を用途を抜きで語るのは不毛。
PHPがタグだらけで不格好だと騒ぐようなもんだ。
オブジェクト指向マンセーならRubyでも使ってれ。
466デフォルトの名無しさん:04/12/20 09:14:42
use strictは使ってるけど-w使うといっぱい警告でちまう。
超A型君は更にTaintモードも併用してるんだろうか。
467デフォルトの名無しさん:04/12/20 09:38:01
>>466
Taintモードはstrictやwarningsとは全く意味が違う。
Taintモードが有益なのは「環境変数や引数などに信頼できないデータが含まれている可能性があるとき」だよ。

因みに老婆心ながらwarningsモードも慣れれば非常に有益。
個人的には、コーディングスタイルを変えてでも警告ゼロを目指すね。
どうしても譲れない時はno warningsを使うし。
468デフォルトの名無しさん:04/12/20 10:59:04
モジュールが使用できるかどうかを内部でテストし、そのモジュールが使用できればそのモジュールで実行。
そのモジュールが使用できない場合は別のモジュールをテストし……というプログラムを作りたいのですが、
それは可能でしょうか?
できるならばどのような方法がありますでしょうか?

やりたい事は、Encode.pm > NKF.pm > Jcode.pm の優先順位で使用できるモジュールで日本語変換をしたいのです。
469デフォルトの名無しさん:04/12/20 11:05:03
「使用できるかどうか」っていうのが微妙な表現になってるような
気がするけど、 「Encode.pmがあるかどうか」でいいなら、
@INCの中身を順に調べていけばいいんじゃない。
ファイルがあっても使えないっていうケースがあるのかどうかしらんけど。
470デフォルトの名無しさん:04/12/20 11:06:49
evalで調べてるが、もっといい方法あったら俺も知りたい。
471468:04/12/20 11:19:50
>>469
あぁ、ごめんなさい。
あるかどうかで充分です。
なるほど、そういう方法がありますね。

>>470
どのようにevalを使用しておりますか?
いろいろ試行錯誤しているのですが、上手くいかないです orz
472468:04/12/20 11:25:25
あぁ、すみません何とか形になりました。
eval 'use Encode';した後に$@に何か入っていれば次にeval 'use NKF';とやって、
$@が空であれば、そのモジュールで処理すれば良いのですね。
とりあえずこれでやってみます。
ありがとうございました。
473デフォルトの名無しさん:04/12/20 23:00:50
use Attributeの
my $date : INTEGER(1..31) の範囲制限できるところとかは便利そうだと思う。
使ったことないけど。
474デフォルトの名無しさん:04/12/21 13:38:23
(use Encode) or (use NKF) or (use Jcode);
475デフォルトの名無しさん:04/12/21 14:00:39
あちゃー、それでよかったんすね。馬鹿だ折れ
ごっつあんです。
476デフォルトの名無しさん:04/12/21 14:21:45
"use" not allowed in expression at - line 1, at end of line
syntax error at - line 1, near "(use Encode"
"use" not allowed in expression at - line 1, at end of line
"use" not allowed in expression at - line 1, at end of line
Execution of - aborted due to compilation errors.
477デフォルトの名無しさん:04/12/21 14:41:07
useはBEGIN内にあるのと同じ扱いなので、、
eval { use ... } もうまくいかないんだよね。
文字列引数で eval 'use ...'にしないと。
ただしこの場合、実行順序がuseを裸で書いた
場合と異なるので、importされる関数や定数を
呼ぶときにカッコの省略ができなくなったり
結構不便です。(コンパイル時に間に合わなく
なるから)

たとえば

use Fcntl qw(:flock);
print LOCK_EX;



eval 'use Fcntl qw(:flock);';
print LOCK_EX;

は結果が違います。LOCK_EX()と書いてやればいいといえばいい
のですが、定数にカッコつけるのはみっともない。

BEGIN {
eval { require Fcntl; };
if ($@) { エラー処理 } else { import Fcntl qw(:flock); }
}

とかするのがいいかも?
478デフォルトの名無しさん:04/12/21 14:46:48
考えすぎだな。eval 'use ...'をBEGINのなかでやりゃいいか。

BEGIN {
eval 'use Encode;';
if ($@) {
eval 'use NKF;';
if ($@) {
eval 'use Jcode;';
if ($@) { die }
}
}
}
479デフォルトの名無しさん:04/12/21 16:31:42
自分自身のファイル名を取得するにはどうしたらいいですか?
あと、文字列の中から特定の文字数だけ取得するのは
どうすればいいですか?(substringみたいな関数)
480デフォルトの名無しさん:04/12/21 17:12:35
>>479
> 自分自身のファイル名を取得するにはどうしたらいいですか?
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
481デフォルトの名無しさん:04/12/21 18:01:54
>>479
> 自分自身のファイル名を…
>>480の通りなのだが、$0だとパスまで引いてしまう。
パスを除いた形で取得したいのであれば`basename $0`を使うと幸せになれるかも知れない。
勿論、basenameが使えればの話だが。

482デフォルトの名無しさん:04/12/21 18:06:05
>>480-481
ありがとうございます。
483デフォルトの名無しさん:04/12/21 18:13:39
basenameが使えなければ
(File::Spec->splitpath($0))[2]
とか
484デフォルトの名無しさん:04/12/21 20:47:02
utf8フラグがついてないASCIIの範囲外の文字列が、
utf8フラグが付いている文字と連結するときに、
勝手にLatin1と解釈されてutf8な文字列にされちゃうわけですが、
これをLatin1じゃなくする方法ってないんでしょーかね。

utf8フラグがついてない0x80-0xffな文字列を見つけたときの処理方法を
ユーザーが指定できればちょっとウマーな気がするんだけど。
485デフォルトの名無しさん:04/12/22 10:25:16
File::Basename使えよ
486483:04/12/22 11:04:14
>>485
・・・素で存在に気づかなかった。
自分でももっと簡潔にならないかなーなんて思いながら書いてたorz
漏れの目は節穴です。ありがとう
use File::Basename;
print basename($0);
簡潔ー
487デフォルトの名無しさん:04/12/22 13:33:47
ある文字列の中から、適合する文字列をDBから抽出したいです。
分かりやすく書きますと

検索文字列:XXXAAAXBBBXXXXCCCXX

これを検索させて、適合する文字列である
AAA
BBB
CCC

を抽出したいのですが、こんな事って出来ますか?
文字列は、文節がどこで区切られるか分かりませんので、全体を一文として検索を行いたいのです。
488デフォルトの名無しさん:04/12/22 13:53:37
>>487
「適合する」がよくわからんのだけど、
辞書みたいなものがあって、ある文字列の中でその辞書に含まれる単語を抽出したい、
ということ?
489デフォルトの名無しさん:04/12/22 14:31:42
>>487
あったかどうかのチェックなのか?
検索文字列:XXXAAAXBBBXXXXCCCXAAAX
の時に
AAA
BBB
CCC
AAA
でいいのか?

全体を一文としていいのなら
@LINES = ($tmp =~ /(AAA|BBB|CCC)/g);
とか
490デフォルトの名無しさん:04/12/22 14:45:33
検索する文字が配列@DICに入っているのなら、
@LINES = map{ $tmp =~ /$_/g } @DIC;
っていう書き方もあるぽ。
491デフォルトの名無しさん:04/12/22 17:44:30
フォームを作って100バイトでデータを入力して送信しても
$ENV{'CONTENT_LENGTH'}が100バイト以上になるんですけどどうしてですか?
この入力したフォームのデータの正確なバイト数を調べるにはどうしたらいいんですか?
492487:04/12/22 18:05:07
>>488-490
返事が遅くなりました、すみません。
レスありがとうございました。
>>488氏の仰るとおり、つまりは辞書のようなものです。

DBには1000件ほどあります。
これを>>490のように配列@DICに流し込んで、検索文字列$LINESを置換するというのは
あまり効率的ではないかなと思い、質問させていただいています。
493デフォルトの名無しさん:04/12/22 18:17:05
>>491
フォームってCGI?
CGIに関しては板違い
フォームで送って送られるのではデータだけじゃない。

>>492
$LINESを置換しているわけではなく、検索にHITした物が@LINESに格納されるわけだが。
そもそも配列@DICに流し込んで…じゃなく、
前提条件として「検索する文字が配列@DICに入っているのなら」としたわけだ。
で、>>489がスルーされているのだが、複数HITする物があった場合はどうするのだ?
HITした数だけ結果として必要なのか、それともHITするものが一つでもあるかどうかだけのチェックでいいのか?

49454:04/12/22 18:18:35
一挙に配列に読み込むのは効率がよいのだが、悪いと
言ってるとこみるとメモリを気にしてるのか?
1000行で各行何バイトくらい?
仮に100バイトだとすると、たった10万バイト。
それを読み込めないメモリなら増設汁。
もちろん一行ずつ読み込んで処理する、もある。
495デフォルトの名無しさん:04/12/23 00:51:44
偶然にも今日逆引きなんとかというのでbasenameというのを知ったんだけど
それまでは
($path, $script) = $0 =~ /^(.*(?:\/|\\))?(.*)$/;
ってやってました。
上の方法とbasename使うのとで一長一短とかありますか?
496デフォルトの名無しさん:04/12/23 01:41:59
読みやすさ
497デフォルトの名無しさん:04/12/23 01:55:52
MacやVMSとかにも対応してるとか
拡張子も除去できるとか(指定した場合)
498デフォルトの名無しさん:04/12/23 15:42:19
ファイルから1バイトずつデータを読み込んで
0x13でEXORをとって書き出すプログラムを書きたいのですが
Perlではどうしたらいいのでしょうか?
↓こんな感じでうまくいかない
for($i = 0; $i < 10; $i++){
     sysread(DATA, $data, 1);
     push @string, $data;
}
for($i = 0; $i < 10; $i++){
     $ch = $string[$i] ^ 0x13;
     print $ch;
}
__DATA__
abcdefghijklmn
499デフォルトの名無しさん:04/12/23 19:25:04
配列に入れるんならunpack("A*",$_)とかしたほうがよくね?
500デフォルトの名無しさん:04/12/23 19:42:17
>>498
print map chr(ord ^ 0x13), unpack 'A' x length, $_ while read DATA, $_, 1024;
501498:04/12/23 23:34:43
>>499,>>500さん ありがとうございます。
Perlに不慣れなもので助かりました。
map, chr/ord, pack/unpackを勉強できました。
502デフォルトの名無しさん:04/12/24 03:06:38
use encoding "shift-jis";
@filenames = glob ("./あ*.*");
print "@filenames";

ファイル名が日本語のものを、globで拾いたいんですが、上のスクリプト
だと拾ってくれません(@filenamesが空になります)。
use encodingを削ると拾ってくれるんですが、use encodingは別の用で
いるもので。
お知恵をお貸し頂きたく。
503デフォルトの名無しさん:04/12/24 03:56:45
>>502
>>407-
504デフォルトの名無しさん:04/12/24 10:50:59
perlのunicodeまわりってつくづく半端だな...
505デフォルトの名無しさん:04/12/24 11:04:20
CPANからEncordをインストールしていたら以下のエラーが出て止まります。
OSはVine3です。

PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/Aliases........ok
t/jperl..........Unrecognized character \xCD at t/jperl.t line 89.
# Looks like your test died before it could output anything.
t/jperl..........dubious
Test returned status 22 (wstat 5632, 0x1600)
ちなみに以下はjperl.tの89行目付近です。

{
use encoding "euc-jp", Filter=>1;
ok(1, "Filter on");
use utf8;
no strict 'vars'; # fools
# doesn't work w/ "my" as of this writing.
# because of buggy strict.pm and utf8.pm
our $人 = 2; #89行目


エラーを解消する方法を伝授してください。
506デフォルトの名無しさん:04/12/24 13:26:26
Encordってなんですか
507デフォルトの名無しさん:04/12/24 15:22:09
>>504
それもそうだが、
欧米人にこの現状を理解してもらおうと思ったら、
なぜにeucとsift-Jisがあって、しかも
どうしてとっととutfに移れないのかを説明せねばならず、
説明してる間に、
結局、問題の多くがむしろこちら側にこそあるのだと、
気づかされるオチになるのではないかと、小一時間…。
少なくとも、sift-Jisは余計であったよなぁ。
508デフォルトの名無しさん:04/12/24 15:29:15
オレは変換表さえ統一されたら移ってもいいと思っている。
永遠にその日は来ないだろうが。

509デフォルトの名無しさん:04/12/24 16:05:06
>>505
解決方法は判らないが、エラーの出ている\xCDは半角カナのヘ
その89行目を見ると人っていう字があるが、それはEUCかな?
EUCの人という字は\xBF\xCDなので、その人という字が原因かと思われ。
510デフォルトの名無しさん:04/12/24 16:23:57
でも直前で

use encoding "euc-jp", Filter=>1;

してるんだから、EUCからUnicodeに変換されてるはず
だよな。それがうまくいってないのはなんでだ?

511505:04/12/24 16:26:47
>>506
Encodeでした。ごめんなさい。orz

>>509
指摘されたとおりだと思いましたので、何でも良いかな?と思いjperl.tに3回記述されていた「人」を「年」と書き直したところすんなりとインストールできました。何か不具合があるかもしれませんが、そのときに考えようと思います。
ありがとうございました。
512デフォルトの名無しさん:04/12/24 18:39:46
とりあえず
http://www.debian.or.jp/~kubota/mojibake/
を外人には読んでもらえ。
513デフォルトの名無しさん:04/12/24 18:56:33
>>507
Perl の開発体制を良く知らないのですが、Encode の外人の開発者さんたちは、
そういう問題を理解しようとも思わないひとたちばかりなのでしょうか?
514デフォルトの名無しさん:04/12/24 19:11:09
つーか、私が思うに、なんとか頑張って、こっちが
utf-8 に移行するのが先だと思うんだよな。
問題は、もしろ日本側の方にこそあると思う。
ユニコードに移行する道筋できてるのか?
ていうか、出来てないよね???
perlコードはutf-8に変換しておく、というルールはダメなのか?
ちなみに、うちのサクラエディタは、ユニコードはバッチリだが、
ファイル名がshift-jisじゃないと、開けないらしい。ハァー。
515デフォルトの名無しさん:04/12/24 19:12:16
% perl -we 'use strict; my $s = "foo"; print "$1\n" if ($s =~ /foo(o)?/);'
Use of uninitialized value in concatenation (.) or string at -e line 1.

この warning ってあまり有用なものではないように思うのですが、
これを抑制するのに良い方法が何かあれば教えて下さい。
516デフォルトの名無しさん:04/12/24 20:27:56
>>515
no warnings qw(void);
517デフォルトの名無しさん:04/12/24 20:34:20
>>515
perl -we 'use strict; my $s = "foo"; my$x = undef;print "$1\n" if ($s =~ /foo(o)?/ and $x = $1);'
518デフォルトの名無しさん:04/12/24 20:42:25
>>515
$1に対応するカッコが使われなかったのに文字列の中で参照しようと
してるのを警告してくれてるんだから十分意味があるだろ。

516の言うようにno warning使ってもいいが、わざわざ-wつけるほど
慎重にプログラミングする主義なら、書き方を工夫して出ないように
するのが本筋だと思われ。一番簡単な書き換えは多分(o)?を(o?)に
することだろうが、お前の意図としてそれでいいかどうかはオレには
わからん。


519デフォルトの名無しさん:04/12/24 21:02:52
>>518
なるほど、そうですね。
例えば >>517 さんのように $1 をキチンと検査してから使うべきですね。
520デフォルトの名無しさん:04/12/24 23:11:24
>>514
うん、Unicodeに合わせて日本語変えなきゃね。
521デフォルトの名無しさん:04/12/24 23:31:15
Perlで構造体のリストを扱いたい場合ってどうするのですか?

C++でいうところの、

struct Hage{
int a;
int b;
}

std::vector<Hage>

みたいなかんじのことをやりたいのですが・・・
522デフォルトの名無しさん:04/12/24 23:35:16
my $hage_obj = { a => 1, b => 2 };
push (@hage_list, $hage_obj);
523デフォルトの名無しさん:04/12/24 23:43:24
>>522
さんくす。
524デフォルトの名無しさん:04/12/25 01:39:44
>>513
encoding作ってるのは日本人だよ。
つーか、あんたらどういう実装なら文句言わんのか、
一度整理してみなよ。
525デフォルトの名無しさん:04/12/25 01:50:10
>>524
つまり、日本語の文字コードの変換なしにすべて正常に動作すること。
それには、日本語がすべてデフォルトでutfに乗っている必要がある
ということ。
だから、そのためには、すべてのosが次期バージョンから
eucとs-Jisのサポートを即刻やめ、
utf以外は文字化けするようにしてもらいたいと、
どこかの力のある団体が期限を限って勧告する。以上。
つーか、書いてて自分で笑ったが…。
しかし、でないと100年経っても変わりそうもない。
526デフォルトの名無しさん:04/12/25 03:29:28
Perlを「パール」と読むのは分かるんですが、真珠の「パール」と同じアクセントでいいんでしょうか?
真珠の「パール」だと「パ」にアクセントがある感じですが、「Perl」の場合はアクセントをおかずに
平板に読む人もいるような気がします…。(身の回りの若干名ですが)どっちが正しい or 多数派
なのでしょう?
527デフォルトの名無しさん:04/12/25 04:08:45
>>526
平板に読むのは職業病
528デフォルトの名無しさん:04/12/25 07:30:54
専門家アクセントってやつだね。
529デフォルトの名無しさん:04/12/25 09:13:21
>>525
その力のある団体というのが存在しないのが問題だよね。
M$がつぶれでもしない限りもう統一は無理だと思うし(笑)。

変換表が複数ある問題あたりさえ解決すれば日本語だけ
ならunicodeにのせてもそう困らなくはなっていると
思う。変換表問題についても、従来全角英字と半角英字
が混在しても検索で適当に同一視する機能なんかが整備
されてなんとかなってたように、たとえば「〜」のU+FF5E
とU+301Cが適当に同一視されるような環境が整備されて
そのうちなんとかなるのかな。Jcodeのような定番モジュール
の登場を期待したい。


530デフォルトの名無しさん:04/12/25 09:15:49
バールと同じアクセントってこと?
専門家はRubyやcurlも?まさかCも?
531デフォルトの名無しさん:04/12/25 09:45:13
通じればいいとか思いません?
532526:04/12/25 10:38:44
平板なアクセントというのは、まさに 「バール」と同じアクセントです!
専門家向けには「バール」で、一般の人向けには真珠の方でしょうかね?

通じれば最低限の目的は果たせるんですけど、日本人なので(?)、
みんなはどう発音しているのか気になって・・・。
533デフォルトの名無しさん:04/12/25 12:11:36
よろしければ、皆様のお力添えを期待します。

↓スレの129です。
Perlでリクに答えるスクリプトを作るスレ
http://pc5.2ch.net/test/read.cgi/tech/1086143976/l50

マルチまがいで、すいません。
534513:04/12/25 12:14:02
>>524
クレジット見る限り、全部が全部 Kogai さんが書いてるわけじゃないですよね?
>>507 で「欧米人にこの現状を理解してもらおうと思ったら」とあったので、
Kogai さん以外はそんなに理解の無いひとたちばかりなのかと思いました。

Encode 自体の実装については、
現在のように Perl 外の制約条件がこれだけ酷い状況下においては、
まあまあの線を行ってるんじゃないかと思ってはいます。
文句が言いたいのは Perl じゃなくて別にあるわけですが、スレ違いなのでやめます。
535デフォルトの名無しさん:04/12/25 14:50:04
>>533
そのスクリプト計算結果間違ってない・・・?
とりあえず書いたやつのテストで結果つき合わせてみてるんだけど、
5,3,5,1とか与えた場合明らかにおかしいような・・・
atan2の引数のx,y間違えてないかな

それと、時計回り、反時計回りというのがよくわからない。
紙の上で考えた限りでは、半径の正負をひっくり返した場合と
等価に見えるんだけどそれであってる?
536デフォルトの名無しさん:04/12/25 15:22:50
もうひとつ、「時計回り」を定義するには上下が必要なわけだけれど、
y軸は上下どっちをプラスにしたいのかな
数学的なグラフなら上がプラスだし、
画面座標的なものなら下がプラスにもなる。
537デフォルトの名無しさん:04/12/25 17:17:29
>>532
原語の話だと、Pearlと同じ発音だとラリー・ウォールがどっかに書いてたんだが、
見つけられない...

日本語だと規定はないんだろうけど、おれは真珠のパールと同じく、「パ」に
アクセント付けてるね。「バール」と同じなんて気持ち悪い。

RubyもCurlも頭にアクセント付けてるなあ。
538533:04/12/25 17:33:40
>>535
まずは、レスと試して下さった事に感謝します。ありがと。
欲を云いますと、あちらのスレでレスして頂けたらさらに嬉しかったです。
マルチ決定>私。ぐすん。もちろん、一言書き加えなかった私が悪いです。
あちらには、謝っておきました。

> そのスクリプト計算結果間違ってない・・・?
あまり自信はありませんが、一応実用化してますので極端に
間違ってはいないと思います。ポイントは最初の点からみた
距離で、絶対座標ではないとこです。

> それと、時計回り、反時計回りというのがよくわからない。
x軸は右を、y軸は上をプラスと考えています。数学的なグラフです。

> 紙の上で考えた限りでは、半径の正負をひっくり返した場合と
> 等価に見えるんだけどそれであってる?
はい。
ある二点を結ぶ円弧は半円で無い限り、4種類存在します。
例えば、x軸上に2点をおき半円でない円弧で結ぶ時、
中心がx軸上の上に来るものと、下に来るものです。
またそれぞれに半円以下の円弧と半円を越える円弧があります。
4種の円弧を決定するため、半径の正負と廻り方を使ってますが、
このスクリプトで決定される中心点は2点(または存在しない)のうちの
どちらかだけです。サブルーチンして受け取る引数としては冗長ですが
他との関連上、そう致しました。
539デフォルトの名無しさん:04/12/25 17:51:22
>>537
「バール」と真珠の「パール」は同じアクセント。
540535:04/12/25 18:25:12
>>538
すみません、配慮が欠けておりました。

はじめの5,3,5,1は机上で下向きの座標系とつき合わせてた・・・
これはあってましたね。
が、5,-6,5,-1の場合、x0.101230, y4.998975の値が正しいような。
x4.899, y-1.001となって、これは遠方の値では・・・

仕様に関しては了解です。
541533:04/12/25 19:12:34
>>540
> すみません、配慮が欠けておりました。
とんでも、私こそ。

> 5,-6,5,-1の場合、x0.101230, y4.998975の値が正しいような。
> x4.899, y-1.001となって、これは遠方の値では・・・
おっしゃる通りです。orz
x0.101, y-4.999(yは負)が、得たいデータでした。
洗練化どころか、バグバグじゃないですか…私。
542デフォルトの名無しさん:04/12/25 19:29:19
>>539
そっちは日本語での発音の話だよ? バールのほうは平坦に発音しないか?
543デフォルトの名無しさん:04/12/25 19:44:25
もう発音の話はいいよ....
544535:04/12/25 20:42:50
>>541
計算ロジックから作り直したので別のバグが出てるかもですが

sub quest_arc_center($$$$) {
my($iX,$iY,$r,$ccw) =@_;

my $yrev = ($r * $ccw > 0) ? 1 : -1;
$r = abs($r);
die '半径0' unless( $r+0 );

my $length = sqrt($iX**2 + $iY**2);
die '半径が小さい' if( $r * 2 < $length );

my $rad = atan2($iX, $yrev * $iY) - acos2($r, $length / 2);
return map {sprintf("%.3f", $_)} ($r * sin($rad), $yrev * $r * cos($rad));
}

sub acos2($$) {
my ($c, $b) = @_;
atan2(sqrt($c**2 - $b**2), $b)
}

実質処理は27行->5行になりました。
545533:04/12/25 21:30:48
>>544
うわぁぁぁぁい、ヽ(⌒▽⌒)/
ありがとう! 神さま、いえサンタさん。

なんて、かっちょ良いコード!
ちゃんと 座標=sinθ,cosθになってる。
中心点の選択、角度計算、角度→座標の実質たったの3行ですよね?
acos2がさらって出てくるところとか、ホレちゃいそうですよ。
じつは、私もはじめはそのように挑戦したのですが、さんざん悩んで
角度の向きが判らなくなって、あえなく自爆。情けないですorz

もう一度、ほんとぉぉぉっっっに、ありがとうございました。
546デフォルトの名無しさん:04/12/25 21:30:52
なんか中学生か高校生ぐらいの数学の問題で
perlかどうかはどうでもいい気がするのだが
三角関数使わない別解。

(0,0)と(iX,iY)の間の距離lはsqrt(iX^2+iY^2)

(0,0)と(iX,iY)を結ぶ直線と円の中心との
距離hはsqrt(r^2 - (l/2)^2)

(0,0)と(iX,iY)を結ぶ直線の法線方向の単位
ベクトル(時計周り向き)は(-iY/l, iX/l)

円の中心は(0,0)と(iX,iY)を結ぶ直線の中点
から、(反時計,短)(時計,長)のときは上の
単位ベクトルの方向に、(反時計,長),(時計,短)
のときは逆方向にそれぞれ距離hだけずらした
ところにある。

s=(ccw*r>0)?1:-1とすると求める円の中心の
座標は

x = iX/2 + s*h*(-iY)/l
y = iY/2 + s*h*iX/l

あとはperlに落とすだけ。
547デフォルトの名無しさん:04/12/25 22:04:04
sub quest_arc_center($$$$) {
my($iX, $iY, $r, $ccw) = @_;

my $l = sqrt($iX*$iX + $iY*$iY);
my $h = sqrt($r*$r - $l*$l/4.0);

my $s = ($ccw*$r > 0.0)? 1.0: -1.0;

return ($iX/2.0 - $s*$h*$iY/$l, $iY/2.0 + $s*$h*$iX/$l);
}
548535:04/12/25 22:17:18
>>545
計算用紙二枚が丸だらけになりますた。

>>546-547
うゎ、そっちの方法も考えたのにどうして思いつかなかったんだろう・・・
無理だと思い込んで、図形的な変換を行って計算しちゃった
その変換のほうが処理速度も速いだろうし・・・
549533:04/12/25 23:00:29
うわぁ!サンタさんが、いっぱいだぁ。

>>546,547
ありがとうです。
三角関数を使用しないで中心点を求める所は、私の晒したバグコードと
同じですが、547さんのコードはバッチリ整理されていて比べものになり
ませんね。私の判定式なんて三角関数まで使って、しかもトチ狂ってるし。
詰めて書いてるのに、数値に小数点とゼロを付けて可読性をあげてらっしゃる
ので、とても見やすいです。出来る人は、センスが違うのですねぇ。
$iX*$iXを$iX**2としないのも、なにかこだわりを感じます。(もしかして
処理速度が、向上するのでしょうか?)
ご指導、ありがとうございました。m(_ _)m

>>535
長い時間、お付き合い頂い大変感謝です(TдT) アリガトウ
貴重なお時間を浪費させてしまい、申し訳ありませんでした。m(_ _)m


550デフォルトの名無しさん:04/12/26 00:02:33
>>549
なんだか、昔のN88 Basic かなんかみたいな話題だよね。
いいね、こういうの。
perlよ、N88 Basic を目指せ!ってね。
なんというか、実用一点張りというのではなくて、
もっとゲームとかにも気軽に使うという動きがあっても
いいと思うんだけどね。
551デフォルトの名無しさん:04/12/26 05:08:38
>>549
そういうお前は顔文字の入力に貴重な時間を浪費してると思わんのか。
まあいい。
552デフォルトの名無しさん:04/12/26 08:17:33
おまいさんもわざわざそれだけ言うために…
553デフォルトの名無しさん:04/12/26 13:07:29
で、数学出来ない子にクリスマス暇なヤツが付き合う時間は終わったか?

じゃあ、Perlの話題に戻るぞ
でも発音の話題は勘弁な
554デフォルトの名無しさん:04/12/26 15:25:18
すみません質問です。
ファイルを上書きでopenするときは、
open FH, ">> test.txt";
とするとできるのですが、
ファイルの後ろにシステム日付時刻を付けたいときは
(test-yyyymmddhhmm.txt)
どのようにすればよいのですか?
どなたかヒントだけでも教えていただけないでしょうか?
555デフォルトの名無しさん:04/12/26 15:45:16
POSIX::strftime

つーか上書きになってないよそれ。
556デフォルトの名無しさん:04/12/26 18:32:44
my $now = strftime "%Y%m%d%T", localtime;
open FH, ">> test$now.txt" ;
ではうまくファイルができないのですが、
どういうふうに書けばいいのですか?
557デフォルトの名無しさん:04/12/26 19:19:55
>>556
or die $^E でもつけれ。
558デフォルトの名無しさん:04/12/26 19:20:29
>>556
できた!!
559デフォルトの名無しさん:04/12/26 19:37:31
>>558
できた!じゃないだろ?まず、555さん(仮面ライダー?確変?)に
礼を云って、指摘された追記を上書きに直して、顛末を書きsageだ。ボケッ。
560デフォルトの名無しさん:04/12/26 21:06:11
$test = sub { $a = shift; printf("test $a\n"); };
こんな感じのsubのレファレンスの変数$testを
引数付きで実行するにはどうすればいいですか。
561560:04/12/26 21:08:51
自己解決しました。
&$test("OK");
でOKでした。
562デフォルトの名無しさん:04/12/26 21:11:58
内部でファイルをOPEN,READ,CLOSEしてるモジュールがあるとき、
そのモジュールを使っているスクリプトを
 perl -CDS hoge.pl
のように実行しても、-CDSがモジュール内部のI/Oに適用されず
読み込んだ文字列のutf8フラグが立ちません(ASCII文字以外でも)。
モジュールを書き換えないでその中のI/Oを:utf8にするには
どうしたらよいのでしょうか?
Perlは5.8.4で試しています。
563デフォルトの名無しさん:04/12/26 21:14:08
>>560
->()
じゃないのかえ?
定型以外、頭に入っとりませんが、なにか???
564563:04/12/26 21:21:52
ダメじゃ、ぼけとる。
つーか、てめえ、560、
とっとと配列かハッシュに入れてから、
デリファレンスの仕方、聞けー、
というより、逝ってきます >わし
565デフォルトの名無しさん:04/12/26 21:36:38
あるファイルにテキストで書かれたデータがあるとします
そこから ある文字列を検索してヒットした位置から
ある特定の文字("等)までを 複数行にわたって出力するCGIを作りたいのですが
どうやればいいのでしょうか?
566デフォルトの名無しさん:04/12/26 21:40:04
CGIかよ
567デフォルトの名無しさん:04/12/26 21:44:36
(´-`).。oO(ヒットしたらprintするだけじゃないのか)
568565:04/12/27 01:05:40
誰か書いて
569デフォルトの名無しさん:04/12/27 01:32:59
570560:04/12/27 13:36:21
>>563
$test->("OK");
でもいけました。ありがとうございました。
571デフォルトの名無しさん:04/12/27 18:25:30
Perlでテキストファイルの文字列を検索するときは普通どうするんですか?
572デフォルトの名無しさん:04/12/27 19:23:12
>>571
それはさすがに質問しすぎ。
573571:04/12/27 20:10:41
>>572
すいません
私は
open(IN, "file.txt");
@xx = <IN>;
foreach $yy (@xx) {
 if($yy =~ /hoge/){
  print $yy;
  }
}
close(IN);

とやっているのですが これはかなり負荷が高くなってしまうと思い
皆さんはどうしてるのかと思い質問させていただきました
すいませんがよろしくお願いします
574デフォルトの名無しさん:04/12/27 20:13:32
>>573
かまわんよそれで。鯖屋やってるわけじゃないんだろ。
575デフォルトの名無しさん:04/12/27 20:13:56
「負荷」って何のことかね
576571:04/12/27 20:19:05
>>574
ありがとうございます
できれば 皆さんはどうやってるのか教えていただきたいのですが・・

>>575
マシンパワーを食うということです
すいません
577デフォルトの名無しさん:04/12/27 20:31:57
>>576
「マシンパワー」って何の事かね
578デフォルトの名無しさん:04/12/27 20:58:51
>>576
状況次第。いいかげんうざいよ。
579デフォルトの名無しさん:04/12/27 21:02:27
文字列検索の例なんて調べりゃ出てくるだろうに。
580デフォルトの名無しさん:04/12/27 21:05:29
>>572
ただそれだけの処理ならこう
open(IN, "file.txt");
while (<IN>) {
 print $_ if /hoge/;
}
close(IN);

まあ自分が書くなら、ファイル開くにはIO::File使うけど
581580:04/12/27 21:07:24
レスアンカ間違えた・・・欝だ
582デフォルトの名無しさん:04/12/27 21:28:09
どうせファイルを全部一気に読み込むのなら、スカラーに入れて
一回だけスキャンすればいいじゃん。
583デフォルトの名無しさん:04/12/27 21:29:56
>>582
バカでかいテキストファイルだったら嫌じゃね?
584デフォルトの名無しさん:04/12/27 21:40:46
>>583
結局状況次第になっちゃうよねえ。

- テキストのサイズ
- 1行あたりの長さ
- 行をまたぐのか否か
- 実行する状況/環境
- マッチ位置を全部見つけるのか否か

などなどで。
585デフォルトの名無しさん:04/12/27 22:18:00
>>576
いずれにせよ、スキャンしないで何かを探すのは無理じゃないの?
あらかじめインデックスみたいの作っとくにせよ何にせよ。
586デフォルトの名無しさん:04/12/28 01:16:58
jperlの正規表現で、2バイト文字にマッチするメタ文字ってないですかね?
\sとか\dみたいなやつ。
2バイト文字が5文字以上連続しているところを探したいんですけど。
jperlってスレ違いですかね?
587デフォルトの名無しさん:04/12/28 01:54:10
>>586
スレ違いじゃないけど過去ログ嫁
過去ログ読んだら空気も嫁
そういう事で頼む
588デフォルトの名無しさん:04/12/28 09:23:02
Perlでコンパイラを作ろうかと思っているのですが、
BNFファイルを元に字句解析や構文解析をするモジュールって
ありますでしょうか?
589デフォルトの名無しさん:04/12/28 11:12:08
Parse::YappとかParse::RecDescentとかどーよ。
590デフォルトの名無しさん:04/12/28 18:32:13
Infoseek鯖なんですけど

require './cgi-lib.pl';

がエラーになってしまいます。(これ以外は問題ない。)
どうすればよいでしょうか?
591デフォルトの名無しさん:04/12/28 18:33:21
エラー書けよ
592デフォルトの名無しさん:04/12/28 18:36:57
CGIプログラムエラーのため表示することが出来ません。(500 Internal Server Error)
593デフォルトの名無しさん:04/12/28 18:41:39
だめだこりゃ
594デフォルトの名無しさん:04/12/28 18:42:58
> (これ以外は問題ない。)
これ書く奴って大概他がおかしい。
595デフォルトの名無しさん:04/12/28 18:43:27
タスケテー
596デフォルトの名無しさん:04/12/28 18:44:46
>>594
でも require './cgi-lib.pl'; をコメントアウトするだけで
CGIプログラムエラーのため表示することが出来ません。(500 Internal Server Error)
はでなくなります。
597デフォルトの名無しさん:04/12/28 18:47:08
>>596
>>1読めねーの?
板違いだからどっか行ってね。
598デフォルトの名無しさん:04/12/28 19:08:23
foo, bar の次は baz, qux ですか?
hoge, fuga の次は puyo ですか?
599デフォルトの名無しさん:04/12/28 21:29:08
>>598
puyoは聞いたことない。
個人的にはgikoとmonaを使っている。
600デフォルトの名無しさん:04/12/28 21:58:37
>>599
俺漏れも
601デフォルトの名無しさん:04/12/28 22:07:05
個人的には hige と hage をつかっている
602デフォルトの名無しさん:04/12/28 23:22:12
puyo は聞いたことない。ふつー piyo では?
603デフォルトの名無しさん:04/12/29 08:30:37
foo bar hoge fuga piyo の検索結果 約 29 件中 1 - 10 件目 (0.40 秒)
foo bar hoge fuga puyo の検索結果 約 4 件中 1 - 2 件目 (0.35 秒)

ここPerlスレだよな?
全く関係ないわけじゃねぇけどさ
604デフォルトの名無しさん:04/12/30 01:59:08
foo bar の次の baz は一般的じゃないのか?
605デフォルトの名無しさん:04/12/30 02:07:28
>>604
ここPerlスレだよな?
全く関係ないわけじゃねぇけどさ
606デフォルトの名無しさん:04/12/30 05:17:29
書き込み失礼。
perlでジョイパッドの振動を検知したいんですが、可能ですか?
可能であればヒントください。
607デフォルトの名無しさん:04/12/30 08:07:54
bot厨は来ないで下さい
608デフォルトの名無しさん:04/12/31 04:24:04
たのもー。
MP3::Infoモジュールで、MP3ファイルのタグ操作をしようとしています。
my $tag = get_mp3tag($file);
でタグ情報を得た後、それぞれの要素の文字コードを変換したいのですが、
$tag->{TITLE}
みたいなハッシュのリファレンスの場合、eachは使えないのですね。
こういう場合どんな風に書けばよいのでしょうか。初心者スマソ
609デフォルトの名無しさん:04/12/31 05:27:44

while(my($key,$value) = each(%{\tag})){
#処理#
}
610デフォルトの名無しさん:04/12/31 05:35:34
ミスった。

while(my($key,$value) = each(%{$tag})){
#処理#
$tag->{$key} = $value;
}
611デフォルトの名無しさん:04/12/31 06:37:48
やや、即答ありがとうございます。できました。
オブジェクトとかクラスとか絡んで来ると、
Perlって全く違った言語みたいになりますね。
やっぱプログラミングPerl買った方がいいか.....。
どうもありがとうです。
612デフォルトの名無しさん:05/01/01 23:27:22
root以外の人間が、モジュールをインストールしたいのですが、
どうすればいいでしょうか
613デフォルトの名無しさん:05/01/02 00:15:19
>>612
漏れの場合は、自分の権限の及ぶディレクトリにモジュールを設置しといて、
そのディレクトリを環境変数 PERLLIB に設定する。
614デフォルトの名無しさん:05/01/02 00:43:47
perl -MCPAN -e shell
のような感じではできないのでしょうか?>>612
依存関係があると、インストールが凄く手間がかかると思うのですが
615デフォルトの名無しさん:05/01/02 04:07:43
>614

ttp://homepage3.nifty.com/hippo2000/perltips/CPAN.htm#FAQ
5) rootではありません。どうすれば個人的なディレクトリにインストールすることができますか?

あと、make_arg や makepl_arg なんかに --prefix を設定するのが良いと思う。
(たしかCPANの初回起動の設定時に、非rootはそうしろというメッセージがあった)
616デフォルトの名無しさん:05/01/02 09:46:38
配列の100番目から最後までをバッサリと削除するような命令ってありますか?
spliceを使えば良いのでしょうか?
すみません、誰か「こうしたらよい」と言うのがあれば教えてください。
617デフォルトの名無しさん:05/01/02 09:57:49
>616
man perlfunc
618デフォルトの名無しさん:05/01/02 10:09:29
>>616
splice @array, 99;

>>617
せめてperlfunc -f spliceと言ってやれよ
619デフォルトの名無しさん:05/01/02 10:17:21
$#a = 99;
620デフォルトの名無しさん:05/01/02 11:04:59
ありがとうございました。>>617-619
621デフォルトの名無しさん:05/01/02 12:28:11
質問です。よろしくお願いいたします。
open みたく、第1引数に BARE WORD を書いたらその実体が作られる、みたいな
サブルーチンはどうやって書くのでしょう?
具体的には、下のプログラムで foo::my_open(*X) として呼んでいるところを、
いきなり foo::my_open(X) と呼んでも無問題にしたい。

#!/usr/local/bin/perl -W
use strict;
package foo;
sub my_open(\*) {
my $ref_fh = shift;
open FH, ">hello.txt" or die;
*{$ref_fh} = *FH;
}

package bar;
foo::my_open(*X);
print X "Hello World!\n";
close X;

目的は、open の wrapper を作りたいのですが、引数仕様もオリジナルの open に似せたい、ということです。
622デフォルトの名無しさん:05/01/03 00:08:20
>>621
use strict;

package Foo;
sub my_open {
  my($file, $mode, $symbol) = reverse @_;
  my $fh;
  {
    no strict;
    $fh = *{"${[ caller ]}[0]::$symbol"};
  }
  open $fh, $mode, $file or warn($!), return;
  1;
}

package main;

Foo->my_open(BAR => '>', 'bar.txt') or die;
print BAR 'blah, blah, blah...';
close BAR;
623デフォルトの名無しさん:05/01/03 01:32:06
>>622 感動した!
質問者(>>621)ですお答えいただきありがとうございます。
やはり use strict 下でユーザー作成なサブルーチンの引数に Bareword 書くのはちょっち無理がありっぽそうですね〜(汗
'=>' を ',' に変えて
<PRE>Foo->my_open(BAR, '>', 'bar.txt')</PRE>
とすると駄目。(use strict をはずすと OK。)
'=>' を使うと何も言われないのは、$hash{'key'} と $hash{key} を等価とするルールが効いてるんでしょうか。
ややこしいよ! > Perl。

それはともかく、caller を使って呼び出し元のパッケージ名を得て、シンボルの完全修飾するところはとても勉強になりました。
ありがとうございます。
624デフォルトの名無しさん:05/01/03 15:47:44
>>623
perlsub(1)に似た例があるけど、Symbolモジュールの
qualify_to_refを使うといいそうです。

use strict;

package Foo;
use Symbol 'qualify_to_ref';
sub my_open(*) {
my $fh = qualify_to_ref(shift, caller);

open $fh, "> hello.txt" or die;
}

package Bar;
Foo::my_open(X);
print X "hello World!\n";
close X;
625デフォルトの名無しさん:05/01/03 17:12:57
ご回答ありがとうございます。これで解決いたしました。
>>623 で寝ぼけたこと書きましたが、これは >>622 に対する感動のあまり、perlsub に書かれてる
 A "*" allows the subroutine to accept a bareword, ...(ry
という事実を失念してたせいです _| ̄|○|||
Symbol モジュールについては初耳ですた。ソース読んで見ます。
ドキュメントももっと真面目に読んでみます _n。

しかし、>>622 でも片鱗が垣間見れましたが、シンボルをデータとして扱えるあたり、
まるで Lisp さんのようだ。
626デフォルトの名無しさん:05/01/04 22:16:16
if文の条件式での質問なんですが
$aは1以上5以下とする場合は

if (1 <= $a <= 5) {
}

で認識されますでしょうか?
確認できる環境にありませんのでご教授ください
627デフォルトの名無しさん:05/01/04 22:27:58
だめです
628デフォルトの名無しさん:05/01/04 23:04:34
しかし確認できない環境でそんなこと気にしてどうするんだろうか...
629デフォルトの名無しさん:05/01/04 23:25:23
MS-DOSとかw
630デフォルトの名無しさん:05/01/05 07:21:45
>>629
perldoc perldos
631デフォルトの名無しさん:05/01/05 10:34:34
CPU i386 16.78MHz
632デフォルトの名無しさん:05/01/05 11:54:18
質問です。タブ区切りのテキストファイル、例えば
abc(tab)xyz
def(tab)123
こんなのが1万行以上続くファイルがあって、
Search('abc')でxyzが返ってくるようなサブルーチンを作ろうとした場合
m/$pattern\t([^\n]*)/
ではあまりに効率が悪いと思うんですが、もっと良い方法ってあるんでしょうか?
633デフォルトの名無しさん:05/01/05 12:04:00
>>632
abc(tab)123
abc(tab)456
みたいに重複したらどーすんの?
634デフォルトの名無しさん:05/01/05 12:30:50
>>632
DB_Fileとか使った方が楽だよ
635632:05/01/05 13:22:35
>>633 このファイルには重複が無いたぐいのデータですので、重複の検討は不要なんです。
>>634 サンクスコです。DB使うと速いんだろうなーとは思っていたんですが、DBについて全く無知
なものでなんとなく遠慮してました。ちょっと勉強してみます。

質問自体は純粋な興味も含んでますのでテキスト形式で速い方法があれば、教えて頂きたいです。
636デフォルトの名無しさん:05/01/05 14:22:24
ハッシュだつーことで
foreach(@data){
  $_ =~ /([^\t]+)\t(.+)/;
  $list{$1} = $2;
}
print $list{'abc'};
とか。

只、ループのコストはしらね。
637デフォルトの名無しさん:05/01/05 16:27:14
>>635
- hashに読み込んで使う
- suffix arrayを使う
- テキストをソートして二分探索法を使う
638デフォルトの名無しさん:05/01/05 16:55:18
>>635
私もDBを使う機会があって勉強したのですが、案外簡単に作れますよ。
一週間でマスターするPerlで、DBの作成方法は載ってたかと。
データベース作成の部分だけ抜き出して使えば、その日のうちに出来ます。
639デフォルトの名無しさん:05/01/05 17:31:02
>>635
> >>634 サンクスコです。DB使うと速いんだろうなーとは思っていたんですが、DBについて全く無知
> なものでなんとなく遠慮してました。ちょっと勉強してみます。

DB_File類のDBは、エントリの追加、書き換え、取得などをそつなくこなす
ためにチューニングされているので、必ずしも速いとは限らない。

640デフォルトの名無しさん:05/01/05 17:38:28
>>639
とはいえ、ベタテキストの線形探索より遅いってことはねえべ。
641デフォルトの名無しさん:05/01/05 17:50:09
>>640
> とはいえ、ベタテキストの線形探索より遅いってことはねえべ。

それは分からん。1万2万程度だったら、まだ線形の方がましかも。

642632:05/01/05 20:45:37
皆さん、ご丁寧なレスありがとうございます。
確かに対象データによって速度は色々ですよね。あいまいな質問で申し訳ありませんでした。
元はだいたい1万語程度の和英対訳のデータで、線形検索でも実際即座にレスポンスがありました。
データ数が増えれば、線形検索 < 二分探索法 < ハッシュ≒DBと言ったところでしょうか。
ちょっと勉強してベンチとってみたいと思います。大変参考になりました。
643デフォルトの名無しさん:05/01/06 19:07:10
変数の中身を空にするにはどうすれば良いですか?
644デフォルトの名無しさん:05/01/06 19:22:52
>643
undef 変数;
645643:05/01/06 19:41:05
>>644
ありがとうございます!
646デフォルトの名無しさん:05/01/06 21:35:17
>>641
おめぇ自前でバイナリサーチ書いたことねえべ
適当なことゆってると笑われるぞ
647デフォルトの名無しさん:05/01/06 21:40:48
>>646
ほっといてやれ。彼には一生理解できまい。
648デフォルトの名無しさん:05/01/06 22:40:12
>>646
> おめぇ自前でバイナリサーチ書いたことねえべ
> 適当なことゆってると笑われるぞ

DB_Fileには、わたしが書いたコードも入ってる。
649デフォルトの名無しさん:05/01/06 22:48:21
アイタタタ、妄想癖まで入ってるのかよ。こりゃ重傷だな。
650デフォルトの名無しさん:05/01/06 23:03:49
>>649
Socket.pmにはわたしが書いたコードが入ってる。
結構日本人も手を入れてるんだよ。
そんなに珍しい話じゃないよ。
651デフォルトの名無しさん:05/01/06 23:11:45
やっぱPerlに関する日本語情報源はここが最強だな
652デフォルトの名無しさん:05/01/06 23:14:21
ネタスレ
653デフォルトの名無しさん:05/01/06 23:27:16
ここにはすごい人たちがいるんですね!!
頼もしいなあ。
654デフォルトの名無しさん:05/01/06 23:37:13
>>650
そうじゃなくて、手を入れたからってその中身が全て理解できてんの?
という意味で言ったの。

Jcode.pm にはわたしが書いたコードも入ってるが、中身はさっぱりわかってないしな。
655デフォルトの名無しさん:05/01/06 23:37:47
>>641, >>646
素朴な疑問なんですが、n 個のデータの並びがランダムなら、
探索に擁する平均の時間計算量は

 線形探索:O(n) = n / 2

 バイナリサーチ:
  ソーティングに O(n) = n * log(n)
  サーチ単体に  O(n) = log(n)

なのであって、n がどうあろうとも平均的には線形探索が速くありませんでしょうか??
(データの並びがランダムなら、むしろ線形探索より速度有利なのはハッシュぐらいなのでは?)
656デフォルトの名無しさん:05/01/06 23:39:44
↑いかんぼけたこと書いた。
ソーティングは最初に一回やればいいんですね・・・_| ̄|○|||
657デフォルトの名無しさん:05/01/06 23:42:11
ソーティングに O(n) = n * log(n)
すでにソートされてる所に新しく要素を追加するならそんなにかからないよ。log(n)でいい。
658デフォルトの名無しさん:05/01/06 23:52:57
>>655
スクリプト言語の場合、変数へのアクセスやユーザ定義の
サブルーチン類の実行が非常に遅いので、オーダーの件が
影響し始める前に、コードの単純さやビルトインのルーチ
ンのみで済むかどうかがものをいうことが多々あるな。

最近のマシンでの閾値がどれくらいなのかは知らんが。
659デフォルトの名無しさん:05/01/06 23:54:15
>> 657
ぼけたこと書いた身なので指摘するのは心苦しいのですが、それは挿入位置をバイナリサーチで見つける手間ですよね。
んで、バイナリサーチがその手間で適用できるということは、データはリンクリストでなくて、配列状に格納されてなきゃならないわけで、
挿入の際、後続要素をずらす手間が別途かかりますがな。(平均で O(n) = n/2)

>> 655 (漏れだよ_| ̄|○|||
最後の () 内は大嘘。前提に誤解がある。

・・・perl から離れてスマソ
660デフォルトの名無しさん:05/01/06 23:57:17
このあたりはきちんと窮極を目指そうとすると、
トライとかB木とかパトリシア木とかダブル配列とか
出てきて底なしだから、どこかで妥協するのが現実的な
ソリューションだろう。だいたいそのうちスクリプト言語で
書いている自分に空しさを感じはじめるし。

661デフォルトの名無しさん:05/01/07 00:18:11
ややこしい話になってるけど、
ま、とにかく、辞書をソートして良いのなら、
look.plやSearch::Dictを参考にバイナリサーチを書けばそこそこの
スピードのものが簡単に出来るんじゃないか?

DB_Fileは、使用中にデータが変更されるのでなければ
大げさすぎだろ。


662デフォルトの名無しさん:05/01/07 00:28:11
>>661
DB_Fileを使ってハッシュに入れてしまえばプログラミングが
楽だってことでしょう。

わたしなら空間効率の良いCDB_Fileを勧めるけどね。

663デフォルトの名無しさん:05/01/07 01:03:12
ややこしい話になってるけど
>>632 に書いてあるパタンマッチの方法でも、そんなに遅くないんじゃないの?
664デフォルトの名無しさん:05/01/07 01:11:43
つか、各エントリ毎に中身を分割して
あらかじめファイルに保存しておき、
単に検索時に該当するファイルを開いて読むのが
サーチ時間もデータのロード時間も一番短いんでね〜の?

665デフォルトの名無しさん:05/01/07 01:28:45
>>664
やけになっちゃダメです!!

ディレクトリ検索はコストゼロじゃないし(線形探索では?)、
1エントリごとに最小ディスクブロック(8KB?)占有するし
でかなり高コストだと思う。
666デフォルトの名無しさん:05/01/07 01:51:35
>>663 確かに最速かも。
正規表現のコンパイルおよびマッチングエンジンは
ネイティブコードで書かれてるわけで、スクリプトで書いた探索ルーチンなど問題外な動作速度のはず。(未検証)
特に >>632 程度のパターンならコンパイル時間など一瞬で無視し得るだろうし、
マッチング中にバックトラックが発生する危険もない。

>>664 それ正論ですね!
いや私も >>657 書いて初めて認識しましたが、一たびランダムな順序になってしまった(<これ重要)
n 個のデータの探索は、どんなアルゴリズム使っても結局トータルで O(n) = n になっちゃう。
データの追加の時点で、将来の検索を見越して、ファイルに分けるなりB木にするなりの準備をして、
いかにランダムせずに済ますかが O(n) = n の壁を破る肝かと。

>>665 というわけで、>>664 は別にやけになってないと思うにゅ。
まあ、たしかに n が比較的小さければ、>>665>>658 の方が言うような
細かなコストの積み重ねが時間決めちゃうんだろうけど。
667デフォルトの名無しさん:05/01/07 01:55:50
>>666
> >>663 確かに最速かも。
> 正規表現のコンパイルおよびマッチングエンジンは
> ネイティブコードで書かれてるわけで、スクリプトで書いた探索ルーチンなど問題外な動作速度のはず。(未検証)
> 特に >>632 程度のパターンならコンパイル時間など一瞬で無視し得るだろうし、
> マッチング中にバックトラックが発生する危険もない。

純粋なマッチングに関して言うと、regexpは相対的に遅いので、
メタ文字を使わないことが可能なマッチングなら、indexでsubstrの
ほうが良い。
668デフォルトの名無しさん:05/01/07 01:59:01
>>666
> いや私も >>657 書いて初めて認識しましたが、一たびランダムな順序になってしまった(<これ重要)
> n 個のデータの探索は、どんなアルゴリズム使っても結局トータルで O(n) = n になっちゃう。
> データの追加の時点で、将来の検索を見越して、ファイルに分けるなりB木にするなりの準備をして、
> いかにランダムせずに済ますかが O(n) = n の壁を破る肝かと。

いや、ランダム順のファイルに対し、suffix arrayとか、
バイナリサーチを仕掛ける方法はある。

> >>665 というわけで、>>664 は別にやけになってないと思うにゅ。
> まあ、たしかに n が比較的小さければ、>>665>>658 の方が言うような
> 細かなコストの積み重ねが時間決めちゃうんだろうけど。

わかった。やってみんしゃい、やてみんしゃい。
669デフォルトの名無しさん:05/01/07 02:20:09
理屈に走りすぎたスマソ_| ̄|○|||
「細かなコスト」という悪い表現つかっちゃったけど、そういうものを軽視はしていないつもり。
>>666 は、n が 10 兆と 100兆 とかの雲の上のケースで、しかも検索初回でのみ成立する空論だということで一つ 人´Д`;)
(2 回目以降ならデータはソート済みのため、たしかに O(n) = n より早くできる。)
670デフォルトの名無しさん:05/01/07 02:26:02
>>664
(少なくとも UNIX では) >>665 の言うとおり open(2) はディレクトリを線形探索するので、
ひとつのディレクトリに数万ファイルとかあるとそれなりに重くなる。

ので、ファイルはディレクトリ細かく分けて配置するのが良い。
たとえば ./a/b/c/abc.dat みたいな感じにディレクトリ切るのがおすすめ。
671デフォルトの名無しさん:05/01/07 02:41:57
なんでもいいけど、
検索することに走りすぎで、元のファイルの作成・管理を
考えたら、ファイルを分けるとか、ディレクトリを切るとか、
やってられないと思う。
だいたいにおいて、一つの値がいくつかの属性を持ってて、
別の属性で調べろとか言われたら破滅でしょ。
(名前、年齢、住所と並んでて、名前じゃなくて年齢でと言われた場合)
DB_Fileなら、MLDBMと組み合わせれば、それもバッチリらしいよ。
しかし、ここまできて、DBIに誰も触れないのは不思議。
MySQLとかPostgreSQLとかまでいかなくても、
CSV(つまり、カンマ区切りテキストですが)でも、
DVD::CSVを使えば利用できるようなんだけど…。
672デフォルトの名無しさん:05/01/07 02:53:45
>>671 DVD::CSV
あうっ、DBD::CSV
673デフォルトの名無しさん:05/01/07 02:58:42
>>670
> ので、ファイルはディレクトリ細かく分けて配置するのが良い。
> たとえば ./a/b/c/abc.dat みたいな感じにディレクトリ切るのがおすすめ。

ディレクトリ構造は、ディレクトリごとに異なるシリンダグループに
配置されたりするから、これはディスクアクセスの量を増大させるし、
ディスク上の局所性も悪い。

また、最小ファイルサイズの問題もある。これがまたディスクアクセスの
量を増大させる。もちろん、各ファイルの後方のフラグメントは、他の大
きなサイズのファイルから利用可能だけど、数が多すぎです。

squidやccacheとは粒度が違うでしょ、粒度が。

っていうか、もはやどういう制限があって何がしたいのかと言う話が
めちゃくちゃになってるし。


674デフォルトの名無しさん:05/01/07 02:59:29
D・V・D!! D・V・D!!
675デフォルトの名無しさん:05/01/07 03:14:03
手を入れたことがある。
排泄器に。
676デフォルトの名無しさん:05/01/07 03:15:10
>>671
> 検索することに走りすぎで、元のファイルの作成・管理を
> 考えたら、ファイルを分けるとか、ディレクトリを切るとか、
> やってられないと思う。

そういうツールを書けばよいだけ。

> だいたいにおいて、一つの値がいくつかの属性を持ってて、
> 別の属性で調べろとか言われたら破滅でしょ。

それはまた別の話。

> (名前、年齢、住所と並んでて、名前じゃなくて年齢でと言われた場合)
> DB_Fileなら、MLDBMと組み合わせれば、それもバッチリらしいよ。

MLDBMはそういうことは出来ないと思うが。
だいたい、プレフィックスなどつければ、
ふつうにDB_Fileでもできるし。

> しかし、ここまできて、DBIに誰も触れないのは不思議。

だから、そこまで大げさな話じゃないってことさね。
677デフォルトの名無しさん:05/01/07 03:15:20
SQLite、いや、やっぱなんでもないです。
678デフォルトの名無しさん:05/01/07 03:40:18
あ、最近ひそひそ話で良く出てきますね、SQLite。
679デフォルトの名無しさん:05/01/07 03:42:20
>>676
>MLDBMはそういうことは出来ないと思うが。

MLDBMの具体的使用例は、CGIプログラミング第2版(オライリー)
で見た。P280

これを見ると、ハッシュでキーと値というだけでなく、
ネストされたデータ構造を持てる。

マリーさんの電話番号の、1番目のじゃなく2番目のやつ
を特定して取り出せるというの。
ハッシュの値に、配列のリファレンスが
入ってるということだよね。

MLDBMはそういう機能をもってるらしい。
MLDBMを使わないとなると、SQLまで行かないと出来ないんじゃない?
680デフォルトの名無しさん:05/01/07 03:57:34
>>679
> >MLDBMはそういうことは出来ないと思うが。
>
> MLDBMの具体的使用例は、CGIプログラミング第2版(オライリー)
> で見た。P280

MLDBMは最初のリリースから使ってる。

> これを見ると、ハッシュでキーと値というだけでなく、
> ネストされたデータ構造を持てる。

そうだ。

> マリーさんの電話番号の、1番目のじゃなく2番目のやつ
> を特定して取り出せるというの。
> ハッシュの値に、配列のリファレンスが
> 入ってるということだよね。

だからできない。まず、「マリーさん」を検索してデータ構造を取得し、
―ここでマーシャリングされていたデータ構造が展開される(激重)―
その中の2番目を取得するというステップを踏む必要がある。

> (名前、年齢、住所と並んでて、名前じゃなくて年齢でと言われた場合)
> DB_Fileなら、MLDBMと組み合わせれば、それもバッチリらしいよ。
の例なら、まず、すべての名前の一覧を取得して、それで検索し、
ひとつひとつ展開して、合致する年齢を探し出す必要がある。

そこまでやるのなら、すっぴんDB_Fileにプレフィックスをつけたエントリを
直接展開した方が速い。


681デフォルトの名無しさん:05/01/07 03:58:32
というか誰かベンチマークとってみたらどうだろう?
>>632の方法と、index-substrと、sort-binsearchのみっつくらいで。
キーの重複はないって条件付きだからそこは悩まなくてもよさ下。
682デフォルトの名無しさん:05/01/07 04:10:41
ヒロシです…

O(n) がAAに見えて仕方ありません…


ヒロシです… ヒロシです… ヒロシです…
683デフォルトの名無しさん:05/01/07 07:56:11
・・・やっぱこのスレ、すったもんだしてる時が一番盛り上がるのね。
質問者がよってこなくなるぞ、と。

仮眠前にこのスレ見るのはもうやめよう・・・。
けど>>681の結果は知りたいな。
684デフォルトの名無しさん:05/01/07 09:16:39
キーと内容ファイル内のオフセットの組書いたインデックスファイルと
内容ファイルを分ければいいじゃない。
685デフォルトの名無しさん:05/01/07 09:56:34
常にハッシュをStorableでfreeze,thowするのは駄目ですかね?
686デフォルトの名無しさん:05/01/07 09:57:33
>>684
つきつめていくとBerkeley DBの再発明になりそうな予感。
687デフォルトの名無しさん:05/01/07 10:47:07
>>685
それは、MLDBMの再発明になると思われ。
688デフォルトの名無しさん:05/01/07 12:31:54
>>681
昔1万レコードくらいのテキストファイルを>>632の方法と
BerkeleyDBで比較したら10倍くらい>>632の方法が速かったよ
689デフォルトの名無しさん:05/01/07 12:33:29
BerkeleyDBの場合は1万レコードのテキストファイルの内容を
予めDBに入れておいてです。
690デフォルトの名無しさん:05/01/07 12:58:48
スピードだけの問題じゃないと思うんだよなぁ。
たとえば、DBIを考えてみれば、
DBD::CSVでカンマ区切りテキストを扱えたり、
サーバを必要としない DBD::SQlite が使えるよ。
汎用性とか、使いまわしの容易さとか、他と違うと思う。
たとえばの話、DBIx::Dumper モジュールを使うと、
EXCELファイルにも即、出来るらしいよ。(クックブック第2版P705)
691デフォルトの名無しさん:05/01/07 13:28:26
>>690
こんなシンプルな問題で汎用性を考えたら、
地獄に落ちるのは目に見えている。
692681:05/01/07 14:42:13
おいおまいら。ベンチマークとってみましたよ。

下準備↓
== makedata.pl
use strict;
for my $i (1..20000) {
  print "@{[$i*2]}\t", crypt($i, reverse $i), "\n";
}
== console
%perl makedata.pl > data.txt

(長いので続く)
693681:05/01/07 14:42:38
== bentch.pl
use strict; use Benchmark;

my ($filedata, @filedata, %filedata);
open IN, "data.txt"; @filedata = <IN>; close IN;
for (@filedata) { # データ読み込み
  $filedata .= $_;
  m|([^\t]*)\t([^\n]*)|;
  $filedata{$1} = $2;
  chomp;
}
timethese (10, { # ベンチ
  bin => q{ for my $i (0..40000) { &bin($i); } },
  match => q{ for my $i (0..40000) { &match($i); } },
  hash => q{ for my $i (0..40000) { &hash($i); } },
} );
sub bin {
  my $key = shift;
  my ($l, $r) = (0, scalar(@filedata));
  while ($l <= $r) {
    my $i = int(($l + $r)/2);
    my ($fkey, $fdata) = split(/\t/, $filedata[$i]);
    return $fdata if ($key == $fkey);
    if ($key < $fkey) { $r = $i-1; }
    else { $l = $i+1; }
  }
  return "";
}
sub match { return ($filedata =~ m|$_[0]\t([^\n]*)|o)[0]; }
sub hash { return $filedata{$_[0]}; }
694681:05/01/07 14:42:57
== Console
%perl bentch.pl
Benchmark: timing 10 iterations of bin, hash, match...
bin: 26 wallclock secs (25.77 usr + 0.00 sys = 25.77 CPU) @ 0.39/s (n=10)
hash: 0 wallclock secs ( 0.36 usr + 0.00 sys = 0.36 CPU) @ 27.86/s (n=10)
(warning: too few iterations for a reliable count)
match: 155 wallclock secs (154.81 usr + 0.00 sys = 154.81 CPU) @ 0.06/s (n=10)
695681:05/01/07 14:47:16
さすがに線形探索は不利っぽ。オーダーのレベルで違うんでたかが20000件とはいえ差がある模様。

binsearchは結構いい加減なプログラムですまん。splitのコストがどれくらいだろうなぁ。
ただデータがソートされていない場合は別途ソートの必要有りなことに注意。
キーの重複もダメね。今回はキー重複は無視していいみたいだけど。

hashはとりあえずはやい。ただこのベンチマーク結果はハッシュ構築のコストは計ってない。
あと、空間コストが一番多くかかってるのはこれじゃないかな(予想)。
Perlのハッシュ実装がどうなってるかは知らんですが。
あとやっぱしキーの重複はダメね。
696デフォルトの名無しさん:05/01/07 15:11:22
>>692
> おいおまいら。ベンチマークとってみましたよ。

とってないじゃん。
697デフォルトの名無しさん:05/01/07 15:42:54
>>695
問題が違うんじゃない?

線形を甘く見るなというのは、ぼくも先輩から言われたことがある。
スクリプト言語だとデータ構造の構築にも時間がかかるから、
データの数が少ない時には、さっさと線形サーチでやってしまった方
がいいという話だと思うけど、でもそれって、一度の起動で検索一度の
ケースだよね? みんなその前提で書いているようだけど、そういう条件なの?
698デフォルトの名無しさん:05/01/07 18:20:53
だからSQLite使えよ。
699デフォルトの名無しさん:05/01/07 18:43:54
話が逸れて曲がって広がってるな。
700デフォルトの名無しさん:05/01/07 18:50:07
>>699
逸れてないって。
要するに、大は小を兼ねるでさ、DBIのたとえばSQLiteでもいいさ、
使っておけば、後から予想もしない何事かを要求されても、
平然としてられるでしょ。
701デフォルトの名無しさん:05/01/07 18:52:47
で、SQLiteの使い方の簡単な紹介は、
クックブック第2版p725にある。
誰か、もっと詳しい紹介があったら、教えて。
日本語は、utf-8でokでいいよね?
702デフォルトの名無しさん:05/01/07 18:58:30
>>700
必要になったら必要になった時にそれを使った
システムを書けばいいだけじゃん。
703デフォルトの名無しさん:05/01/07 19:03:50
>>700
要するに、過ぎたるは及ばざるがごとしでさ、(ry
704デフォルトの名無しさん:05/01/07 19:11:53
私もベンチしますた!私の恥ずかしい binsearch、見てくださ(ry

>>692 乙ですが、ちょっちバグが有るにゅ。
 $filedata =~ m|$_[0]\t([^\n]*)|o)[0];
だと、例えば $_[0] == "10" で、"10010\tHogerapukya\n" とかにもマッチしちゃうにゅ。
ここはあらかじめ $filedata = "\n$filedata" とした上で、
m|\n$_[0]\t([^\n]*)| によってマッチすべきかと。

あと data.txt 上のキーが2万種類なのに、探索が4万種類について行われてたので直しました。
それと、バグではないけど、数値順でなくて、辞書順の binsearch のほうが >>632 は嬉しいと思う。

けど乙ですだ。全てのキーで 10 回づつ検索するんだから、これで、
各要素に満遍なく、頻繁にアクセスする条件でのベンチになってますよね、ね?>>696, >>697 (オロオロ(´д`;)
705デフォルトの名無しさん:05/01/07 19:12:48
さて、index-substr つけましたよ indexsubstr。ダサいけど。

$filedata = "\n$filedata";# 追加!
timethese (10, { # ベンチ
  bin => q{ for my $i (0..0000) { &bin($i); } },
  match => q{ for my $i (0..20000) { &match($i); } },
  hash => q{ for my $i (0..20000) { &hash($i); } },
  index_substr => q{ for my $i (0..20000) { &index_substr($i); } },
} );
(...中略...)
sub index_substr($) {
  my $str = "\n$_[0]\t";
  my $p1 = index($filedata, $str) + length($str);
  my $p2 = index($filedata, "\n", $p1);
  return substr($filedata, $p1, $p2 - $p1);# キーが無かった場合は知ら(ry
}

結果:
Benchmark: timing 10 iterations of bin, hash, index_substr, match...
bin: 28 wallclock secs (27.23 usr + 0.00 sys = 27.23 CPU) @ 0.37/s (n=10)
hash: 0 wallclock secs ( 0.39 usr + 0.00 sys = 0.39 CPU) @ 25.64/s (n=10)
(warning: too few iterations for a reliable count)
index_substr: 289 wallclock secs (286.86 usr + 0.00 sys = 286.86 CPU) @ 0.03/s (n=10)
match: 247 wallclock secs (240.19 usr + 0.02 sys = 240.20 CPU) @ 0.04/s (n=10)
(match は未修正。)
706デフォルトの名無しさん:05/01/07 19:16:09
>>705
いや、だからそういう問題じゃないと思うんだけど。
707デフォルトの名無しさん:05/01/07 19:19:08
>>704
DB_Fileを使った時と、単純に線形探査したときの比較の話じゃなかったの?

で、ワンショットコマンドでというのも条件?
708デフォルトの名無しさん:05/01/07 19:24:03
>>702
個人ならそれでいいけど、これが会社とかでの話になると
新規に作るには時間もかかるし、当然人件費がかかる。
ならば今ある物に手を加えて……と、スパゲッティプログラムへの道を歩むことになる。

実際は新規に作った方が短時間になるケースが多いんだけどね。
未だに誤った選択をしてしまう会社は多いよ。
709デフォルトの名無しさん:05/01/07 21:08:52
あのう初歩的な質問なんですが、
サブルーチン foo の中でサブルーチン bar を呼び出したとき、
bar が失敗したらウォーニングを表示して即座に undef を返したいんですが、

 $x = bar() or warn "$!\n", return;

と書くだけで本当に大丈夫なんでしょうか? (この構文において、返される undef は一体誰が作ってるんでしょう?)
710デフォルトの名無しさん:05/01/07 22:00:39
>>701
SQLite
http://perldoc.jp/docs/modules/DBD-SQLite-0.19/SQLite.pod
RDBMSを動かすためには、単にこのモジュールをインストールすることだけが必要です。
他には何もありません。
711デフォルトの名無しさん:05/01/07 22:05:40
>>709
よく分からんけど、
http://perldoc.jp/docs/perl/5.6.1/perlvar.pod
に下のように書いてある、 $SIG{__WARN__} が使えない?

警告メッセージを表示しようとするときに $SIG{__WARN__} で
示されたルーチンが呼び出されます。
警告メッセージは最初の引数として渡されます。
__WARN__ フックがあると、通常の STDERR への警告の出力は行われません。
これを使って、警告メッセージを変数にいれたり、
あるいは以下のようにして警告を致命的エラーに変えたり出来ます:

local $SIG{__WARN__} = sub { die $_[0] };
712デフォルトの名無しさん:05/01/07 22:54:20
print while(<>); を実行して、標準入力にリダイレクトして
読み込んだテキストファイルをそのまま標準出力すると、
行末がcr cr nlになってしまいます。入力ファイルの行末はcr nlです。
どう解決すればよいのでしょうか?

環境はcygwinのPerlです。よろしくお願いします。
713709:05/01/07 23:23:37
すいません、かなり舌足らずでした。
やりたいのはウォーニングを出して 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 が返されたので、すかーり自信喪失してしまい・・・というわけです。
しょうもない質問ですいません(滝汗
714デフォルトの名無しさん:05/01/07 23:28:12
舌足らず?
715デフォルトの名無しさん:05/01/08 00:15:53
>>713
複雑に考えずにperlfunc(1)のreturnの説明を読めば

EXPR が指定されなかった場合は、リストコンテキストでは空リストを、
スカラコンテキストでは未定義値を返します。そして(もちろん)void
コンテキストでは何も返しません。

と思いっきり書いてあるわけだが。
716デフォルトの名無しさん:05/01/08 00:40:01
>>712
入れるとき chomp して、
出すとき \n じゃダメなの?
そういう問題じゃなくて???
717デフォルトの名無しさん:05/01/08 00:58:27
近所のコンビニに行くのに自転車で言ったほうが気軽で速いしコストもかからないとしても。
隣町や隣の県に行くときは交通手段を変えないと遅くてやっていられない。

だったら初めからコンビニに行くのもスケーラビリティの高い自動車でいく癖をつけとけば単純明快だよ。
718712:05/01/08 01:53:52
>>716
はい、実際そのようにしています。
ただ、そのままchompをしただけだと行末が

cr ln → cr

となり、さらにこれに\nをつけて出力すると

cr → cr cr ln

となってしまいます。
そこで、chompの前に $/ = "\r\n" を入れれば期待通りの動作になるのですが、
そうすると>>712のコードが以下のように若干汚くなることが気になって質問したのです。

$/ = "\r\n";
while (<>){ chomp; print $_,"\n"; }
719デフォルトの名無しさん:05/01/08 02:11:31
>>717
> だったら初めからコンビニに行くのもスケーラビリティの高い自動車でいく癖をつけとけば単純明快だよ。

そんな「だったら」は無いだろ(w
720デフォルトの名無しさん:05/01/08 02:12:44
>>712
binmodeぶちかますのじゃだめなの?
721デフォルトの名無しさん:05/01/08 14:48:08
>>718
lnってlfでは?
CR = \r
LF = \n

>cr → cr cr ln
CR にLF足すのにCR+CR+LFになるっておかしくないか?
cygwinのせいなのか?

他環境でも動作させるように考えるなら、s/\r|\n//; でもしてCRもLFも削った方が良いような気がする。
722721:05/01/08 14:58:41
× s/\r|\n//;
○ s/\r|\n//g;
723デフォルトの名無しさん:05/01/08 15:24:25
>>721
> CR にLF足すのにCR+CR+LFになるっておかしくないか?
べつにおかしくはないよん。"\n" は、perl 内部では LF("\x0A") だが、
テキストモードのファイルハンドル使って出力するとき CR LF ("\x0D\x0A") に変換される。
実際、>>720 の言うように、binmode STDOUT; print while(<>); だと
リダイレクト結果の行末は "\x0A" のみになる。(Win 環境と CygWin 環境で確認。)

ついでに言うと、入力時のときも、テキストモードであれば "\x0D\x0A" --> "\x0A" 変換が行われる。
(したがって、Win 環境でも、上に書いた『"\n" は、perl 内部では LF("\x0A")』という約束が矛盾無く保たれる。)

さらに余談だけど、このような変換は、(Win 環境での perl に限らず) テキストモードとバイナリモードを区別する環境での
かなり一般的な約束らしい。

(注: 安全性をとってs/\r|\n//g; すること自体には異論はない。)
724デフォルトの名無しさん:05/01/08 15:39:32
>>722
環境にもよると思うけど s/\n\z/; s/\r\z/; の方が速い鴨。
725723:05/01/08 15:40:05
いやごめん。
WindowsXP + Cygwin 1.4.11-1 + perl v5.8.5
で試したところ、print while(<>); だけでもリダイレクト結果に "\x0A" しか付かなかった _| ̄|○|||
>>712 において、行末に "\x0D\x0A" が付くのは Win 環境の perl (v5.6.1) だけだった。
役に立たなくてすまね >>712
726723:05/01/08 16:49:24
>>712 ごめん、暇人なんでちょっと食い下がらせて。
Cygwin 環境自体は UNIX に似せてあるわけだから、テキストデータの改行コードといえば、LF ("\x0A")一文字を指す。
したがって、Cygwin 環境で動くアプリは、>>723 に書いた変換を本来行ってはいけない。
つまり、次の動作が正しい。
(1) 入力データの行末が CR LF なら
(2) それを perl で呼んだ結果の行末も CR LF でなければならず、
(3) それを出力したものの行末も CR LF でなければならない。
(誰も CR を減らしも増やしもしない)

>>716 読むと、(2) は成立してるようだが、(3) が成立していないようだ(出力時に LF --> CR LF 変換が起きている)。
したがって、>>720 が言うように、binmode STDOUT; でその変換を確実に殺してやれば解決はするんだが、
何で変換がおきるのかが謎。
実際、hello.txt の中身が "hello!\x0D\x0A" だとして、
 perl -e "print while(<>);" < hello.txt > hello2.txt
を実行すると、hello2.txt の中身は "hello!\x0D\x0A" であって、>>712 のようなことは起きない。
727デフォルトの名無しさん:05/01/08 17:23:04
Cygwinってインスコする時に改行コードをDosかUnixのどっちにするか聞いてくるけど
その選択によってCRLFの扱いが変わったりすることは無いの?
728デフォルトの名無しさん:05/01/08 18:28:13
Xという障害が起きたらAという行動
また同じXという障害が起きたらBという行動
このように交互に繰り返してループさせるにはどうすればいいんでしょうか。
全くの初心者なんですが、苦悩しすぎてハゲそうです。
お助けを・。
729デフォルトの名無しさん:05/01/08 18:44:19
syslog の行頭の `Jan 8 18:31:55' こういう日付をエポッチに変換したいので
すがどうするのがよいでしょうか?
730デフォルトの名無しさん:05/01/08 18:56:25
>>729
use HTTP::Date;
my $a = str2time('Jan 8 18:31:55');
print "$a\n";
731デフォルトの名無しさん:05/01/08 19:01:16
>>727
ある。
$ mount
の結果貼れば解決するかも。
732デフォルトの名無しさん:05/01/08 19:06:43
>>729
X が起きたのが遇数回か奇数回なのかを状態変数に持たせる。
(下のリストでは $state がそれにあたる。)
同じ入力で、動作を次々変えたいときの常套手段。

my $state = 0;
for (;;) {
 #...

 if (X 発生) {
  if ($state == 0) {
   A;
   $state = 1;
  } elsif ($state == 1) {
   B;
   $state = 0;
  }
 }
 # ...
}
733デフォルトの名無しさん:05/01/08 19:13:50
>>730
THX
734728:05/01/08 19:14:59
>>732
助かりましたー!!
ありがとうございます。
735723:05/01/08 19:29:49
>>731 貼った。(<って漏れが貼ってどうする・・・_| ̄|○|||
$ mount
D:\cygwin\bin on /usr/bin type system (binmode)
D:\cygwin\lib on /usr/lib type system (binmode)
D:\cygwin on / type system (binmode)
c: on /cygdrive/c type user (binmode,noumount)
d: on /cygdrive/d type user (binmode,noumount)
m: on /cygdrive/m type user (binmode,noumount)
q: on /cygdrive/q type user (binmode,noumount)

確かに、漏れの環境は(Unix でインストールしたのか) binmode になっているので、
>>725>>726 において >>712 のような摩訶不思議な現象とは無縁だったらしい。
736727:05/01/08 22:34:23
>>735 ワロタ

>>731 ちなみにUnixでインスコした俺の結果は
% mount
C:\cygwin\usr\X11R6\lib\X11\fonts on /usr/X11R6/lib/X11/fonts type system (binmode)
C:\cygwin\bin on /usr/bin type system (binmode)
C:\cygwin\lib on /usr/lib type system (binmode)
C:\cygwin on / type system (binmode)
c: on /cygdrive/c type user (binmode,noumount)
d: on /cygdrive/d type user (binmode,noumount)
737712:05/01/09 04:41:31
>>723
丁寧な分析ありがとうございました。

ほか、私の質問にレスをしてくれた方々、ありがとうございました。
原因はやはりテキストモードにあったようです。

% mount
C:\cygwin\bin on /usr/bin type user (textmode)
C:\cygwin\lib on /usr/lib type user (textmode)
C:\cygwin on / type user (textmode)
c: on /cygdrive/c type user (textmode,noumount)
d: on /cygdrive/d type user (textmode,noumount)

恥ずかしながら、今までテキストモードとバイナリモードの違いを
意識したことがなかったので、まさかこんなところに原因があるとは
思いもしませんでした。
mountしなおして、バイナリモードに変更したところ、前記の問題は
無事解決いたしました。
ありがとうございました。
738デフォルトの名無しさん:05/01/09 12:33:31
>CGIとPerlの区別がつ

枝葉末節の違いをのぞけば、本質的には同じだよね?
739デフォルトの名無しさん:05/01/09 13:15:49
>>738
IT用語辞典とかで調べたらすぐに判るだろうに
わざわざ恥晒しに来るなんて物好き。
740709:05/01/09 13:55:43
>>715 ありがとうございました。無事解決しました!
やはり、足りないのは舌じゃなくて脳でした! >>714
つまり、脳が、return ・・・ハズカチー 三(ノノ)
741デフォルトの名無しさん:05/01/09 14:38:57
>>738
exeファイルとプログラム言語は 本質的には同じだよね?
ぐらいの間違い。
742デフォルトの名無しさん:05/01/09 14:40:46
>>741
見方によっては間違いでは無い。上のも同じ。
743Rubyist!:05/01/09 14:43:51
ばかばっか
744デフォルトの名無しさん:05/01/09 14:53:23
>>742
> 見方によっては間違いでは無い。上のも同じ。

見方によって変わるファクターは「本質的」ではない。
745デフォルトの名無しさん:05/01/09 14:55:41
見方によって変わらないものなどあるのかね?
1つ例を挙げてくれよ
746デフォルトの名無しさん:05/01/09 14:57:53
Perl の話をすれ。
747デフォルトの名無しさん:05/01/09 14:58:22
王様の耳はロバのミ(ry
えと、皆さん知ってて黙ってるんだとは思いますが、言いたくてしょうがないので言わしてください。

>>695 において、binsearch とハッシュについて、「キーの重複はダメ」と書かれてますが、それは謙遜のしすぎです。
低コストな回避策があります。

binsearch については 『区間 [$l, $r) の外には明らかに目的のキーがない』という約束の下で、
[$l, $r) を縮小していくようにループを回してやり、縮小し切ったところで
$l と $r を返す関数仕様にすれば、キーが重複してても無問題(区間 [$l, $r) のデータが全てそのキーに該当する)。
しかもキーが無かった場合も $l == $r によって判別できる。

ハッシュについては、ハッシュ構築時に、$hash{$key} = $value; とするのでなく、
 push @{$hash{$key}}, $value;
としてやれば、foreach (@{$hash{$key}}) { ... } によって、同一キーを持つ全ての要素にアクセスできる。

ついでに、ハッシュを静的に構築したいなら、配列への参照を返す演算子 '[]' を使って、
 my %hash = {
  key1 => [ value1, value2, value3, ... ],
  ...
 }
とすれば可。
748デフォルトの名無しさん:05/01/09 15:10:12
>>747
> >>695 において、binsearch とハッシュについて、「キーの重複はダメ」と書かれてますが、それは謙遜のしすぎです。

わざわざキーの重複まで網羅していないだけのちょこっと書いた
ベンチマーク目的のコードに謙遜など持ち出すのはまちがい。
749デフォルトの名無しさん:05/01/09 15:15:25
変なのがいるな
750デフォルトの名無しさん:05/01/09 15:42:29
スルーしろよ
751デフォルトの名無しさん:05/01/09 17:53:32
お前をなw>>750
752デフォルトの名無しさん:05/01/09 20:07:18
@INDATA=(2.2,2.3,2.4,2.5,2.6)
$x=2.1;
$xint=0.01;

foreach $data (@INDATA){
while($x<$data){
print "$x\t";
unless($y[$n]){$y[$n]=0;}
print "$y[$n]\n";
$x+=$xint;
$n++;
}
$y[$n] += 1;
}
753752:05/01/09 20:07:46
自分では、これを実行すると
2.1 0
2.2 1
2.3 1
2.4 1
2.5 1
2.6 1
と出ると考えているのですが、実際に実行すると
2.1 0
2.2 1
2.3 0
2.4 1
2.5 1
2.6 1
2.7 0
となってしまいます。
自分では間違いが見つけられません……どうか間違いをご指摘下さい。
754デフォルトの名無しさん:05/01/09 20:33:20
>>752, >>753
コピペ時点でソース間違ってね?
少なくとも、@INDATA=(2.2,2.3,2.4,2.5,2.6) の後ろの ';' が抜けてて Syntax error だし、
それを直したとしても、$xint = 0.01 のままだと print "$x\t" が 50 回実行されてしまうわけだが。
755デフォルトの名無しさん:05/01/09 20:49:52
>>752
こんなときの -d !
つーか、まず何をしたいのか、日本語で一回書け!
それが分からんと、わけわかーっ!!!
756754:05/01/09 20:59:36
いや、だいたいの推測だが、>>752 がおかしいと思ってることがわかった。
たぶん、>>752 は、外側の foreach () ループ 1 回につき、内側の while () ループが
10 回回ることを期待してるんだろう。(増分 $xint == 0.01 で、@data の各要素が 0.1 刻みのため。)

しかし残念ながら、0.01 は 2 のべきで表せないので、IEEE の浮動小数点形式使ってる以上、加算するたびに誤差が累積していく。
実際には内側の while () が 11 回(もしくは途中で LSB 切捨てでなく、四捨五入があれば 9 回)回ることがあり、その直後
$y[$n] が undefind なため、unless 文で $y[$n] = 0 になるんだなこれが。
すると、$x が 0.1 の倍数のとき、>>752 の期待に反して 0 が表示されちゃう。

解決策: 0.01 加算をスケーリングして整数の加算に直せ。いじょ。
757754:05/01/09 21:17:55
これでどうよ? >>752

@INDATA = (2.2, 2.3, 2.4, 2.5, 2.6);
$x=21;  # 21 == 2.1 * 100 (100 がスケールファクタ)
$xint=1; # 1 == 0.01 * 100 (同上)

foreach $data (@INDATA) {
 while (($x / 100.0) < $data) { # スケールファクタで割る (反対に、$data * 100 でも良い)
  print $x / 100.0, "\t";   # (同上)
  unless ($y[$n]) { $y[$n] = 0; }
  print "$y[$n]\n";
  $x += $xint;  # スケーリングの結果、ここは整数の加算 --> 誤差累積無し
  $n++;
 }
 $y[$n] += 1;
}
758752:05/01/09 21:25:48
すいませんでした。行数の関係で色々いじったので……
#! /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++;
759752:05/01/09 21:26:42
}
$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することで正規分布に近い感じが出せたらと思います。
760752:05/01/09 21:28:35
あ、また半角空白でインデントしてしまった……
見にくくてすみません。
761752:05/01/09 21:36:33
19行目はprint "$y[$n]";でした。
あと27行目もlastはいらなくてprint "$x\t$y[$n]\n"; です。

読ませたデータを元に
0 0
10 1
20 5
30 8
40 6
50 3
60 0
みたいな結果を出します。
第2引数でx軸の間隔を調整してるつもりです。(デフォが10です)
762752:05/01/09 21:46:09
>>755
すいませんでした。
情報の小出しはしないようにと思ってるのに結局やっちゃってますね自分。

>>754
ありがとうございます。ちょっとやってみます。
763デフォルトの名無しさん:05/01/09 22:00:52
>>747
>ハッシュについては、ハッシュ構築時に、$hash{$key} = $value; とするのでなく、
 push @{$hash{$key}}, $value;
としてやれば、foreach (@{$hash{$key}}) { ... } によって、同一キーを持つ全ての要素にアクセスできる。

オオボケかますようだけど、それはハッシュなの?
ちょっとだけ、配列かもっていう気がする。
ああいや、気がするだけで、きっと大きな勘違い…
(大日本 perl 初心者連名代表幹事)
764デフォルトの名無しさん:05/01/09 22:09:20
ハッシュに配列のリファレンスを入れてるだけだね。
自分もちょっと違和感を感じる。
765デフォルトの名無しさん:05/01/09 22:11:31
>>763
>>747 が意図してるのは「配列への参照のハッシュ」だろう。
つまり、push @{$hash{$key}}, $value; というのを分解して書くと、
 push @noname_array, $value;
 $hash{$key} = \@noname_array; # ここがハッシュですよ奥さん

まあ、これとは別に >>774 に対して一つ指摘さしてもらうとすれば、
my %hash = { ... }; と、 my %hash = ( ... ); はびみょーに意味が違うってことだ。
前者は無名ハッシュができて、それへの参照を '{}' が返し、その参照への実体が
%hash にコピーされるので、結果は後者と同じだが、実行効率が悪い。
766765:05/01/09 22:17:06
すまん、'{}' と '()' の違いは効率の違いであって
意味の違いかどうかは微妙だな・・・
あと >>774>>747、な。
767763:05/01/09 23:03:23
みなさん、ご教示、ども。
うーん、ていうことは、
push @{$hash{$key}}, $value;
というのは、まー、つまり、
push @hash_values, $value;
ということで、valuesの配列がハッシュの値に入ってる、ということか。
無名配列コンストラクタ [ ] の方は、頭に入りやすいんですけどね、
こっちは頭に入りにくいな。
(つーか、頭の容量の関係で、無名配列コンストラクタだけでいいです)
達人の道は遠い…
768765:05/01/09 23:16:41
ああ、さらにすまん(死
my %hash = { ... }; で実体がコピーされる、というのは間違い。() と {} は明白に意味が違う。
あと、push @{$hash{$key}} = $value; の分解は、
 my $ref_noname_array = (exists $hash{$key}) ? $hash{$key} : [];
 push @{$ref_noname_array}, $value;
と書く方が適切だった。
・・・Perl は奥が深いっすついていけないっす(汗
769765:05/01/09 23:23:33
ああ、さらにすまん(死
my %hash = { ... }; で実体がコピーされる、というのは間違い。() と {} は明白に意味が違う。
あと、push @{$hash{$key}} = $value; の分解は、
 my $ref_noname_array = (exists $hash{$key}) ? $hash{$key} : [];
 push @{$ref_noname_array}, $value;
が適切だった。>>765 の書き方だと、push のたびに配列自体が増えちゃうように取れる(汗
・・・Perl は奥が深いっすついていけないっす(滝汗
770765:05/01/09 23:25:17
ああ、さらにすまん(死
my %hash = { ... }; で実体がコピーされる、というのは間違い。() と {} は明白に意味が違う。
あと、push @{$hash{$key}} = $value; の分解は、
 my $ref_noname_array = (exists $hash{$key}) ? $hash{$key} : [];
 push @{$ref_noname_array}, $value;
が適切だった。>>765 の書き方だと、push のたびに配列自体が増えちゃうように取れる(汗
・・・Perl は奥が深いっすついていけないっす(滝汗
771765:05/01/09 23:28:45
ああ、さらにすまん(死
my %hash = { ... }; で実体がコピーされる、というのは間違い。() と {} は明白に意味が違う。
あと、push @{$hash{$key}} = $value; の分解は、
 my $ref_noname_array = (exists $hash{$key}) ? $hash{$key} : [];
 push @{$ref_noname_array}, $value;
が適切だった。>>765 の書き方だと、push のたびに配列自体が増えちゃうように取れる(汗
・・・Perl は奥が深いっすついていけないっす(滝汗
772デフォルトの名無しさん:05/01/10 01:54:42
WindowsXP + ActivePerl5.8.6です。

@pattern = ({"aaa" => 0}, {"bbb" => 1}, {"ccc" => 2}, {"ddd" => 3}, {"eee" => 4});

foreach (0..1) {
foreach (@pattern) {
($key, $value) = each(%{$_});
print($key . "\n");
}
}

以上のようなコードを実行すると

aaa
bbb
ccc
ddd
eee
空行
空行
空行
空行
空行

このような出力結果になるのですが、
なんで2回目のループの出力がすべて空行に
なってしまうのでしょうか?
773デフォルトの名無しさん:05/01/10 02:05:08
>>772
お前のプログラムがそのようになっているから。

eachはハッシュ全部読み終わったら次には空リスト
を返すが、%{$_}は全て要素が1つのハッシュだから
2回目のeachでは空リストが返る。



774デフォルトの名無しさん:05/01/10 02:38:37
>>773
ありがとうございました。
こんなことでずっと悩んでいました。
もっと精進します。
775デフォルトの名無しさん:05/01/10 09:11:38
>>772
>>773 の人が言い尽くしてるんで蛇足かもしれないが、次のように一行追加すると意図どおりなんでないかな?

@pattern = ({"aaa" => 0}, {"bbb" => 1}, {"ccc" => 2}, {"ddd" => 3}, {"eee" => 4});

foreach (0..1) {
foreach (@pattern) {
values %{$_}; # これで、%{$_} が指すハッシュの each の反復履歴がリセットされる。
($key, $value) = each(%{$_});
print($key . "\n");
}
}

暗黙のうちに働いてくれる反復子は便利なのだが、リセット手段を知らないと思わぬバグを呼びかねない。
あと、ハッシュにキーを追加すると each の反復履歴がリセットされるというのはデマらしい。(今しがた実験した。)
776デフォルトの名無しさん:05/01/10 10:30:05
>>775
valuesでリセットできるのですね。
勉強になります。

while (($key, $value) = each(%{$_})) {
print($key . "\n");
}

今回はハッシュのキーが複数になる可能性があるので
こんな感じで解決しました。
777デフォルトの名無しさん:05/01/10 12:20:22
>>775
>あと、ハッシュにキーを追加すると
>each の反復履歴がリセットされるというのはデマらしい。(今しがた実験した。)

プログラミングperl第3版 p835 によれば、
反復子をリセットするには、ハッシュの要素をすべて読み込むか、
あるいは、keys %hash か values %hash を評価すればよい。
とあるよ。
要素の追加・削除に関しては、順番が保証されないとあるだけで、
反復子のリセット云々は記述がない。
778デフォルトの名無しさん:05/01/10 14:26:29
>>777 おめ。
要素の追加・削除に関しては、プログラミングperl第3版 p835 のもうちょっと下を読めば
『each 関数などによって繰り返しを行っている最中に、ハッシュに対して要素を追加したり削除したりした場合、その動作は保障されない』
とあるので、順番が保障されない以前に、each 反復子をあてにしてる状況では、要素の追加・削除はやっちゃいけないっぽい。

>>775 (関連して >>776)
each 反復子のリセットのためだけに values %hash や keys %hash を呼ぶのは時間効率・空間効率の点でどうか、と思わないでもない。
いや、each の実装次第だとは思うので断定はしないけど。(作成されたリストが内部的に保持され、有効活用されるのかも知れないし。)
一つのループ内でハッシュの全要素にアクセスするんなら、each なぞ使わずに
 foreach (keys %hash) { ($key, $value) = ($_, $hash{$key}); ... }
とかでどう?
779778:05/01/10 14:31:15
失礼、コード間違えた。正しくは
 foreach (keys %hash) { ($key, $value) = ($_, $hash{$_}); ... }
です。
780デフォルトの名無しさん:05/01/10 15:09:10
>>778
>一つのループ内でハッシュの全要素にアクセスするんなら、each なぞ使わずに

たださ、ハッシュの全要素にアクセスするのに、
while (($key, $value) = each(%hash)) {
処理;
}
を使うのは、もはや定型パターンだから。
クックブック第2版p194にも載っている。
なにも深いこと考えず、ぽんと当てはめればいいという利点があるよね。
(何事にもオライリーの権威に頼る会会長)
781デフォルトの名無しさん:05/01/10 15:17:12
>>778
keys,valuesをvoidコンテキストで呼べばeachのリセットだけ
やってくれるのでオススメ。perlfunc(1)のkeysのとこにも
明記されている。

As a side effect, calling keys() resets the HASH's internal
iterator, see "each". (In particular, calling keys() in void
context resets the iterator with no other overhead.)

782778:05/01/10 15:32:21
>>780 サンクスコ。実は効率の点からも、foreach (keys %hash) より each の方が優れていることが確認できますた _| ̄|○
foreach (keys %hash) ってコスト高いみたいね。
要素 40 万個の %hash で、
a: foreach (keys %hash) とした場合; b: each 使った場合; c: keys %hash でリセット後 each 使った場合
の 3 パターンをベンチしたら、所要時間が、a > b ≒ c ですた。
void コンテキストでの keys %hash は早いみたい。(void コンテキストでなくすと、c の速度は 3 秒増した。)

プログラム:
use Benchmark; use strict;
my %hash; for (my $i = 0; $i < 400000; ++$i) { $hash{"ke${i}y"} = $i; }
print "Start!\n";
timethese 10, { a => \&a, b => \&b, c=>\&c };
my @z; sub foo($) { push @z, $_[0]; }
sub a { @z = (); my ($key, $val); foreach (keys %hash) { ($key, $val) = ($_, $hash{$_}); foo($key); foo($val); } }
sub b { @z = (); my ($key, $val); while (($key, $val) = each(%hash)) { foo($key); foo($val); } }
sub c { @z = (); keys %hash; my ($key, $val); while (($key, $val) = each(%hash)) { foo($key); foo($val); } }

結果:
Benchmark: timing 10 iterations of a, b, c...
     a: 18 wallclock secs (17.66 usr + 0.09 sys = 17.75 CPU) @ 0.56/s (n=10)
     b: 13 wallclock secs (13.09 usr + 0.00 sys = 13.09 CPU) @ 0.76/s (n=10)
     c: 14 wallclock secs (13.84 usr + 0.00 sys = 13.84 CPU) @ 0.72/s (n=10)
783デフォルトの名無しさん:05/01/10 15:35:47
>>781
プログラミングperl第3版p872にも似た記述があった。

反復子をリセットしたい場合には、keysを無効コンテキストで
呼べば、これ(ハッシュ全体のスキャン)を回避できる。
784778:05/01/10 16:00:09
>>781, >>782 なるほろ。
リセット手段があくまで keys や values の副作用扱いで、しかも void コンテキストがからむというのがマニアック。
ここらへんの話は FAQ になりそうですな・・・
にしても、私のような不注意者が、each で反復中にキー追加したらどうすんだ!ヽ(`Д´)ノ
Perl6 に期待(えー
785デフォルトの名無しさん:05/01/10 16:07:03
>>782

(1) a だけさらに簡略化可能な余分な処理が入って
いることになぜ気づかないのか。
(2) 巨大配列生成に要する時間が要素数に対し不連
続要素があるかもしれないし、おそらくあるだ
ろうということになぜ気づかないのか。

786デフォルトの名無しさん:05/01/10 16:15:06
>>782
サブルーチンaはもっとシンプルにできるでしょう。

それから、foreach keys 対 each 問題は、eachの反復呼び出しのoverheadと
keysが生成する配列のコストのコンペだったはず。
エントリ数がもっと少ない場合は、また違うんじゃないか?
787778:05/01/10 18:19:34
あああああ、>>782 において、所要時間 a > c という結論は撤回します。人´Д`;)スマネ
>>785, >>786 の指摘通り、比較条件の設定がずさんでした_| ̄|○

a のループ内を { $val = $hash{$_}; foo($_); foo($val); } にして、
かつページングやスワッピングがない(もしくは無視し得る)ことをシステム時間が微小であることで確認し、
かつハッシュ要素数 40 x 反復 100000 回のケースも準備して
a, b, c の順序を変えつつ複数回計測実施してみますたら別な結論に(汗


[N=10, ハッシュ要素数 400000]
項番. a_usr  a_sys  b_usr  b_sys  c_usr  c_sys
   (a->b->c 順、3 回捨て)
04.  14.88 0.05 12.89 0.00 19.12 0.00
05.  15.11 0.00 13.02 0.00 17.16 0.00
06.  14.95 0.00 12.84 0.00 16.66 0.03
   (c->b->a 順、3 回捨て)
10.  14.80 0.00 12.91 0.00 16.80 0.02
11.  14.88 0.00 13.05 0.00 17.02 0.03
12.  14.67 0.00 12.80 0.00 16.72 0.08

結果: 所要時間 c > a > b と結論。
a_usr = 14.88±0.05 秒
b_usr = 12.92±0.04 秒
c_usr = 17.25±0.35 秒
a_sys, b_sys, c_sys とも無視し得る。(最大 0.08 秒)
788778:05/01/10 18:19:54
[N=100000, ハッシュ要素数 40]
項番. a_usr  a_sys  b_usr  b_sys  c_usr  c_sys
(a->b->c 順、3 回捨て)
16.  11.720.00 10.83 0.00 13.08 0.00
17.  11.80 0.00 11.08 0.00 13.61 0.00
18.  11.80 0.00 10.80 0.00 13.19 0.00
(c->b->a 順、3 回捨て)
22.  11.99 0.00 11.16 0.00 13.64 0.00
23.  12.00 0.00 11.52 0.00 13.67 0.00
24.  11.69 0.00 11.33 0.00 13.70 0.00

結果: 所要時間 c > a > b と結論。
a_usr = 11.83±0.05 秒
b_usr = 11.12±0.10 秒
c_usr = 13.48±0.10 秒
a_sys, b_sys, c_sys とも無視し得る。(最大時間 計測上 0.00 秒)

してみると、void コンテキストで key %hash; が速い説に疑問符がつくね・・・?
検定必要?
789デフォルトの名無しさん:05/01/10 18:43:13
暗黒のバッドノウハウが渦巻いているスレはここですか?
790778:05/01/10 19:00:12
やっちまった・・・_| ̄|○||| >>787 再度撤回。
>>787, >>788 の c は、ループ前にリストコンテキストで key %hash をやったケースでした。(いわば d。)
まとめると、結果は次の通りでした。やっぱ c の方法(void コンテキストで keys %hash 後、each(%hash))がおすすめ。
Rubyst にもあげようか。いいノウハウだから。>>789

[N=10, ハッシュ 400000 要素]
a_usr = 14.88±0.05 秒
b_usr = 12.92±0.04 秒
c_usr = 12.97±0.08 秒
d_usr = 17.25±0.35 秒

[N=100000, ハッシュ 40 要素]
a_usr = 11.83±0.05 秒
b_usr = 11.12±0.10 秒
c_usr = 11.56±0.03 秒
d_usr = 13.48±0.10 秒
791Rubyst:05/01/10 20:31:44
>>790
遠慮させていただきます。
792デフォルトの名無しさん:05/01/10 23:10:32
>>778 は気が済んだのかな?
レス >>787>>788 って、>>782 とくらべて a が中途半端に最適化されただけで、特に目新しい情報がないよね。
まあ個人的に >>782 のソース基に追試してみて、a > c なことはよほどのことでもひっくり返りそうにないことがわかったからもういいよ。
793デフォルトの名無しさん:05/01/10 23:13:38
流れを遮って申し訳ありません。
perl勉強中の若輩者ですが、諸先輩方のお知恵を拝借したく書き込みます。
ただいま、perl解説本と睨めっこしながら、プログラムを解読してる最中
なのですが、膨大なコードを理解できる部分から逆チャート化し、構造と
内容を判読しています。環境はメモ帳でコード開き、ノートにテンプレートで
流れを書き込み「ああ、なるほど!」と図解で理解を深める低脳児であります。
 そこで質問なのですが、
1.諸先輩方の開発環境はどんな構成なのでしょうか?
2.エディタなど活用されていらっしゃると思いますが、エディタ名などをご教授
いただけませんか?
3.長大なコードの全体像を掴むためにどのような工夫をなされておりますか?

諸先輩方は一目でコードを読破されておるとは思いますが
なにぶん、初学者な為、何事も一歩一歩 亀の如く理解してる次第であります。
794デフォルトの名無しさん:05/01/10 23:22:58
>>793
>1.諸先輩方の開発環境はどんな構成なのでしょうか?
WindowsXP、ActivePerl

>2.エディタなど活用されていらっしゃると思いますが、エディタ名などをご教授
いただけませんか?
MIFES Ver6

>3.長大なコードの全体像を掴むためにどのような工夫をなされておりますか?
技術評論社の「すぐわかるPerl」でPerlの基礎を学び、
同じく技術評論社の「CGI&Perlポケットリファレンス」を片手に
ソースを解読してました。
795デフォルトの名無しさん:05/01/10 23:23:28
>>793
1. MacOSX 10.3.7
2. Jedit4
3. コメント文を探す
796デフォルトの名無しさん:05/01/10 23:25:53
>>793
1. FreeBSD
2. vi
3. 初学者の段階で長大なコードの全体像なんて掴めるわけがない
797デフォルトの名無しさん:05/01/10 23:41:24
>>793
1.FreeBSD
2.vi(elvis),EmEditor
3.最初に大まかな処理の流れを読んでから適当にコメント入れていく
798デフォルトの名無しさん:05/01/10 23:56:30
>>790
面白いな。うちのマシンでは、要素数が2000以下だとaがもっとも早くなる。

結論: あまりこだわるとパラノイアになってしまう。

×いいノウハウ
○無意味なノウハウ
799デフォルトの名無しさん:05/01/11 00:02:02
>>793
1.FreeBSDでEmacs
2.Emacs
3.パッケージ名、サブルーチン名を検索しまくり。

> 諸先輩方は一目でコードを読破されておるとは思いますが
> なにぶん、初学者な為、何事も一歩一歩 亀の如く理解してる次第であります。

わたしは「Perlって何?」から自在になんでも書けるようになるのに
1週間くらいかかった。
大学の研究室のボスは、4時間でそこまで行った。

自分で書かないといかんと思うが。
デマンド/アルゴリズムからその記述法を導き出す方向を学ばないと。
800デフォルトの名無しさん:05/01/11 00:08:54
>>793
1. WindowsXP + ActivePerl (+ Mingw or Cigwin)

2. VisualStudio.NET 2003 (つい習慣で。あとバイナリエディタ使いたさで。)
AzEdit V1.010228

3. まずは先頭から拾い読み後、>>795>>797 の併用。付け加えるとすれば、
 (1) シンボルのネーミングにも注目する。変数一つとっても、名前から意味が想像できると解読が早い。
 (2) 可能なら、モジュールを使った簡単なサンプルプログラムを書いて感じをつかむ。
(3) そのコードを好きになる。我を捨てる。
   読んでる間は家族も愛人も自分のコーディングスタイルも忘れて夢中になる。

なお 3. については >>796 の言ってることが私の認識に一番近い気がする。
工夫は人それぞれの適性であって、まずスタイルありきではない。
801デフォルトの名無しさん:05/01/11 00:59:49
sjisのテキストを読み込んで検索に使おうと思い、
2バイト文字のメタ文字を無効化する為に、

$str =~ s/([\x81-\x9f\xe0-\xfc])(.)/&sjis2reg($1,$2)/eg;

sub sjis2reg {
 local($j1,$j2) = @_;
 $j2 = "\\$j2" if $j2 =~ /[\[\\\]\{\|\}]/;
 $j1.$j2;
}

このような処理をさせようと思ったのですが、
動かしてみると
Unrecognized character \x81
というエラーになります。
バージョンは
This is perl, v5.6.1 built for MSWin32-x86-multi-thread
です。

何が悪いのでしょうか?
802デフォルトの名無しさん:05/01/11 01:02:56
あ、判った
切り貼りしたソースそのものに、全角スペースが入ってました
ではでは
803800:05/01/11 01:03:38
↑うわ感じ悪〜。ウソ 800 みたいじゃんかヽ(`Д´)ノ-3
それはそうとして、プログラム読むのも書くのも半分科学じゃなくて訓練の世界だと思うのよね。
Perl だからこう、というノウハウなんてあるのか?
804デフォルトの名無しさん:05/01/11 01:13:35
>>803
> Perl だからこう、というノウハウなんてあるのか?

Perlはたんとバッドノウハウがあるだろ。
$a と $b には警戒せよとか、
無理な拡張を繰り返して奇形化した言語だからね。
805デフォルトの名無しさん:05/01/11 01:39:35
>>804 ・・・そうだった。>>803 書いた瞬間痴呆に陥ってたよ。
Perl は(知ってれば)簡単に書けるのだが読みにくい。
初心者が読む言語としては、獅子がわが子を谷底に突き落とす勢いがある鴨。
806デフォルトの名無しさん:05/01/11 08:43:51
>.805
つーか、
一般の解説本には、誤った解説がごまんと載っていて、
オライリー本と照合すると、驚かされることが多い。
どうして、あんなに誤りが多いのか…
たぶん、perlの文法、ハナモゲラ説の原因は、
そんなところにもあると思われ。
ほんの一例を挙げれば、
正規表現の /sオプション (改行文字をマッチに含めるようにする)や
/mオプション (^ や $ のマッチの位置を変える)の説明さえ
間違っていたり(複数行マッチをする、とか)、
それどころか、 =~ さえ間違っていたりする
(マッチ対象を$_から変える。しかし、真偽を返す機能となっていたり)。
どうなっているのやら。
807806:05/01/11 08:53:06
>/sオプション (改行文字をマッチに含めるようにする)や

/sオプション (普段は改行文字にマッチしない . を、
改行文字をマッチに含めるようにする)や
808デフォルトの名無しさん:05/01/11 10:44:58
>>806
> たぶん、perlの文法、ハナモゲラ説の原因は、
> そんなところにもあると思われ。

Perlの解説書が一つもなかったころから、
みんなPerlのめちゃくちゃさを愛してただよ。

集まると「めちゃくちゃだよな〜」
寄ると「でたらめだよな〜」
と言いあって笑ってたのさ。
809デフォルトの名無しさん:05/01/11 12:33:55
1. Linux, cygwin on windows XP
2. emacs, meadow
3. 経験をつむ
エディタは、emacs以外は糞
810デフォルトの名無しさん:05/01/11 13:03:06
 皆様の多数のご意見に感謝の意を述べさせて頂きます。
諸先輩の知恵を拝見し先鞭たる愚かさに気がつく次第お恥ずかしい限りであります。

parl習得の目的は先のコードを解読し、力量及ぶなら自ずからコードを足したい所存。
目的まで早道として、先人のコードをお手本にするつもりでありました。反省
皆様の意見を心にし徒手空拳なれど、先人の遺産を頼らずに、稚拙ながら自作のコードを
練り上げます。その折、苦渋の末、解決策が見つからずお知恵を拝借しに参りますので
そのときは宜しくお願い致します。

1.先の質問に付随する疑問なのですが、プログラムの解読のイメージは
フローチャート化された発想が脳内に浮かぶのでしょうか?
それとも、日常会話の如く、判断材料として意識に吸収されるのでしょうか?
低脳なる私はコード→図的脳内イメージ変換しかできぬ愚直者なもですから...

811デフォルトの名無しさん:05/01/11 13:15:20
>>810
> 目的まで早道として、先人のコードをお手本にするつもりでありました。反省

いや、ある程度読むことも必要だけど、ほどほどにして、自分で書くことも
やらないと。

「やりたいこと」 → 「具体的なコード」

という方向の学習もしないとと。

> 1.先の質問に付随する疑問なのですが、プログラムの解読のイメージは
> フローチャート化された発想が脳内に浮かぶのでしょうか?

フローチャートなんて忘れろ。
812デフォルトの名無しさん:05/01/11 13:23:19
>>810
読みにくいから普通の日本語で書けよ。
感謝の気持ちとともにあらたまった言い方をしたいのなら、
単語は平易でもいいから謙譲語と尊敬語で通すように。
813デフォルトの名無しさん:05/01/11 13:28:17
>>793
1.Linux(slackware)側で編集する場合はvi
 最近はローカル(windows)で作成/編集してLinux側に転送
2.Linuxはvi
 Windows側ではWz-Editor4.0Fを使用
3.バックアップファイルにコメント書き入れ+手元でメモ書き
814デフォルトの名無しさん:05/01/11 13:34:14
>>810
まずは正しく perl と綴れる様になれ
815806:05/01/11 15:23:23
>>810
まず、perl自体は仕様の通り正確に動くし、
言語のバグなどはまずないといえるけど、
言語の仕様自体を知るということが、オライリー本以外では
非常に難しいということ。
文法の誤った解説は、(一般解説本の)極めて広範囲に渡っているし、
それが故と思うが、文法ハナモゲラ説さえ言われている。
ハナモゲラは大間違いで、仕様は正確に実現されているけど、
一般解説本を指南書とすれば、ハナモゲラと思うのは無理もない。
それと、処理の結果とかがどんなときに $_ に入るかなどを
知らないと、コードから直接もとのアルゴリズムを知ることは
無理。(なんでも $_ に入るわけじゃなく、仕様として正確に決まっている)
結論として、信頼できる基本的テキストとクックブックなどを
組み合わせるしかないと思う。
816デフォルトの名無しさん:05/01/11 15:57:33
処理系のソースも読んだことないのに、本を書くなんて
Lispじゃ考えられないのにねえ
817デフォルトの名無しさん:05/01/11 17:34:29
ソースなんぞ読まなくて良いからせめて仕様は把握してから執筆してくれ。
あとPerl4時代の遺物が邪魔。use strictは徹底しろ。
818デフォルトの名無しさん:05/01/11 20:34:34
オライリー本を読んで書けばいいんだよ!
819デフォルトの名無しさん:05/01/11 20:38:20
みんな、もっと添付ドキュメント読めや。
とても力が入ったドキュメントがいっぱいだぞ。
820デフォルトの名無しさん:05/01/11 20:46:08
添付ドキュメントってどこ?
821デフォルトの名無しさん:05/01/11 20:51:06
orz...
822デフォルトの名無しさん:05/01/11 20:55:19
>>819
だって、英語わからんし。
とはいえ、公開されてる和訳は役に立つことは立つ。
http://www.att.or.jp/perl/man/
とか。
ただ、これだけで理解できるかと言われれば、うーむ…
823デフォルトの名無しさん:05/01/11 21:04:22
和訳はたまに古いバージョンのをもとにしてることがあるから
原文も見たほうがいいよ。まるっきりウソを書いてるという
経験はないけど、新しい奴だとより説明が明確になってたり、
書いてないことが追加されてたりとかはよくある。
824デフォルトの名無しさん:05/01/11 21:05:04
添付ドキュメントだけで理解しろっていうのは、
辞書だけで語学を勉強するようなものな気がする。
普通は辞書を横に置きながら教科書をメインに読んで勉強するよね。
825デフォルトの名無しさん:05/01/11 21:09:21
>>824
べつにそれだけで勉強しろとは言っとらん。
オライリーオライリーとそればっかなので
添付ドキュメントに注意を促しただけ。

それに、チュートリアルもいろいろ入ってるよ。
826デフォルトの名無しさん:05/01/11 21:21:58
>>824
それはその通りだがおまいはたぶんもっと辞書をみたほうがいい。
多くの辞書で初学者向けの手引きにページを割いてる。
827デフォルトの名無しさん:05/01/11 22:02:45
>>825
と書いてから改めて見てみると、
チュートリアル、初心者向けイントロダクション、
クイックスタート、例示集などいろいろあるな。
faqはもちろん外せないし。
828デフォルトの名無しさん:05/01/11 22:13:56
もしも仕様が知りたいと言うことなら、perldocを読むべきだろうけど、
何より、CPANなどで手に入るモジュールを読むことがとても
勉強につながる(と思う)。
で、CPANのモジュールを読むきっかけとしては、Perlで何か動く
プログラムを作ることが大切かなぁ、、と。

>> 793
1. Linux か Windows
2. vi か メモ帳
3. 必要なところをすばやく見つけるのは技術。
  自分でそれなりに長いコードを書いたりすれば身に付くのでは。
829デフォルトの名無しさん:05/01/11 22:16:45
リチャード・ストールマンが perl を学ぼうとして、
付属のドキュメントだけでやって挫折して、
誰かがオライリーの本ならいいよ、というのを聞いて、
なぜあれがオープンソースじゃないだと悪態をついている
のを何かで読んだよ。

なぜストールマンは挫折したのか?
1 頭が悪かった。 2 付属ドキュメントが悪かった。

正解 性格が悪かった…
830デフォルトの名無しさん:05/01/11 22:17:15
「オライリー」とやらは糞。添付ドキュメントだけで十分。でFA?
831デフォルトの名無しさん:05/01/11 22:20:05
3で割り切れる数値の表示の仕方を教えてください
832デフォルトの名無しさん:05/01/11 22:31:52
>>831
100までの3で割り切れる数とかなら、こんなとこかな。
@result = grep !($_ % 3) ,(1..100);
print "@result\n";
833デフォルトの名無しさん:05/01/11 22:45:22
>>831
> 3で割り切れる数値の表示の仕方を教えてください

my $i = 0;
while (1) {
print $i++ * 3 . "\n";
}
# 終わらない。

え、ちがう?
834デフォルトの名無しさん:05/01/11 22:56:09
プラグマって何ですか?
835デフォルトの名無しさん:05/01/11 23:05:32
perl.com: Beginners Intro to Perl - Part 6
http://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.
836 :05/01/11 23:15:08
Windowsにてテキストファイルとバイナリファイルを判別する方法ってありますか?
837834:05/01/11 23:21:00
>>835
レス、サンクス。

>something special
これを詳しく。できれば日本語で。さらに例を挙げて。
838835:05/01/11 23:39:13
>>837 日本語だ、ほれ。深海に潜っているときに必要らしいぞ。

使用のように厳しいコマンドは pragmaと呼ばれます。
Pragmasはあなたのプログラムを動かすとき特別な何かをする
Perlインタプリタへの指示です。
使用厳しい、悪いソフトウェアを書くのをより困難にする2つのことをします:
それで、あなたはすべての変数(「厳しいvars」)を宣言します、そして、
あなたが潜水艦(「厳しい潜水艦」)を使用しているときPerlがあなたの
意志を間違うのをより困難にします。

プログラムで1か2つのタイプの厳しさを使用するだけでありたいなら、
あなたが 使用厳しいpragmaに彼らを記載することができますか、またはあなたは、
あなたが、より早く可能にした厳しさのいずれかすべてをオフにするのに特別な
ノー厳しいpragmaを使用することができます。
839834:05/01/11 23:46:42
>>838
なんか、悪かったよ。すまん。そしてサンクス。
use strict;みたいな挙動って事で思い込んでおくよ。
840デフォルトの名無しさん:05/01/11 23:56:59
>>836
> Windowsにてテキストファイルとバイナリファイルを判別する方法ってありますか?

それは主として「テキストファイル」をどう定義するかによるな。

とりあえずfile typeをチェックするモジュールにはFile::MMagicがあったりする。
841836:05/01/12 00:18:45
>>840
さんくすこ
ここで言うバイナリファイルはACSII文字以外のコード(文字?)が入っているファイルを指します

しかし、使い方というか返り値がよくわからん・・・
842デフォルトの名無しさん:05/01/12 00:27:52
>841
日本語はどうする
843デフォルトの名無しさん:05/01/12 00:31:51
>>833
ワロタ



……疲れてんのかな俺
844デフォルトの名無しさん:05/01/12 00:49:17
>>836
微妙に気になったんだが、Windows上のPerlにて だよな?
845デフォルトの名無しさん:05/01/12 00:56:29
use strict submarine...;
846デフォルトの名無しさん:05/01/12 00:57:17
use yellow submarine;
847デフォルトの名無しさん:05/01/12 00:58:04
...厳しい潜水艦;
848デフォルトの名無しさん:05/01/12 01:02:50
>>841
そういうシンプルなので良いのなら、昔から、ある程度先まで読んで、
最上位ビットが立っているバイトがあったらバイナリと看做すとか
いうアドホックかつ確率的な方法が用いられていたが……
849デフォルトの名無しさん:05/01/12 03:07:35
windowsなら拡張子で判別しろや!
850デフォルトの名無しさん:05/01/12 10:00:15
ラクダ本初版だっけ、には最初の 1000byte くらい読んで
20% の非 ASCII があったらバイナリと判定する、なんて記述を見たような...
851デフォルトの名無しさん:05/01/12 15:00:07
-B filename
で出来るよ 精度悪いけど
852デフォルトの名無しさん:05/01/12 21:28:00
オレオレ Larry・・・いえ、何でもありま栓。

処理系のソースを読んでから本を書くなんて
Perlじゃ考えられないねえ

というのは冗談だが、内容が内容なだけに Perl 処理系のレキシカルアナライザ( 相 当 部分)を読む者は摂食障害を起こすらしいYO。(by O'LEILLY 本 第3版)

ところで、出遅れた話題で恐縮なんですが、Eclipse (epic) の名前が出てこないけどあれは糞なんどうなん?
もっとも漏れは(改行問題には目をつぶるとして)SJIS でコメントや自分用 pod を書ければいいのであって別に Visual Studio + コマンドプロンプトのままでもいいんだけど。
853デフォルトの名無しさん:05/01/12 21:36:34
>>850
プログラミングperl第3版p115によれば、
ファイルテスト演算子の -B や -T は、ファイルの最初の約1ブロック分の
データを調べて、コントロールコードや最上位ビットが立っている文字
(UTF-8に見えないもの)を捜し、そのような文字が3分の1よりも
多ければバイナリ、そうでなければ、テキストファイルと判定するということだ。
あと、最初のブロックの中に、ASCIIのNULL文字(\0)が含まれている
ものは、バイナリファイルと判定する。
ほかにも判定基準があるようだが、このへんでいいだろ。
854デフォルトの名無しさん:05/01/12 21:45:40
>>852
Eclipseってよく知らんけどさ、
RADツールとかIDEとかは懲りて、止めにしたという人も多いと思うよ。
結局、開発元が開発やめたら、そのコードはどうにも
ならなくなるんだよな。
EclipseのライバルだったとおぼしきvisualCafeとか、
この世から消えてなくなったよねぇ。
Beansとかだって、最近はどうなんだい?
天下のSunがやってるにしては、名前も聞かない。
Eclipseはいつまで持つんだろう?
マイクロソフトだったら大丈夫というもの、それだって、
怪しいもんだ。VisualBasicやってた人たちも .NETになって、
ずいぶん肩身がせまくなって困ってるみたいだし。
IDEとかRADで一番困るのは、言語は同じはずなのに、
ほかのツールで作られたものと組み合わせられない。
エディタだけで書けるのが、一番だよ。
855デフォルトの名無しさん:05/01/12 22:19:10
一般のエディタでVSのIntellisenceが使えたらいいなぁ
856デフォルトの名無しさん:05/01/12 22:25:49
>>854 さんくスこ。つまり、Eclipse は今が旬であると理解し田(<電波受信
しかし、『RADツールとかIDEとかは懲りて、止めにしたという人も多い』から
『開発元が開発やめ』るんだとしたら再帰的で巣わ(笑)
IDE 相乗的にだめぽ。
857853:05/01/12 23:43:02
>>840 のいうFile::MMagicは、これだよね。
http://perldoc.jp/docs/modules/File-MMagic-1.21/MMagic.pod
ファイルテスト演算子とは、機能的にどうなんだろうかね。
使ってみれば分かるんだが、もう眠いし…。
858853:05/01/13 00:16:28
http://www.cmagazine.jp/q/old.html#index17
より引用。
Q. バイナリファイルの判定
たとえば、ASCIIコードと改行などわずかなコントロールコードだけで構成される
ファイルの場合、プレーン・テキストだと類推できます。

また、ほとんどのバイナリファイルには特徴的なコードが埋め込まれているので、
そこからどんなタイプのファイルなのかを知ることができます。たとえば、
「%PDF-1.3」で始まる文字列が書き込まれていれば、Acrobatで読むことのできる
PDFファイルであることがわかりますし、先頭に「#!/bin/sh」とあれば
シェルスクリプトです。

バイナリの実行ファイルなども同様で、OSなど実行環境に特有のコードパターンが
書き込まれています。このパターンを「マジック」あるいは「マジックナンバー」と
呼びます。UNIXの file (1) コマンドは、「ファイルシステム>マジック>言語」の
順でチェックを行い、ファイルの種類を判別しています。

マジックにはたくさんの種類がありますので、ぜんぶ自分で調べてプログラムを
つくっていては骨が折れますから、file(1)でも参照しているマジックナンバーの
リスト(/usr/share/magicなど)を利用するとよいかもしれません。
859853:05/01/13 00:18:43
(引用続き)
●簡単な方法はない。文字コードを調べていく
その前に「何がテキストで、何がバイナリか」という問題があります。
ASCIIテキストファイルだけなら話は簡単なのですが(それぞれのバイトが表示可能か
どうかisprint()関数で調べていけばよい)、日本語など、一文字に複数バイトを使う
言語のテキストファイルだと難しくなってきます。とくに日本語は文字コード
(表現方式)が複数あるため、違う文字コードを想定すると読むことができません。
また「ちょっとだけデータが壊れているテキストファイルをどう扱うか」という問題
もあります。

結論を言うと、簡単な方法はないと思います。あらかじめ文字コードを想定し
(JIS、シフトJIS、EUC、Unicodeなど)、その方式に合致しているかいちいち判別しな
ければならないようです。文字コードの構造、判別方法は煩雑すぎるのでここでは
説明できません。参考資料などを見てください。

もう寝る。それじゃ。
860デフォルトの名無しさん:05/01/13 00:24:22
エディタしか使えない漏れには
相対的にIDE使ってるやつらが眩しく見えるのだが…
861デフォルトの名無しさん:05/01/13 00:34:37
Perl 板 isprint。(本当か?
my @visible_chrs = split(//,
   "\t\n\r"
  . ' ,!"#$%&\'()*+,-./'
  . '0123456789:;<=>?'
  . '@ABCDEFGHIJKLMNO'
  . 'PQRSTUVWXYZ[\\]^_'
  . 'abcdefghijklmno'
  . 'pqrstuvwxyz{|}~'
);
my %isprint = ();
foreach (@visible_chrs) {
  $isprint{$_} = 1;
}
で、$isprint('x') とかして使う予定は未定。
862デフォルトの名無しさん:05/01/13 00:44:02
>>860
> エディタしか使えない漏れには
> 相対的にIDE使ってるやつらが眩しく見えるのだが…

そういう時は、IDEを使ってみるといいです!!

わたしゃ、IDEは、自転車の補助輪のようなもんという認識だが。
863デフォルトの名無しさん:05/01/13 00:46:51
補助輪の再発明
864853:05/01/13 00:55:09
>>861
違〜う!
そりゃ、CマガジンのQアンドAのページからの引用だって。
アルゴリズムの部分が参考になると思って、
引っ張ってきただけだってば。
>>857 のFile::MMagicの解説
http://perldoc.jp/docs/modules/File-MMagic-1.21/MMagic.pod
だけど、そこにマジックナンバーってあるでしょ。
>>858 の引用でそれがなんのことか分かったじゃん。

頼む、寝かしてくれ…
865デフォルトの名無しさん:05/01/13 01:04:27
>>864 いやすまん。それはわかっていた。
ただ読んでるうちに、Perl に標準で <ctype> 系関数が付いないと知ったときの困惑と怒りを思い出したまでだ。
866デフォルトの名無しさん:05/01/13 01:12:07
>>860
Eclipseは perl でも利用できるんだから、
ぜひ人柱として挑戦して、レポートしてほしかったりしますが。
867デフォルトの名無しさん:05/01/13 01:14:53
IDE は地球を救うが
Perl は救わない。
なぜなら、全 Pealer が手にしたオライリー本が地上の山や川や木を(ry
868デフォルトの名無しさん:05/01/13 01:56:44
メモ帳派少ないな
869デフォルトの名無しさん:05/01/13 03:29:28
最低限の機能しかないからな
870デフォルトの名無しさん:05/01/13 03:55:11
ぶっちゃけメモ帳つかうくらいなら ed つかう。
871デフォルトの名無しさん:05/01/13 08:35:05
windows98 で cygwin の perl 5.8.6 を起動すると、
PERL.EXE ファイルは
欠陥エクスポート NTDLL.DLL:atoi にリンクされています。
と出て、使えないんですけど、どうすれば使えるようになるでしょうか。
872デフォルトの名無しさん:05/01/13 09:00:45
Visual Perlって使うと幸せになれますか?
いつもWindows機上で作成して、Linux機上で動作するperlスクリプトを書いているんですが。
873デフォルトの名無しさん:05/01/13 13:07:19
>>872
最初っからLinux機上でスクリプト書けば良いじゃん?
874デフォルトの名無しさん:05/01/13 13:49:36
>>873
様々な制約から作業環境はwindowsという点は変更できないのです。
875デフォルトの名無しさん:05/01/13 15:26:11
>>874
IDEを使うことによって、
なにが出来るようになることを期待してるか、を
はっきりさせないと。
どういうことを期待してるのかなぁ。
単にOSの壁を乗り越えるということならば、
perlはそんなもの必要としてないし。
それと、IDEはコードの製作方法を押し付けてくるからね。
まず、作ろうとするコードがデザインパターンのなにに
あたるかとか、そういうところから始まって、
フィールドは何? メソッドは何? とかね。
それで、RAD機能を売り物にするツールなら、
裏でコードを自動生成してくれるけど、
良し悪しいろいろだから…。ありがたがるか、うんざりするか。
Cプラプラとか、Javaならなけりゃやってられないだろうけど、
perlでIDEはどうだろうかねぇ。
876デフォルトの名無しさん:05/01/13 15:58:31
亀レスだけど...
>>484
デフォルトでは Latin 1 だけど、use encoding で文字コードを
指定すると、そのコードになるようだ。
perluniintro の Legacy Encodings を読んでて気づいた。
877872=874:05/01/13 17:21:28
>>875
OSの壁に関してはおっしゃる通り期待しておりません。
何を期待しているか?と問われると、現状特に不満がないので何も期待していません。
ならいいじゃん?って言われるとごもっともなのですが、
私の想像外で、実際に使って思いがけなく「こんな所が楽になる」というお話が聞ければ…
と、思い質問した次第です。

と、ここまで書いて「一度使ってみれば?」と、自分にレスしたくなりました orz

878デフォルトの名無しさん:05/01/13 17:26:28
pack関数の意味がよく分からないので
解説をお願いできませんでしょうか?
バイナリデータというのもよく分かりません。
879デフォルトの名無しさん:05/01/13 17:31:42
>>865
普通、正規表現の [:print:] とか使わない?
880デフォルトの名無しさん:05/01/13 17:55:18
881デフォルトの名無しさん:05/01/13 18:03:55
>>880
そのページどうやってみつけた?
882デフォルトの名無しさん:05/01/13 18:12:50
883880:05/01/13 18:23:55
>>881
>>882にperlと付けてググっただけ。
884878:05/01/13 18:32:58
>>880
ありがとうございます。読ませていただきました。

読んでいて使い方は少しずつ分かってきたのですが、
「バイナリ構造体にパックする」というのが
何のことなのかさっぱり分かりませんでした。
885デフォルトの名無しさん:05/01/13 18:57:47
>>884
基本的には、なにかとデータをやり取りするときに、
データの型とサイズを保証するために使うんだと思うよ。
たとえば、データベース(DBMとかRDB)とやり取りするとき、
データがある型にはまってないと、えらいことになるわけ。
1レコードに入っているのが55バイトで、それは、
最初の何バイトが文字型で、それから何バイトが数値型で、とか。
それが狂うと、めちゃくちゃになっちゃう。
だから、データを登録するとき、packを使って、
サイズとか型を保証するの。
データを出すときも、(packを使って登録したんだから)、
unpackすれば、正しく取り出せるという寸法だよ。
886デフォルトの名無しさん:05/01/13 19:25:59
バイナリ構造体 = pack(型指定文字列,パックするリスト値)

パックするリスト値の型を、型指定通りに解釈するとバイナリ構造体になりますよ
って程度に覚えれば十分。
887デフォルトの名無しさん:05/01/13 19:46:22
配列データをバイトサイズにパックして、もとに戻す例:

my @bin = (0x48, 0x65, 0x6C, 0x6F, 0x21, 0x0A); # 6 要素の配列。メモリ上のイメージは複雑で、perl 処理系にしか解釈できない。

my $str = pack('C*', @bin); # @bin の各要素を、バイトサイズに「パックする」
print $str; # すると、"\x48\x65\x6C\x6F\x21\x0A" という文字列になる。(つまり "Hello!\n")
       # これは C で書かれた関数やシステムコールにも(1バイト文字の列として)解釈できる。

my @bin2 = unpack('C*', $str); # unpack でもとに戻せる。(@bin2 は、@bin と同じになる)

もちろん 'C*' 以外を使って、バイトサイズ以外のパックもできる。
888デフォルトの名無しさん:05/01/13 20:00:30
特に関数でもないのに
{
 数行
}
{
 数行
}
という書き方をすることのメリットを、
889デフォルトの名無しさん:05/01/13 20:07:29
変数のスコープを、
890デフォルトの名無しさん:05/01/13 20:10:22
>>888
裸のブロック( naked block)のことかね。
それは、そこだけ有効なローカル変数が使えるということ
なんじゃない?
それと、裸のブロックは制御構造も提供する。
たとえば、lastで抜けることが出来る。
891デフォルトの名無しさん:05/01/13 20:46:19
あくまで一例だが、例えば、次のような使い方とか。
my @a = (0, 1, 2, 3, 4);
{
 local $" = ', ';
 print "@a\n"; # これは、"0, 1, 2, 3, 4,\n" として表示される(ちょーわかりやすい)。
}
print "@a\n"; # これは、"0 1 2 3 4\n" として表示される。(後を濁さない)

同様のテクは $[ なんかでも使うね。漏れは。
892デフォルトの名無しさん:05/01/13 20:49:09
>>876
え、そうなん!?
確かめなくちゃ。
893デフォルトの名無しさん:05/01/13 21:23:26
pack,unpackは確かに俺も昔は意味分からんかった
バイナリ構造体にパックすると言われてもバイナリ構造体が何かも分からんし、パックするとは何をすることかも分からんかった
まぁパックした(とおぼしき)データをファイルに書き出して、バイナリエディタで覗いたりして何とか理解できたなぁ
>>884
やってみそ
とりあえず型指定子のHが理解できれば他も似たようなもんだ
894デフォルトの名無しさん:05/01/13 21:35:55
>>892
#! /usr/bin/perl

use strict;
use Devel::Peek;
use encoding 'Shift_JIS';

my $s0 = pack('C0C*', 0x90, 0x7E);
my $s1 = pack('U0C*', 0xE6, 0x88, 0xBF);
Dump($s0);
Dump($s1);

my $s = $s0 . $s1;

Dump($s);

とすると、$s0 は Shift_JIS として扱われて UTF-8 に変換され、元から
UTF-8 の $s1 と くっついて $s になるのが確認できる。
895デフォルトの名無しさん:05/01/13 21:39:20
ていうか、perl でバイナリエディタ作るとき使うのは unpack だったりする罠。
use utf8;
my @file = <>;
foreach (@file) {
 my $hex_line = unpack('H*', $_);
 print "$hex_line\n";
}
896895:05/01/13 21:40:25
言い忘れた。>>893 おめ(ヲイ
897884:05/01/13 23:15:50
皆さんどうもありがとうございます。

pack関数でつまづいたのがURLエンコードのところだったので、
>>880の3つめのリンク先の、

(1)
$char = "%83%7E%83P%83l%83R";
$char =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("H2", $1)/eg;

(2)
$char = "%83%7E%83P%83l%83R";
$char =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1) )/eg;

この(1)と(2)について詳しく教えていただきたいです。
どちらも変換後の$charは「ミケネコ」になるようですが、どういう処理なのか
よく分かりません。変換前の$charには「l」とか「R」とかが含まれているのに、
それらはどこで変換されているんでしょうか?
>>887の「バイトサイズにパックする」というのもイマイチよく分かりません…。
とりあえず、型指定文字(?)の「H」と「C」について知りたいです。
よろしくお願いいたします。
898デフォルトの名無しさん:05/01/13 23:37:28
>変換前の$charには「l」とか「R」とかが含まれているのに、それらはどこで変換されているんでしょうか?
これはサイトが間違ってると思われ
899デフォルトの名無しさん:05/01/13 23:55:29
>>897
分解して考えませう。まず (1) の pack("H2", $1) の理解のため、ためしに pack("H2", "2A") を実行してみれ。
つまり次のコードだ。
print pack("H2", "2A"), "\n";
すると画面には "*" が表示されるね。すなわち上の pack は、'*' という文字のキャラクタコード 0x2a を返したことになる。

この例で、pack の第 2 引数に与えた "2A" というバイト列を、
「上位ニブル-下位ニブルの順に並んだ16 進 2 桁とみなせ」という意味なのが型指定子 "H2"。
pack はそうやって解釈してできた数値を返す。
(正確には本来、数値のリストを返すんだが、この例では型指定子 "H2" が 0x00〜0xff までの数値 1 個しか作り出せないので、'*' 一文字だけが出力された。)

なお "H2" にはこのように 2 文字分の解釈しかしないので、たとえば
print pack("H2", "2Al"), "\n";
だと、末尾の 'l' は単に無視される。サイトがまちがってるにしても、結果は'ミケネコ'。

あとは自力でがんばれ。超がんばれ。
900899:05/01/14 00:14:10
>>897 スマン、嘘書いといて超がんばれもないな・・・
> 正確には本来、数値のリストを返すんだが、
この部分間違い。pack が返すのはスカラーですじゃ(unpack と混同した)。
「数値のリスト」は「バイト列」に読み替えてちょ。
901デフォルトの名無しさん:05/01/14 00:17:01
> >>887の「バイトサイズにパックする」
これは感覚的にわかるけど、正しい言い方はどうなん?
この伝でいくと、1234 という十進数の unpacked BCD 結果である 0x1234 を指して、
「ニブルサイズに pack した十進数」と言えてしまうわけだが。
902デフォルトの名無しさん:05/01/14 00:29:23
>>897
なにをどうしたいのか、よく分かんないけど、
packはともかく、もしurlエンコードをしたいというなら、
それ用のモジュールを使うことで解決かと。
車輪の再発明をしても仕方ないし。
HとかCとかいったってさ、単に16進文字列と
char型(1バイト長符合なし整数)というだけなんじゃ?
H2なら、それが2バイトとちゃうん?
C言語の型に直してるというだけだよね???
(C言語、よく分かってない奴だから、怪しさ100%!)
903デフォルトの名無しさん:05/01/14 02:33:40
>>855
> 一般のエディタでVSのIntellisenceが使えたらいいなぁ

Emacsの上に高度開発環境を実現するパッケージで、Intellisenseも入れているのが
あるな。
904デフォルトの名無しさん:05/01/14 04:04:33
>>904
エディタの普通の入力補完じゃダメなの?
たとえば、サクラエディタでは、
設定メニューのタイプ別設定から、支援タプを選ぶと、
入力補完用のファイルを選べるんだが、ここで、
サクラエディタのファルダの中からperlのキーワードの
ファイルを選んで設定しておくと、
最初の1文字か2文字で該当するperlのコマンドの一覧が
出てくるよ(コントロールキーとスペースキーを押すとね)。
w を推すと、while とか 頭に w の付くコマンドが出てくる。
(warn wait wantarray とか、数えたら全部で6個だった)
普通のエディタのこういう機能で十分じゃないの?
それ以上の機能のことを言ってるの???
905デフォルトの名無しさん:05/01/14 04:15:06
>>904
だれにたいして言っているの?
906デフォルトの名無しさん:05/01/14 04:47:53
>>903
> > 一般のエディタでVSのIntellisenceが使えたらいいなぁ
>
> Emacsの上に高度開発環境を実現するパッケージで、Intellisenseも入れているのが
> あるな。

と思ったら、Perlはサポートしてないな(まだ?)

CEDET - Collection of Emacs Development Emvironment Tools
http://cedet.sourceforge.net/semantic.shtml

のことだが。

他にもあるかな?


907デフォルトの名無しさん:05/01/14 04:49:50
>>904
> エディタの普通の入力補完じゃダメなの?

しらん。

> 最初の1文字か2文字で該当するperlのコマンドの一覧が
> 出てくるよ(コントロールキーとスペースキーを押すとね)。
> w を推すと、while とか 頭に w の付くコマンドが出てくる。

Emacsのperl-modeはもっと毛むくじゃらなこともできる。
みんな最初は「すげ〜、すげ〜」と驚嘆するが、やがて
オフにする。
908デフォルトの名無しさん:05/01/14 05:03:06
>>907
> Emacsのperl-modeはもっと毛むくじゃらなこともできる。
> みんな最初は「すげ〜、すげ〜」と驚嘆するが、

どうやるの、おせーて。
909デフォルトの名無しさん:05/01/14 05:03:50
>>907
> > エディタの普通の入力補完じゃダメなの?
>
> しらん。

( ゚д゚).....baka?
910デフォルトの名無しさん:05/01/14 09:37:45

質問だぜ
wantarrayみたいなコトをやりたいんだけど、
関数の呼び出し元が「ハッシュ」で求めてるか「配列変数」で求めてるかを
関数側で認知したいんだけどどうしたらいいんだい?ベイビー


911897:05/01/14 09:39:24
お世話になっています。

>>899を元にして自分で色々やってみたところ、pack("H2", "2A")では「*」が表示されましたが、
>>897の「ミケネコ」に関しては、どうしても自力では理解できそうにないです。

とりあえず、(1)と(2)を実行すると確かに"%83%7E%83P%83l%83R"は「ミケネコ」になるので
サイトは間違っていないようなのですが、文字コードの変換ができるやつで調べてみたところ、
16進コードは次のようになっていました。

ミ→837E ケ→8350 ネ→836C コ→8352

"%83%7E%83P%83l%83R"を見ると、「P」や「l」や「R」が入っていて意味不明だったのですが、
これの16進コードがちょうど次のようになっていました。
(だから何?というのはちょっと分からないんですけど…)

P→50 l→6C R→52

それで、pack("H4", "837E")は「ミ」になるのは何となく分かりました。
この第2引数のところを「83P」、「83l」、「83R」にしても、それぞれ「ケ」「ネ」「コ」には
なりませんでしたが、「8350」、「836C」、「8352」にすれば「ケ」「ネ」「コ」になりました。

そしてpack("H2", "83P")も「ケ」にはなりませんが、
$test = "83P";
$test =~ s/([0-9a-fA-F][0-9a-fA-F])/pack("H2", $1)/eg;
とすると何故か$testが「ケ」になりました。

これはどういうことなんでしょうか? ますます分からなくなってきました。
どなたかご教授お願いいたします…。
(※16進数についてはほとんどよく分からないので何か間違っているかもしれません)
912デフォルトの名無しさん:05/01/14 11:19:23
>>911
いいセンいってますなあ。置換演算子 s///eg の働きを考えればゴールに到達すると思うよ。たとえば
$test = "%83P";
$test =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("H2", $1)/eg;
において、
1. s///eg の働きにより、$1 として pack に渡るのは "83" だけ。(<重要)
2. その "83" が pack により "\x83" というデータ(0x83 という数値の1バイト表現)に置換される。
3. 従って、$test の内容は、"\x83P" となる。
4. 'P' のキャラクタコードは 0x50 だから、"\x83P" eq "\x83\x50"。すなわち 'ケ' となる。

>>899 が 『'l' は無視される』とか言ってたけど、これは半分しか正しくない。
(1) の例全体でみると、s///eg の働きにより、実際に 'l' が pack に渡ることはない。(上の例の 'P' のごとく。)
仮に pack に渡されたとすると、無視されるんだが、実際には渡されないのでそのまま残る。
んで、最終的に 'l' は文字コードの一部なんであって、無視されるわけではない。

>>910
$ref_hogera が何かへの参照であるとして、ref $ref_hogera としてくんな。
配列なら 'ARRAY', ハッシュなら 'HASH' と返る。
(配列でもハッシュでもないなら、それ以外の文字列が返る。)

>>901 しょうもないツッコミ。unpacked と packed が逆。
1234 --> 0x12, 0x34 というバイト列(すなわち "\x12\x34") で表現するのが packed BCD。
1234 --> 0x01, 0x02, 0x03, 0x04 というバイト列(すなわち "\x01\x02\x03\x04" で表現するのが unpacked BCD。
913910:05/01/14 11:50:51
>>912
勘弁して下さい。
普通に関数からの代入で戻り値を取りたいです。
914デフォルトの名無しさん:05/01/14 12:33:02
>>913
CPANのWant.pm
コンパイルが必要だが。
915デフォルトの名無しさん:05/01/14 14:33:37
>>914 今しがた pod install Want.pm で最新版をインストールしたんだが、ドキュメントの SYNOPSYS に間違いがあるっぽい。
サブルーチン foo の中の want('LIST') を want('ARRAY') に変えて、その次の行の (1, 2, 3) を [1, 2, 3] に変えると動いた。
my %hash = %{foo()};
print "$hash{bar}\n";# 23 と表示される。
my @array = @{foo()};
print $array[2];# 3 と表示される。
916デフォルトの名無しさん:05/01/14 15:47:26
Win2000SP4、Perl5.8.4 なんですが、
最近 Time::Local の timelocal がエラーを出すようになり、
どうもその原因が localtime の引数に負の値を入れると undef になることのようなのです。
(undef の変数で計算しようとするため Use of uninitialized value in ... と言われる。)
print(localtime(-1)); をテストすると、linux や solaris では
595981070400 が表示されるようですが、Windows では何も表示されません。
しかし最近までは Time::Local でエラーは出ていなかったので、
この現象はなかったと思うのですが、他にW2Kで同様のエラーが出る方はいますでしょうか?
最近の変化といえばWindows Updateが幾つかあったことくらいですが、
それがlocaltimeに影響を及ぼすということがあるんでしょうか…?
917デフォルトの名無しさん:05/01/14 20:28:28
>>871
perl を 5.8.6-2 に入れ替えたら、windows98でも使えるようになりました。
918デフォルトの名無しさん:05/01/14 21:05:32
>>915 は、手前の脳の間違いを直したほうが良い。
919デフォルトの名無しさん:05/01/14 22:21:50
>>911
横からだけど、ちょいと思ったことを。
H2 とは、そもそもなんだろう?
そもそも、1バイトは、0〜255の間の256段階が取れるよね。
0(10進)は00(16進)で、255(10進)はff(16進)となる。

で、このHは曲者だと思うんだ。
ここで、ff(16進)があるよね。
どうも、(packにおける大文字の)Hは前の方(上位)のfで、
    (packにおける小文字の)hは後ろの方(下位)のfらしい。
(というのも、プログラミングperl第3版の記載によるんだが)

ミ→83 7E ケ→83 50 ネ→83 6C コ→83 52 を見てほしい。

いずれも16進数が4桁、(16進数が2桁で1バイトだから)、
ミも ケも ネも コも、それぞれ2バイト文字ということになる。

そこで H2 だ。
H2とは、この最初の16進数二つのこと。(ミケネコのいずれにも共通の83)
つまり、H2の2とは、2バイトの2じゃなくて、その半分の1バイトなんだ。

だまされるところだった。

後ろの16進数2つを扱うには、
小文字の h2 を使う。

そういうことだと思うんだが、違うんだろうか?
(プログラミングperlの訳が、このあたり曖昧。
 おそらく原文にははっきりそう書いてあるんだろうと思う)

このあたりはC言語の型を流用してるんだと思うから、
Cの分かる人は、すぐ分かるんだと思うな。
920デフォルトの名無しさん:05/01/14 22:31:57
>>919
上位下位というよりもオーダーだろ
Hは上位下位の順、hは下位上位の順
だからH2とすれば上位4bit、下位4bitの順で16進値が出てくる、と
pack("H*", "837E8350836C8352")
こういうことが出来るし
921デフォルトの名無しさん:05/01/14 22:33:53
>>920
>だからH2とすれば上位4bit、下位4bitの順で16進値が出てくる、と
これじゃunpackだorz
16進値を上位4bit、下位4bitの順で割り当てる、と読み替えてください・・・
922910:05/01/14 23:23:22
そうですか。
今回は諦めることにしたぜ。
923919:05/01/14 23:55:56
ああ、違う違う、なにをやっているのか。
日本語は2バイトなんで、頭がこんがらがるから、英数字のみを
考える。アスキーコードというやつだな。

たとえば、A のコードは41(16進数)。
http://hp.vector.co.jp/authors/VA016117/c/memory2.html

というわけで、英数字は全部1バイトだから、
00(16進数)〜ff(16進数)で表される。(ちなみにこれは、10進数の0〜255のことだよね)

ところがここで、16進数の二桁をばらして考えるんだな。

16進数一桁は、0.5バイトであり、4ビットでもある。1ビットは on off の2値だから、
2の4乗で16ということだ。実は、ニブルとも呼ばれるらしい。
さて、ここで出てくるのが、pack の H と h 。

A のコードである41 を 41 の順でpackするのが H。
A のコードである41 を 14 と逆順でpackするのが h。

これは、
$temp = pack("H2",83); # 大文字のH2
$result = unpack("h2",$temp); # 小文字のh2
print $result;
とすると、83 と入れたのが 38 と出てくるので、確認できる。

H h にしろ、2単位で(H2 あるいは h2)で1バイトだから、
2単位ではじめて英数字1文字を扱えるというわけだ。
日本語だったら、2バイトだから、H4 あるいは h4で
はじめて1文字扱えるということになるね。

ややこしいね。失礼、一人相撲だね。
あら、レスくれてた方がいた。つき合わせて、ごめん。
924デフォルトの名無しさん:05/01/15 00:02:46
        ヽ|/
      / ̄ ̄ ̄`ヽ、
     /         ヽ
    /  /  \   │
    | (彡) ( ミ)|||  |
  \ | // ̄⌒ ̄ヽヽ  |
 ハァー |  | .l~ ̄~ヽ |   |
  / | ヽ  ̄~ ̄ ノ   |
    |    ̄ ̄∪    |
925デフォルトの名無しさん:05/01/15 00:28:37
どなたか頼みます。
926デフォルトの名無しさん:05/01/15 00:40:50
>プログラミングperlの訳が、このあたり曖昧。
ラクダ本「バイナリと16進数のパックでは、countは、生成されるバイト数ではなく、ビットやニブルの個数を表す。」

(゚д゚)
927デフォルトの名無しさん:05/01/15 00:47:28
それじゃただの(゚д゚)ウマーだ
928デフォルトの名無しさん:05/01/15 00:47:47
レスが長くて読みたくないが、「とにかく*つける」と
覚えとけばあんたらの処理には問題ないんじゃないのか?
929911:05/01/15 01:18:12
ありがとうございます。
あともう少しで分かってきそうです。

>>912の1は分かります。2、3もほとんど分かりました。

でも4のところが分かりません。
"\x83P"と"\x83\x50"をprintで見てみたところ、どちらも「ケ」になりましたが
前者("\x83P")が何故そうなるのかがよく分かりませんでした。

これは最初のpack関数の話からそれているかもしれませんが、
よろしければ解説をお願いいたします。
930デフォルトの名無しさん:05/01/15 01:21:22
>>929
http://e-words.jp/p/r-ascii.html
Pの16進のところ見ろ
931デフォルトの名無しさん:05/01/15 01:42:20
>>925
何を?
932929:05/01/15 17:46:15
>>930
Pの16進コードが0x50なのは分かるのですが、
print "\x83P";
では、pack関数みたいなものも使っていないのに、
どういう処理で「P」→「\x50」と変換されるのかが分かりません。
print "P";
だと普通に「P」だけが表示されるのに。
print文は、前の文字が16進数だと後の文字も16進数に変換する…とかでしょうか?
933デフォルトの名無しさん:05/01/15 18:27:10
>>932
まずマルチバイト文字がどういうものかわかってないようだね
この場合、文字コードはShift JISなわけだけれど、その構造が、
1バイト目が81〜9F、E0〜FCなら次のもう一バイトとあわせてひとつの文字になる。
で、「ケ」という文字は83 50なわけだけれど、ここから83をとってやると50が残る。
50は単体出てくるとPという文字になる。
逆に、Pの前に83を取り付けてやると、ケになる

それとPと\x50が等価というのもわかっているか怪しい文面だな・・・
Perlは文字列リテラル中に\xHHがあると、それを1バイトの文字に展開する。
だから"P"と"\x50"は同じもの
934デフォルトの名無しさん:05/01/15 19:14:23
いつもはDTM板にいるけど、間違って違う板クリックしたら、
何を言ってるのかさっぱりわからん。かっこいいなおめーら
935デフォルトの名無しさん:05/01/15 20:13:58
漏れも、多分 >>910 がやろうと思ってることをやりたくてちょっと試してみたんですが、
いかんせん >910, >912, >913, >914, >915, >918, >922 のやりとりは断片的すぎて漏れの理解でいいかわからないので確認させてください。

1. >910 がやりたいのは
   @array = foo(); と、
   %hash = foo(); を foo の中で区別すること。
  いわば「配列コンテキスト」と「ハッシュコンテキスト」の区別。

2. >912 が言ったのは、
  foo(\@array) とか foo(\%hash) とかしてリファレンスを渡してやれば foo の中で区別できるじゃん、ということ。

3. >914、>915、>918 を総合すると、
  (ppm install Want.pm として) Want.pm をインスコすれば、@{foo()}、%{foo()} の区別ならできる。
  いわば 「配列へのリファレンスのコンテキスト」と「ハッシュへのリファレンスのコンテキスト」の区別は可。
  ただし、SYNOPSIS は間違ってはいない。(>915 が期待動作を誤解してるだけ。)
  もっと凝った区別もできるのだが、1.はできない。

4. 結局 1. ができなさそうなので、質問者が >922 で投了を宣言した。

でいいんかな?(@◇@;)
「まちガッチョル」とか、「1.はこうすれば実現できる」とか、「〜という理由で、1.は不可能」とか言う人、います?
936デフォルトの名無しさん:05/01/15 21:21:20
>>935
>3.
は実際に Want.pm を試して確認したんだろうな?
937935:05/01/15 21:39:42
>>936
確認した。疑う気持ちはわかるんだが(漏れも信じられんので)、@{foo()} と %{foo()} が区別できるのよ。
基本的に >>915 が言った通りだなんだが、完全なサンプルを示すと
use Want;
sub foo() {
  if (want('ARRAY')) {
    return [1, 2, 3];
  } elsif (want('HASH')) {
    return { foo => 17, bar => 23};
  }
}
my %hash = %{foo()};
print "$hash{bar}\n"; # 23 と表示される。
my @array = @{foo()};
print $array[2];    # 3 と表示される。

Want.pm をインスコすると、Want.dll というモジュールが付いて来るんだがこの中で怪しいことをしてるらしい。
Want.dll は、多分コンパイル済み中間コード?かな?(まさかネイティブコードでないよね・・・)
938デフォルトの名無しさん:05/01/15 21:57:56
>>936 >>937
これだよね?
誰か、解析、よろしく。
http://search.cpan.org/src/ROBIN/Want-0.08/Want.pm
939デフォルトの名無しさん:05/01/15 22:42:09
>>937
>Want.dll は、多分コンパイル済み中間コード?かな?(まさかネイティブコードでないよね・・・)
そのまさかでそ。Want.cなんてものついてるし
940デフォルトの名無しさん:05/01/15 23:27:27
941デフォルトの名無しさん:05/01/15 23:56:42
ひとり言…。
やれやれ、呼ばれているサブルーチンから、
呼び出し先の型を見分けるのか。
perl の中には内部的な型がいろいろあるわけだけどさ、
それは基本的に、ref関数で返されるよね。

SCALAR
ARRAY
HASH
CODE
GLOB
REF
LVALUE
IO::Handle

ところが、perlにおけるすべての値は、SV(スカラー値のこと)から
派生したクラスのメンバーとして扱われる。
すべての値は、実はC言語の SV*ポインタ ということらしい。
うーむ、ややこしい。
ただ、ref で見分ければ十分じゃないのかなぁ。
942935:05/01/16 00:19:14
>>940
ほーこれが噂の perl エクステンションですか・・・
ここらへんの話は私は不勉強なので、私個人はぼちぼちやるつもり。
他の質問とかレスとかある方は「話の腰を折るんじゃ・・・」とか気にせずドゾー。

今のところ、次のことがわかっちる。
1. v5.6.1 built for MSWin32-x86-multi-thread (Win32 環境の ActivePerl)では、ppm install Want.pm でインスコがオールOK。

で、次のことを実施した。
1. ttp://search.cpan.org/CPAN/authors/id/R/RO/ROBIN/Want-0.08.tar.gz をダウソして解凍。
2. v5.8.5 built for cygwin-thread-multi-64int (Cygwin) で perl Makefile.pl 実行。
3. Makefile ができたので、make。
4. Want.c ができた。

Want.c 解読完了予定はマターク未定。今日はもう寝る。

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

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

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

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

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

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

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

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

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

後半の所は、P = \x50を理解した後に試すと解るが、
83 50 50 50 というバイナリのファイルをエディタで見る、若しくはケPPPというファイルをバイナリで見れ。
954941:05/01/16 11:36:22
>>948 では、ベテランのお前が、これを説明せいや。
楽勝でわかるんだろ。え?!(まあ、俺でもなんとなく分かるけどな)
PERLGUTSより SV の操作
 SV は、1 つのコマンドで生成し、値をロードすることができます。
 ロードできる値の型には、整数 (IV)、倍精度 (NV)、文字列 (PV)、
 その他のスカラ (SV) があります。
 これらを行なう、4 つのルーティンは:
SV* newSViv(IV);
SV* newSVnv(double);
SV* newSVpv(char*, int);
SV* newSVsv(SV*);
 です。 「既に存在する」スカラの値を変更するために 5 つのル
 ーティンがあります:
void sv_setiv(SV*, IV);
void sv_setnv(SV*, double);
void sv_setpvn(SV*, char*, int)
void sv_setpv(SV*, char*);
void sv_setsv(SV*, SV*);
955941:05/01/16 11:42:31
>>954 は、これが分からんと、
want.pmの謎を説く基礎になるんじゃないか、
ということだからな。
初心者なんで、優しく頼むぞ。ボケ
956941:05/01/16 11:52:58
待ってんだけどな。

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

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

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

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

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

本来なら50012件ぐらい、ヒットするはずが
「初心者向け検索」というタイトルの真っ白なエラーページに
飛ばされてしまいます。フォームデーターは完璧だと、思うのですが
もし解析できるかた、解決できる方いらっしゃったらhelp!
968デフォルトの名無しさん:05/01/16 19:59:35
HTTPDの機能を持つライブラリとかありますか?
POPfileとか、あれどのように実現してるんでしょうか?自前で組んでるんですか?
969デフォルトの名無しさん:05/01/16 20:06:11
>>967
use LWP::UserAgent;
my $ua = LWP::UserAgent->new(
 agent => "Mozilla/8.0",
);

my %formdata = (
 STYLE => 'search',
 S_WORD1 => '画像処理',
 R_TYPE1 => '02',
 BE_SEARCH => '検索実行',
 sTime => time * 1000
);
my $res = $ua->post( $url, \%formdata );
print $res->is_success ? $res->content : 'Error.' ;

http://search.cpan.org/~gaas/libwww-perl-5.803/lib/LWP/UserAgent.pm
の例文に習ってこんな感じでいーんじゃないの?
970デフォルトの名無しさん:05/01/16 20:11:38
>>969
あらやだ、
my $url = 'http://www2.ipdl.ncipi.go.jp/begin/be_search.cgi';
が抜けてたorz

ちなみに漏れの名前で検索したら出てきたyo. orz
971デフォルトの名無しさん:05/01/16 20:14:11
>>969
うーん...だめみたい。
他に誰か特許庁のHPから特許検索を自動化したことある人いないかな…?
972デフォルトの名無しさん:05/01/16 20:16:21
>>969
use LWP::UserAgent;
my $ua = LWP::UserAgent->new(agent => "Mozilla/8.0");

my %formdata = (
STYLE => 'search',
S_WORD1 => '画像処理',
R_TYPE1 => '02',
BE_SEARCH => '検索実行',
sTime => time * 1000
);
my $url = 'http://www2.ipdl.ncipi.go.jp/begin/be_search.cgi';
my $res = $ua->post( $url, \%formdata );
print $res->is_success ? $res->content : 'Error.' ;

perlから、以上のコードを実行してみたんですが、普通にwebから
検索したときのように結果が返ってこないんです。うーん……
973デフォルトの名無しさん:05/01/16 20:24:48
>>971
まずまともに検索できるブラウザでどういうやりとりを
してるか調べて、それをなるべく忠実に再現するのが
一番じゃないかな。

ありがちなのは

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

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

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

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

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

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

…父はPerlは知らないので、もしも何か間違っていればまたご指摘下さい。
この度は色々とありがとうございました。
978デフォルトの名無しさん:05/01/16 21:41:33
>>971
次のリクエストで通ったよ。というわけで、UA や Referer チェックは今のところしてないらしい。(Set-Cookie 時は知らん。)
クッキーはずすとだめ。

POST /begin/be_search.cgi HTTP/1.1
Host: www2.ipdl.ncipi.go.jp
Content-Length: 74
Cookie: Name=BE11105876026 StartTime=...(省略)... LADDR=xxx.xxx.xx.xxx;

STYLE=search&S_WORD1=%89%B7%93x%92%B2%90%DF&R_TYPE1=02&sTime=1105877528381

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