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

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

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

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

過去ログは>>2-4あたり
2クンクン(葬式):04/01/15 16:28
過去ログ

Perlについての質問箱
http://pc.2ch.net/tech/kako/1017/10177/1017736187.html
Perlについての質問箱 2箱目
http://pc3.2ch.net/tech/kako/1033/10336/1033688230.html
Perlについての質問箱 3箱目
http://pc2.2ch.net/tech/kako/1041/10412/1041205885.html
Perlについての質問箱 4箱目
http://pc2.2ch.net/tech/kako/1048/10485/1048519394.html
Perlについての質問箱 5箱目
http://pc2.2ch.net/tech/kako/1053/10530/1053053082.html
Perlについての質問箱 6箱目
http://pc2.2ch.net/tech/kako/1060/10606/1060689008.html
Perlについての質問箱 7箱目
http://pc2.2ch.net/test/read.cgi/tech/1068051036/l50

クククのクーソ
3クンクン(葬式):04/01/15 16:28
[プログラミング自体の経験が無い奴はまずココを読め]

Perlプログラミング講座: http://www5a.biglobe.ne.jp/~n_rieko/perl/

[本]
リャマ: http://www.oreilly.co.jp/BOOK/lperl3/
駱駝: http://www.oreilly.co.jp/BOOK/pperl3v1/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/BOOK/pcook/

[オンラインマニュアル]
・Perldoc.com: http://www.perldoc.com/
・perldoc.jp: http://www.perldoc.jp/
・perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/%7ekbk/perl5.005/

[モジュール]
・CPAN.com: http://search.cpan.org/
・河馬屋二千年堂: http://member.nifty.ne.jp/hippo2000/

[テクニック]
・Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
・Perlのページ: http://homepage1.nifty.com/nomenclator/perl/

クククのクーソ
2get!
できなかったら漏れの裸画像(チヌチヌ付きモザイク無し)曝します!!
5前スレ953:04/01/15 17:28
レス下さったかたがたありがとうございました。
解決しました。

Perlメモさんとこの日本語の正規表現
ttp://www.din.or.jp/~ohzaki/perl.htm#Character
で、まっちぱたーんでうまくいきました。

ところで、Excelで文字列の最初の引用符(')がセルに表示されないんですけど、これって表示させるようにできますか?
>>5
> ところで、Excelで文字列の最初の引用符(')がセルに表示されないんですけど、これって表示させるようにできますか?

あんた、真正の馬鹿?
新スレおめ。
>>5
完璧にスレ違いだが、
先頭に ' を打つと、文字列とみなされる。
001 は 1 だが、 '001 は 001 と表示される。
>>5からここはExcelについての質問箱スレに変わりました
10デフォルトの名無しさん:04/01/16 01:58
こんばんわ。早速質問させて下さい。
Perl/Tkの練習でアプリケーションランチャーを作ってみたのですが、どうも上手くいきません。
ボタンをクリックするとアプリケーションが起動するようにしたいのですが、
何度クリックしても一番最初に呼んだアプリケーションしか起動せず、
一番最初に起動させたアプリケーションを終了させないと別のアプリケーションが起動しません。
どうすれば複数のアプリケーションを起動させることが出来るでしょうか?
それと、作ったランチャーが別のウインドウの裏に隠れると表示が崩れてしまうのには
どのように対処したらよいでしょうか。

#!/usr/bin/perl
use Tk;
$top = MainWindow->new();
$top->title("1");
$top->Button( -text =>"kterm",
-command => sub {
system(kterm);
},
-fg => "blue"
)->pack;
$top->Button( -text =>"exit",
-command => sub {
exit;
},
-fg => "blue"
)->pack;
MainLoop();
11名無し募集中。。。:04/01/16 03:12
うにくすはほとんど忘れたけどバックグラウンドで起動するようにしなきゃいけないんじゃ?
ぐあ、鬱だ。。。
2ちゃんねるのログから2ちゃんねる語だけを抜き出して
抜き出した2ちゃんねる語のバイト数を数えるプログラムを作りたいのですが、
正規表現を使っても、indexサブルーチンを使っても上手くいきません。
検索する2ちゃんねる語(約2000 1行1語)は、2chword.txtとして用意してあり、
プログラムで開く事は出来ます。
検索されるログは仮にtest.txtとして開いています。

同様に名前欄が名無しか否かの判定と、AAのバイト数も検出しなければいけないのですが
上のプログラムが出来れば何とか自分で頑張れそうです。
行き詰まって数日経ちます。藁をもすがる思いで質問します。
よろしければお教えください;;
1413:04/01/16 20:15
すみません補足します。
test.txtは、1行に1レスの構成要素(レス番号・名前・メールアドレス・
日付日時・書き込み内容)がHTML形式で含まれています。

どうぞよろしくお願いします。
何が問題で、どこを教えて欲しいのよ。
あと2週間かけてPerlの本を通読すべきだろうね。
まったくだ
sub tohex {
my $data = shift;
my $return;
$return = "";
for($i=0;$i<length($data);$i++) {
$return .= "\\x".uc(unpack("H2",substr($data, $i, 1)));
}
return $return;
}
$ARCHERstr = tohex('アーチャー');
$jARCHER = 1 if ($equip =~ $ARCHERsstr);
2013:04/01/17 00:46
先ほどは説明不足で失礼しました。
今現在出来ているプログラムのソースを上げたので、
もしよろしければ見て頂けると幸いです。

ttp://up.atnifty.com/upmini/oth/200401170037_2ch
ttp://up.atnifty.com/upmini/oth/200401170040_nanasilist.txt

上のファイルがプログラムのソースです。
nanasilist.txt以外にも読み込んでいるファイルがあるのですが、
アップローダの関係で上げれませんでした。

すごく恥ずかしいソースですが、回線で首吊って氏ぬ前に
perlの本100回は読んで来ようと思いますので、
何卒ご教授をよろしくお願いします。
諦めてはいませんが・・・友達少なく、本当に誰かに頼りたい気分です;;
>>20
別に100回読めとか鬼のような事は言わん
とりあえず3回読んで来い
>>13の人
たぶんね、俺もよくあったんだけど、単に正規表現がミスってるだけだと思う
一回検索したい語が本当にその正規表現でマッチするかテストしてみそ
>>13

s/2ch誤//g
を使用した後と
使用する前のサイズを比べれば・・・
>>13
なにがわからないんだ?
単語の検索方法がわからないのか?

検索単語が2000語あるんだったら、
普通に2000回 =~ で検索するしかないと思うんだが。
これからはじめようと思っているのですが、良い解説書はありますか?
いつもお世話になってます。初心者です。
掲示板を作っていて
ブラウザの更新ボタンを押すと前の書き込みまで書き込まれてしまいます。
どこが間違っているのか教えてください。
ソースはこれです
http://up.atnifty.com/upload/file/20040117215210_.txt
ご教授よろしくお願いします。
リロードするとPOSTデータが再送されてしまうのは
ブラウザの一般的な問題なんじゃないかなぁ。

自分は書き込み後、<META http-equiv="Refresh"> で飛ばして
強制的にGETに切り替えてるけど。
>>26
ジャンプさせるならLocationヘッダでもいいな。
どちらにしても板違いなのでsage
2913:04/01/18 01:15
13です。
先日からお騒がせしておりました。

あれから試行錯誤の末、なんとか自分のやりたい事を
perlで表現する事ができました。
レスを下さった方へ感謝の気持ちと同時に、報告したいと思います。
特に>>21さんや>>22さんの書き込みには励ましを感じました。
お忙しい中レスしていただき、本当にありがとうございました。
これからもプログラムを一生懸命勉強していきたいと思います。
30デフォルトの名無しさん:04/01/18 15:21
Jcode-0.82が手に入らない・・・鯖にアクセスできなくなってますか?orz
すぐに復旧するものなのか以前から利用できなくなってたのかわかりませんが、
後者だと非常にピンチなのでどなたかupしていただけないでしょうか・・・
>>30
Jcode-0.83 ではダメなのですか?
http://search.cpan.org/~dankogai/Jcode-0.82/
32デフォルトの名無しさん:04/01/18 16:50
>>30
ftp://ftp.cpan.jp/CPAN/authors/id/D/DA/DANKOGAI/
こんなのイロハだと思うけど、
テンプレを見てない質問はスルーしろよ。
C言語のscanfはどうすればいいですか?
getcで誤魔化してましたがちょっと無理が起こってきました
教えて下さい
>>34
具体的に何をしたいのかわからないけど、
<STDIN>とかで読んでおいてsplitや正規表現で処理すれば?
>>35
レスどうも
数字入力をさせたいんですが
テンプレのページに行っても書かれていなかったので
色々調べた結果
一列目を代入するgetcで代用していました
これから読んできます
ありがとうございました
>>35
出来ました
どうもありがとうございました
こんばんは、質問させて下さい。

下のプログラムにおいて、defined は必要なのでしょうか?
本にはこれがない場合、 0 のようなファイルがあると
そこで while が終了すると書かれているのですが、本当ですか?
ファイル名が 0 のファイルを作成し、defined を取り除いて実行させると
問題なくすべてのファイルが表示されます。

#!/usr/local/bin/perl -wT

use strict;
my $dir = ".";

opendir(DIR, $dir) or die "$0: can't open $dir: $!";
while (defined(my $f = readdir(DIR))) {
print "$f\n" if -f $f;
}
closedir(DIR);
>>38
Perl のバージョンによりケリー
>>39
ありがとうございます。
古い Perl を使わなければ問題ないということですね。
改めて考えてみると、どうして問題なく動くのか
あまりにも不思議だと思い、いくつかの Changes をみると、
Changes5.005 にそのことが書かれていたのですね。
____________________________________________________________________________
[ 900] By: nick on 1998/04/25 13:58:17
Log: Auto-insert defined() test in while when test expression is
readline (i.e. <>), glob, readdir, or each.
Branch: ansiperl
+ t/op/defins.t
! op.c pod/perlop.pod
____________________________________________________________________________

ソフトバンクより発売のCGI/Perlハンドブックという本で
http://up.atnifty.com/upload/file/20040120011644_.txt
こういったアンケート収集スクリプトがあるのですが
これを実行してもアンケートが追加されません。
どこが間違ってるのでしょうか?
>>42
マルチポストハケーン
44デフォルトの名無しさん:04/01/20 04:23
dbmopen(%TITLE, "title", 0644)
foreach my $key (sort keys %TITLE) {

$no = $key;
($title,$message) = split(/:/,$TITLE{$key});

&one_title;
}
って感じでハッシュのキーをソートた時に最後に
出力されたキーの値を知る方法はありませんでしょうか?
あ!寝ボケてました(汗
解決しました、、、。スミマセン、、。
46デフォルトの名無しさん:04/01/20 04:55
Perlの勉強をしているのですが、どうすれば出来るのか分からないことがあるので、
質問させてください。

http://www.din.or.jp/~ohzaki/perl.htm#SortMulti を見ながら、
「第1項でソートし,さらに第2項で降順ソートする」というのをやろうとしているのですが、
例えば、『第2項において上位2番目の値までしか残したくない。残りのデータは@dataに入れたくない。』
のです。

@data = map {$_->[0]}
sort {$a->[1] cmp $b->[1] or $b->[2] <=> $a->[2]}
map {[$_, split /,/]} @data;

ソート後のデータ
@data = ('A,9,紫',
'A,7,緑',
'A,2,黄緑', ←こういうデータを排除したい。
'B,10,黄',
'B,4,赤',
'C,6,青',
'C,3,青紫');

どのようにすれば、よいのでしょうか・・?
>>46
http://www.din.or.jp/~ohzaki/perl.htm#ArrayUnique

my %count;
@data = map $_->[0],
grep $count{$_->[1]}++ < 2,
sort { $a->[1] cmp $b->[1] or $b->[2] <=> $a->[2] }
map [ $_, split /,/ ],
@data;

第2項が同値の場合どうするかは適宜考えれ。
48ウホ:04/01/20 06:21

スクリプト中の eq を すべて == にしたら動かなくなったんで、ネットで調べたら

・ 条件の判定で文字列に 「==」 や 「=>」 などの数値演算子を使っている
・ 条件の判定で数値に 「eq」 や 「ne」 などの文字列演算子を使っている

という2行にめぐり合えたわけですが、ちと意味がわからんのです。
もちとわかりやすく説明してもらえますか?
マルチポストってなんですか?
51ヽ(´ー`)ノ:04/01/20 11:33
>>50
検索エンジンで検索する癖を付けよう。
あんま変な質問ばっかしてるとケツにぶち込むよ?
5350:04/01/20 12:12
ごめんなさい本当は知ってました
>>52w
5446:04/01/21 04:45
>>47
ありがとうございましたヽ(´ー`)ノ
ぅぅ、人に説明してたらわからなくなってきたので教えて下さい。

open FH, "> $file";
flock FH, 2;

open FH, "> $file2";
flock FH, 2;
print FH "hoge\n";
close FH;

$file をロックして次のファイル $file2 を、
同じファイルハンドルで開いてロックすると、
次のプロセスはどこでブロックされるのでしょう?
次のプロセスって何だ?
>>55
http://perldoc.com/perl5.8.0/pod/func/close.html
http://perldoc.com/perl5.8.0/pod/func/flock.html

open FH, "> $file";
flock FH, 2; # FH ($file) を排他ロック

# 自動的に FH ($file) を close (& ロック解除) してから FH ($file2) を開く
open FH, "> $file2";
flock FH, 2; # FH ($file2) を排他ロック
print FH "hoge\n";
close FH; # FH ($file2) を close (& ロック解除)
5855:04/01/21 18:37
>>57
> 自動的に FH ($file) を close (& ロック解除) してから FH ($file2) を開く

理解出来ました。ありがとうございます。
perldocも目を通させて頂きます。
59デフォルトの名無しさん:04/01/21 23:17
#include <stdio.h>
int sub_a(int i){i=10;return 0;}
int sub_b(int*i){*i=10;return 0;}
int main(void)
{
int a=1,b=1;
sub_a(a);sub_b(&b);
printf("%d %d\n",a,b);
return 0;
}

上のはC言語ですが、sub_aみたいな値渡しの仕方がわかりません。
perlではどのように記述すればよいのでしょうか。
>>3の所でsub_bみたいな参照渡しの方は分かったのですが。
>>59
明示的にコピーしてよろし。
sub foo { my ($arg1, $arg2, @argv) = @_; }

shift を好む人もいる
sub bar {my $arg1 = shift @_; }

速度的には少々不利だが可読性をageるやり方
&baz(arg1=>0, arg2=>'unko');
sub baz { my %arg = @_; print $arg{'arg1'}, $arg{'arg2'}; }
6159:04/01/22 07:02
>>60
分かりました。お答えありがとうございました。
Cでは参照渡しにする時&*を付け加えるので、Perlでは逆に値渡しにする時に
何か付け加えるのかなと思っていました。
ちょいと質問。
perl5.6 -> 5.8にアップグレードするに当たって
なにか気を付けなければならない事ってありますか?

サクッと調べた感じだと、日本語の扱いが大分変わったように思えたので、
その辺のコードに気を付ければ特に問題ないような気がするのだけれど。
# Encodeもじゅーるとか

他にこの辺注意しておいたほうがよいんじゃないか?
ってのがありましたらご教授承りたく。
63デフォルトの名無しさん:04/01/22 20:01
>>62
オイオイ
>>62
perldoc perl56delta
perldoc perl561delta
perldoc perl570delta
perldoc perl571delta
perldoc perl572delta
perldoc perl573delta
perldoc perl58delta
perldoc perl581delta
perldoc perldelta
日本人ならPerl5.8を標準にしてもいいんじゃないか?
5.0も5.6も廃止にしてもらいたい。
まだ 5.6 が動いてるってところは俺は知らんが……。
isweb は Perl v5.6.1 built for i86pc-solaris だね
6862:04/01/23 18:19
すまそん。。
公共の場所じゃなくて、社内なのですよ。
んで皆が好き勝手に書いてるモンですから、
変更する時は「ココとココとココ」に注意汁!
ってアナウンスしないとならなくて、、

>>64
ありがとうございます。
私も聞かれたらソコ案内する事にします。
# 自分の負担が減るのは良いことだ
とりあえずperl58deltaだけでも読むべき
emacsからperldocを見るときはどうすればいいですか?
使っているemacsのバージョンはCVS-Headです。
M-! perldoc XXX
だとmanを見たときのように"N^"といった記号が入ってしまいます。
>>70
人に聞く前にやることがあるだろうが。ボケ。
まずは man perldoc しろ。話はそれからだ。
>>71
なんで怒ってるのかな。怖いですね。
M-! PERLDOC='-otext' perldoc XXX
とすれば普通に見れるのは分りました。で、みなさん毎回
こんなことしてるんですか?
>>72
> なんで怒ってるのかな。
ググったらすぐ分かるのに、それをしてないからだよ。
二度とこのスレに組んな、ヴォケ。
$ cat > ~/bin/pedo
#!/bin/sh
PERLDOC='-otext' perldoc "$@"
$ chmod +x ~/bin/pedo

とでもすれば?
>>74
>>73 の通り。阿呆は放置。
ハッシュにはいった関数ポインタを、実行するのってどうやればいいんでしょうか
一度、変数に代入するとできるんですが。
こんなことを知っている方がいれば教えて下さい。

$func = sub{print 'aaaa'};
&$func();   # OK => aaaa

$hash{function} = sub{print 'bbbb'};
&$hash{function}();  # ×シンタックスエラー
&($hash{function})(); # ×シンタックスエラー

$func = $hash{function};
&$func();   # OK => bbbb
&{$hash{function}}();
7876:04/01/24 22:20
>>77
おおおおお!?マジですか!
↓こんなこと書いててできなかった。
&${$hash{function}}();
ありがとう!
79デフォルトの名無しさん:04/01/24 23:18
windows で Net::RawIDって使える?
もしくは Net::Pcap
8079:04/01/24 23:22
Net::RawIP だ。。
>>79-80
試したりドキュメント読んでから質問してる?
http://search.cpan.org/src/SKOLYCHEV/Net-RawIP-0.1/README
82デフォルトの名無しさん:04/01/25 15:45
-wをつけないと
Premature end of script headers:
でエラー
-wを付けると何事もなし
納得いかねえ!!! apache2で起こる
>>78
$hash{function}->();
use strict;

my $func = "FUNC";
&$func;

sub FUNC {
print "FUNC\n";
}

こんな感じのことをやりたいんですが、use strict 付きだと、
Can't use string ("FUNC") as a subroutine ref while "strict refs"
と言われちゃいます。
use strict のままで、きちんと解決する方法ってあるでしょうか?
かんべんしてほしい
あります
>>84
use strict; の意味を考えてから出直して来い
それでも分からんかったら use strict subs; を調べて来い

>>87
refs じゃない?
refsだな
9084:04/01/25 21:51
出直してきた。
あーなるほど。「Perl を使わないで Perl 使う方法無いですか」くらい変な質問でした。
本気で申し訳ない。

全然関係ないけど、これ調べてて小文字のみのモジュール名が perl の配布キットの
ために予約されてるって、初めて知った。へぇー。
9176:04/01/25 22:27
>>83
シンタックスエラー
てか、あろー演算子はblessかけた参照に対してしか使えないはず

>>84
解決してるっぽいけど単純に、
eval "&$func()";
じゃ駄目かね。と素人意見

つーか、refと言って、通じ合えるお前らは何者やねん
9276:04/01/25 22:28
refs だった。
>>91
ムチャクチャ言うな。

package Foo;
sub foo { print "Foo!\n" }

package main;
sub foo { print "foo!\n" }
my %hash = (foo => \&foo, bar => sub { print 'bar!' });

Foo->foo(); # Foo!
$hash{'foo'}->(); # foo!
(my $bar = $hash{'bar'})->(); # bar!
94デフォルトの名無しさん:04/01/25 23:33
perlで約数を計算するにはどうやれば良いんですか?
>>94
Math::Factor
試してないけど多分いける
>>82
改行がおかしいだろ?

>>91,93
バージョンによっては

$func->();

は使えなかったはず。
5.005はダメだったかな?

>>96
http://perldoc.com/perl5.8.0/pod/perl5004delta.html#New-and-changed-syntax
よって 5.003 以下だと駄目。
でも今や 5.003 なんて Perl4 よりレアじゃないか?
9877:04/01/26 04:34
>>91
>シンタックスエラー
>てか、あろー演算子はblessかけた参照に対してしか使えないはず

sub {print "OK\n"} -> ();
ラムダを定義してその場で評価したいときは83が示したこの書式の方が優れてるね。
&{}()形式だと定義自体を囲まなくてはならないのでごちゃごちゃする。
99デフォルトの名無しさん:04/01/26 10:09
適当なこと書くなよ>95
100デフォルトの名無しさん:04/01/26 10:25
100
open(FOO,"foo|") で、foo の STDERR への出力も取り込みたいのですが、
cshのそれっぽく open(FOO,"foo|&") みたいに簡単にやる方法はないですか?

自分でforkしてdupしてexecしなきゃだめ?
>>84
ブロックで一時的に無効にする
our $aya = 'pretty';
our $miho = 'aya';
{
no strict 'refs';
print ${$miho};
}
105デフォルトの名無しさん:04/01/26 23:48
マジで約数を計算するプログラム教えてくださいw
メールアドレスチェック みなさんは何使ってますか? また、お勧めはどれでしょうか?
@if ($in{'email'} && $in{'email'} !~ /(.*)\@(.*)\.(.*)/)

Aif ($in_email && $in{'email'} !~ /[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,3}/)

Bif ($in_email && $email !~ /(.+)\@(.+)\.(.+)/)
>>108
RFC的には正しいけど、shellが解釈するならば更に汚染チェックが必要。
11076:04/01/27 01:21
>>97
ほほう
# perl -e "print $]"
5.00307
・・・( ´_ゝ`)

>>83
スマァァァァン。まぢでごめんよ。レアもんだった。_| ̄|○
5.00307は軽くて好きなんだ。setup.exeが1.5Mだし。
print "Content-type: text/html\n\n";
@data = ("a", "9", "B", "b", "Z", "A", "c", "C", "1");
@data = sort { $a cmp $a } @data;
print "@data";

これを実行すると
"1 9 A B C Z a b c"
となるのですが、

"1 9 A a B b C c Z" または、"1 9 a A b B c C Z"
のような結果を得るにどうすればいいですか?
>>112
@data = map{substr($_,1)}sort map {pack'AA',lc($_),$_} @data;
114デフォルトの名無しさん:04/01/27 08:07
>>112
@data = ("a", "9", "B", "b", "Z", "A", "c", "C", "1");
@data = map{substr($_,1)}sort map {pack'AA',lc($_),$_} @data;
print "@data\n";
@data = map{substr($_,2)}sort map {pack'ACA',lc($_),$_ le 'Z',$_} @data;
print "@data\n";
>>113
>>114
どうもありがとうございます。
しかし、実は、配列の値には文字列などが入るのです。
Windowsのエクスプローラーのような文字列、または数字のソートは
できますか?

>>115
すみません。
数字のソートはできるのでした。
文字列のソートの方です。
応用もできないバカは帰れよ
>>112
@data = ("a", "9", "B", "b", "Z", "A", "c", "C", "1");
@data = sort { uc($a) cmp uc($b) } @data;
print "@data";
119118:04/01/27 10:04
こうのほうがいいか?
@data = ("a", "9", "B", "b", "Z", "A", "c", "C", "1");
@data = sort { uc($a) cmp uc($b) or $a lt $b } @data;
print "@data";

# =>1 9 a A b B c C Z
( ´_ゝ`)うーん、偶然できているような気がする

ちなみに>>118はこうでた。
# =>1 9 a A b B C c Z
>>110
せめて 5.005_03 使え。5.004 以下の挙動はアテにできん。
http://downloads.activestate.com/ActivePerl/Windows/5.005/Intel/APi522e.exe
>>115
「さらにフォルダかファイルかの属性もあって、フォルダを最初にもってきたい」
とか言いはじめたらヌッコロス。
122112:04/01/27 12:31
>>119
うおーーー
ありがとうございます。できましたー
うおーーーー
123106:04/01/27 20:41
質問の仕方が悪かったようです。
モジュール使わないで簡単なメールアドレスチェックをしたいのですが
あの3つの中でどれが一番いいのでしょうか
>>123
>>108 にある解説はモジュールを使っていないし、
どの程度(厳密|高速)なチェックが必要かによって答は変わるし、
>>106 の正規表現はどれもまともなチェックになっていない。

$in{'email'} に入っているのが addr-spec なら、かなりユル目で
$in{'email'} =~ /^[-\w.]+\@[-\w.]+$/ or error();

これ以上厳密にしたいなら RFC2822 読むか、素直に >>107
使っとけ。
12576:04/01/27 23:15
>>120
そうなのか。->() これ使えるならこれを機に乗り換えてもいいかもしれない。

>>123
どれでもいんじゃねーの?
仕事で顧客管理プログラム作ってます。
とかだったら慎重に選ぶべきだけど。
>>124 それユルくない。キツすぎ。
>>119
偶然じゃね。
@data = ("a", "z", "8", "K", "9", "B", "b", "Z", "k", "A", "c", "C", "1");
@data = sort { uc($a) cmp uc($b) or $a lt $b } @data;
print "@data";
でやったら、
1 8 9 a A B b c C k K z Z
って出たもん。
>>127
$a lt $bが1か0(undef)を返すからだろ。'A' lt 'a'なら1でそのまま、'a' lt 'A'はundefでそのまま。
っていうことで、意味なし演算。
@data = sort { uc($a) cmp uc($b) or ($a lt $b)?1:-1 } @data;
>>128
な、なーるほど。ありがトン。
Perlのsortって便利ですね。
130デフォルトの名無しさん:04/01/28 12:05
for と foreach は全く同じなんでしょうか?
>>130
同じ
for $in (@array){}
foreach($i=0;$i<10;$i++){}

どっちもいけるが、紛らわしのでしない方が良いと思うぞ
>>130
使い分ける意味は気分と可読性しかないな
133 :04/01/28 14:06
んと、

while(<>) {
if (/楽しいweb/i) { print; }
}

を、5.8.2用に書き換えようとして、

use encoding "sjis";
use open ":encoding(sjis)";
binmode STDERR, ":encoding(sjis)";

while(<>) {
if (/楽しいweb/i) { print; }
}

とやったら、実行時間が10倍以上かかるようになってしまいました。
何か対処方法とか、勘違いとかありますでしょうか?
>>133
速いCPU,HDを持つPCを購入する。
>>131-132
了解です。
UNIX系OSで、ソースファイルの先頭に
#!/usr/.......
とか打ち込んで、単体で実行させられるけど、

これWin98だとどうやればいいんですかね?
Win2000だと出来たんですが・・・・
>>136
ファイルの関連付けの問題
.plファイルをDClickするとperlが動くようにするべし
関連付けはやってる。
ファイル名を、hoge.plとした場合に、
コマンドプロンプトから
>hoge
と打って動くようにしたいんだけど、やっぱ無理か

もうひとつ質問する。どうも俺は基本的な事がわかってないらしい。
別に perl hogeと打ってもいいんだけど、
hogeを任意のディレクトリで動かしたい場合、どうすればいいですか?
いちいちそのディレクトリにコピーしないとダメ?


これもWin98の場合の話ね
>>138
プログラムに関係ありません。PC 初心者板か Win 板に行ってください。
>>138
簡単な方法は
pl2bat script.plでバッチファイルにする。
ただし、リダイレクトできなくなるけど。

>hogeを任意のディレクトリで動かしたい場合
パスを通しておく

141119:04/01/29 00:51
>>127 (;´_ゝ`)!

>>128 ('∀`*)ヾ

>>133 思い切って、漢字をつかわない。または5.00307をつかう。
cygwin入れラバ一発
>138
PATHEXT
win野郎が来ると場がしらける傾向にあるな
ActivePerlがあるからWindowsで普通にPerl使ってる香具師は多いでしょ。
>>144
MS-Windows以外でperlいじってる香具師はレベル高いんデシか?
なかなか結構なご持論で( ケッ
そもそもPerlとは関係ないのでスレ違いだから。
無関係ではないだろ・・・
答えたいやつはサラっと答える
無視したいやつはサラッと流す
それでええやん
いまの話って「bad interpreterって言われるんですけどぉ」とか言ってるのと同レベルだろ?
問題外ジャン
>>146
平均とったらそういう差は出るかもね。
Winのほうは、他があまり抱えない「能力もやる気も乏しい半端な人間」を
最も多く抱えていそうだから。
おまえら暇なのか?
暇なPerlerのためにもPerl6は必要なんだろな。
perl6イラネ。
. が文字列結合じゃないなんて糞。(そうじゃない)
> . が文字列結合じゃない
な、なんだってぇーーーー!
>>152
俺も驚いた
-> が . になったりとかな
オブジェクト.でつなぐの嫌いなんだよ・・・_no
Java に慣れてるので orz ではない俺は勝ち組。
しかしまぁ、Windows環境だと答えが Perlとは関係ない事が多いのも確かだ
それもFAQレベルの話ばかりだしな、ウンザリするのも分からんでもない
>>154
>-> が . になったりとかな
そうするとLarryが言ってたらしい。(DanKogaiソース)
. の代わりは ~ にすると。  orz
Perl使いのなかで、C,C++人口よりもJava人口の比重が高くなったっていう
ことの影響がでかいのかな。言語文化なものより。
漏れはC,C++,Javaどれもあさーくしか使ってないからわからん。
ちょいと質問なんだが、

@a = qw(a b c d e);って配列があるとする。(実際中身は変わる)
この配列で、値「c」が、何番目に入ってるかを(この場合は2ね)知りたいのだが、
こういう時ってどうしてる?
>>160
@check{@data} = 0..$#data;
print $check{'c'},"\n";
>>161
160じゃないけど目からうろこが落ちた
>>160 >>162
暇な時に perlfaq* を読む事を勧める。
164160:04/01/29 21:01
>>161
THX!!!
インデックス用のハッシュ作ってやっちゃったよ!
うろこどころか目が落ちるわ
○| ̄|_

>>161
@dataにcが2つあったらどうなる?
そもそも重複キーを許してるとダメ?
>>166
>>161は重複したデータがあったらダメ。
my @data = ('a', 'b', 'c', 'd', 'c', 'e');
my %check;

@check{@data} = 0..$#data;
print "$check{'c'}\n";

for my $i (0..$#data){
push @{$check{$data[$i]}}, $i;
}
local $"=',';
print "@{$check{'c'}}\n";
OSの時刻設定をperlから行いたい
どうすればいい?

OS:Windows
perl version:5.8

フォルダの日時設定できんのか
system ("date yymmhhmmss");

>フォルダの日時設定できんのか
ポカーン
>168
なにがしたいんだ?
OSの時間の設定なのか?
それともフォルダの作成、更新、アクセス日付の設定のこと?
PerlでCGIやってるのですが
リンクボタンが何回押されたかわかる方法ってありますか?
もしあるのでしたらその関数とか教えていただきたいのですが
よろしくお願いします。
173デフォルトの名無しさん:04/01/30 18:07
Perl でオイラが作った大笑いコードがあります。
次々とライブラリを呼んでいくだけです。
で、これに関して、これを実行するためだけの特別Perl環境を作りたいです。
どうしましょう。
ようは、使ってる *.pm ファイルの一覧を出し、それ以外のファイルをすべて削除すればいいと思うのですが。
じゃあ、その一覧ってどうやって出すんだ?。
174デフォルトの名無しさん:04/01/30 18:10
あと、いまはLinuxなんですが、
最終的に、Win32に持ってきたいです。
つーか、Windows用フリーウェアとしてネットで配布するために最小限Perl環境がほしいんだから。
この場合、やっぱ、ActivePerl を使うと怒られますよね。
「配布ファイルを一切変えるな!」とかが条件ですから。
やっぱ、cygwinを使うか・・・。めんどくせー。
>>173
あきらめろ
>>173,174
正直どこが笑いどころかさっぱりわからないのだが・・・・
漫才ブームの頃はもうちょっとレベル高かったような気がする。
>>171=>>174=>>174
PHP厨が今日も元気にPerlスレ荒らしですか?
>170
できれば
フォルダの作成時間と更新時間変更
>>180
それやっても更新日時変わらない
182デフォルトの名無しさん:04/01/31 11:48
>>181
OSは何なんだ。Windowsだけじゃわからんぞ。
まさか、Windows3.1じゃぁあるめぇな(w
>>173
keys %{main::}でmainモジュールのnamespaceが列挙できる。
その中で"::"で終わってるのがモジュール。再帰的になめていきゃ必要なモジュールの一覧作れる。
質問

掲示板スクリプトとかの
require './jcodeg.pl';
の働きを解説キボンヌ

これ削除するとどうなってしまうんですかね?
とりあえず削除してみれば?
>>184
サーバエラーになるから削除しちゃダメ!
そうゆうのは普通ローカルで試すだろ。

てか、板違い。
jcode.pl の働きくらい調べろよ。
read.cgi が生成する(のか知りませんが)
スレッドID 1074151549 は何をもとに作ってるんでしょうか?

日付ですかね? 知ってたら教えてください。もしくはread.cgi の
ソース公開してるところを知ってたら教えてもらえますか
>>183
おお、>>173じゃないけど、そんな方法があったのか。
191デフォルトの名無しさん:04/01/31 19:21
どうしても解らなかったので質問します

メインプログラム中から、外部プログラムを呼び出し
外部プログラムへデータを渡した後に
外部プログラムの標準出力の結果を
メインプログラムの変数に代入することって出来ませんか

下のようなソースで出来るかと思ったのですが
これだと、外部プログラムの結果が標準出力に表示され
変数には一切値が入りませんでした
どうか力かして下さい

open (COMMAND_HANDLE, "gaibu.exe|");
print COMMAND_HANDLE "aaaaaaa\n";
print COMMAND_HANDLE "bbbbbbb\n";
while(<COMMAND_HANDLE>){
$kekka .= $_;
}
close COMMAND_HANDLE;

ちなみに、外部プログラムの引数にデータを渡せれば一発解決しそうなんですが
外部プログラムは他の人が作ったプログラムでソースが無い為
標準入力からしかデータを受け付けません(TT
>>191
IPC::Open2かOpen3とか使うんじゃなかったっけ?
Winでもできるのかな?
>>191
"| gaibu.exe"
かな?
>>191
こんなかんじか?

open CMD, "echo -n \'aaaaaa\nbbbbbb\n\' | gaibu |";
while (<CMD>) {
...

DOSのTypeが改行受け付けるかどうかは知らんが。
jcode.plとJcode.pmって、
皆さんどっち使ってます?
11.pm
198デフォルトの名無しさん:04/01/31 21:21
>>191
昔、次のような事よくやってた。symdeb.exeはMS-DOSについてたデバッガ。

local *FILE;
open FILE,">act";
print FILE<<"TAIL";
n act
l
d
q
TAIL
close FILE;

open FILE, "symdeb < act |";
while (<FILE>){
print;
}
close FILE;
199191:04/01/31 21:22
>195

試してみたら見事に期待通り動いてくれました
ありがとうございます。
ActivePerlではalarmが動かない事に今まで気が付かなかった、鬱
>>189
C:\>perl -e "print time;"
1075555628

うーん、なんか数値的に近いし、多分システムから取れる積算秒数みたいだよ。
202デフォルトの名無しさん:04/01/31 22:34
>>200
ActivePerlじゃないが、うちのWindows用Perlでは使えるぞ。
>>189
1970年1月1日00:00からの経過病数だよ。
204デフォルトの名無しさん:04/02/01 00:08
173>>183 サンクス。基本的には解決しました。感謝。

ただ、どこかに、それを勝手にやってくれるユーティリティがあるっぽいんですが、
ご存じないですか?

あと、C でかかれたLibを使ってるやつがあると思うのですが、
.pm だけじゃなく必要なlib
(glibc とかパール本体が必要とするLibじゃなく、パールのライブラリが呼ぶLib)を
調べるのはどうするんですか?
>>196
Encode.pm使おうよ。
207デフォルトの名無しさん:04/02/01 13:17
質問させてください。
手元のマシンのパールから
ノーツサーバ上の漢字アドレス帳を読み出したいと思っています。
具体的にはどの辺のモジュールを入れればいけるのでしょうか?
もし御存知の方おられましたらぜひ教えていただけませんか。
208デフォルトの名無しさん:04/02/01 13:44
■2ちゃんねる閉鎖だってよ。
http://news5.2ch.net/test/read.cgi/newsplus/1075593174/595-596

595 名前: 名無しさん@4周年 投稿日: 04/02/01 12:31 ID:pYo6O9H3
       2ちゃんもう閉鎖するって本当?

596 名前: ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ [sage] 投稿日: 04/02/01 12:31 ID:???
       >>595
       本当。

■関連スレ
□祭りスレ
 http://news4.2ch.net/test/read.cgi/news/1075607876/
□議論スレ
 http://news5.2ch.net/test/read.cgi/newsplus/1075609399/
ActivePerlで子プロセスの終了を知る方法はありますか?
SIGCHLDというものがあるらしいのですが、ActivePerlではサポートしていないようで…。
>>182
Windows98SE
>>209
Win32::Process
>>210
WindowsXPなら出来るんだがね。残念だね。
95,98はMS-DOSのfunction callを使うと出来るそうだ。
グワンバッテ調べな。
並行アクセスHTTP クライアントを勉強と思ってActivePerlで組んだが壷にはまった。(^^;;
数時間に1回ハングする。
alarmで回避しようと思ったら、ActivePerlにはない!(涙
sysreadがブロッキングでハングしてるんだろうと思い、IO::Handle::blockを使おうと
思ったら、仕様(POD)には書いてあるが、コード(実物)がない!オイオイ。
これ以外にもワケワカメなことがあってチカレター。
>>213
話ずれるが、ネットワークプログラミングの勉強したいならLinuxでも使っとけ
>>212
Win2000+NTFSなら可能なのか?
Win98SE でも utime で更新時刻は変更可能。
ALARMはActivePerl80xだと大丈夫だった気がするけど。
試してみた?>213
>>216
ファイルではなくフォルダだ
>>213
標準モジュールのThread.pmを使ってみれば?
http://perldoc.jp/docs/modules/Thread-2.00/Thread.pod
220213:04/02/02 06:43
>>214
愚痴につきあって呉れてアンガトサン。でもLinuxインスコ面倒くせぇ(w

>>217
3年間更新が止まっているhttp://www.perldoc.com/perl5.8.0/pod/perlport.htmlによれば
win32ではalarmはサポートされていない(w
ActivePerl build808で次のコードは仕様通りには動きません。
my $timeout = 60;
alarm $timeout;
my $key=<STDIN>;
my $timeleft = alarm 0;
print $timeleft,"\n";

IO::Handle::blockingに関してはhttp://ftp.ics.uci.edu/pub/websoft/libwww-perl/archive/1998h2/0028.htmlの
パッチがエレガントで良さげ。でも、perlport.htmlによるとfcntlは Not implemented(win32)だそうだ(w
まあ、試してみるか。

>>219
サーバ書くときにThread使う積もり。サンクス
>>213
自分もいろいろやってみたが結局のところ、
$SIG{CHLD} = "IGNORE" してるにも関わらずゾンビプロセスが大量発生していると思われた。
どうしたかというと、forkしたときにチャイルドプロセスの数を数えておいて、
5個以上になったときに1つ分、明示的にwaitすることにしたら、動いた。
別の実装ならすまない。
222213:04/02/02 10:26
alarmに関してもう少々、WindowsXP ActivePerl build808で
http://www.perldoc.com/perl5.8.0/pod/func/alarm.htmlの例を書き換えて

use strict;
my $timeout = 5;
my $timeleft;
eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
alarm $timeout;
my $key =<STDIN>;
$timeleft = alarm 0;
};
if ($@) {
die unless $@ eq "alarm\n"; # propagate unexpected errors
# timed out
print "timeout\n";
}
else {
# didn't
print $timeleft,"\n";
}

を実行しても期待通りには動かない。
223213:04/02/02 10:27
>>222
alarm 続き

perlのソースのwin32.cを覗くと、
win32_alarmがsetTimerを使ってコーディングされていて戻り値は常に0に
なっている。戻り値に関してはラクダ本の記述とは違うコーディングになっている。
win32_async_checkの中でmsg.messageがWM_TIMERのとき$SIG{14}が
呼ばれるようになっていて、Config.pmを覗くとALRM==14らしいので
上のサンプルは動きそうなんだが..........................動かない。

setTimerをググルと「他のイベント実行中は割り込みがかかんない」
というような事を書いてあるとこがあった。VCにはあんまり詳しくないんで
識者の解説キボンヌ。
224デフォルトの名無しさん:04/02/02 11:18
>>221 レスどうもです。でも、私のとは違うやり方みたい、(^^;;;すいません、
>>213のコードはIO::Selectを使ってラウンドロビンでデータのやり取りをするというものです。
forkもthreadも使ってません。余計な手間を掛けたみたいで済まんこってす。概略はこんな感じです。
while (@$req_array || keys %socket_request) {
  while (@$req_array && keys %socket_request < $SOCKET_MAX) {
    $req = shift @req_array;
    ソケット$socketを作り関係付ける。
    $socket_reqest{$socket}=$req;
  }
  my @ready2write = $write_sel->can_write(0);
  for my $socket (@ready2write) {
    my $req = $socket_request{$socket};
    syswriteを使って$reqの内容を書き込み
  }
  my @ready2read = $read_sel->can_read(0);
  for my $socket (@ready2read){
    my $req = $socket_request{$socket};
    $bytes = sysread($socket, $buf, $BYTES_TO_READ);
    if (not defined $bytes) { エラー、サーバーからの切断など}#error
    elsif ($bytes > 0) { $req->{htm} .= $buf;}
    elsif ($bytes==0) { #EOF 正常終了}
  }
  {タイムアウトのチェック}
}

$reqは自分で書いたモジュールに型付けされているんですが、エラーとかタイムアウトの処理の時に
$chk=$socket_request{$socket}としてこれをData::dumpで表示させるとモジュールに型付けされて
いないゴーストがでるという摩訶不思議なことが起こります。
スマソ、上げてしまった。m(_._)m
Jcode-MLの過去ログを見れる[ラ抜き]Webサイトがあったはずなんだが
アドレスを忘れても歌。
知ってる人、教えて呉暮。
質問です。Perlで動作するTaglibのようなものはありませんか?
AxKitにそのものズバリTaglib、というのがあるんですが、
mod_perlが使えないので導入できません。
微妙にスレ違い(かつ既出っぽい)なのですが、ちょいとお聞きしたい事があります。
# てか確認と言うか愚痴と言うか、、

perl5.8になってから
CGIのレスポンスヘッダってヒアドキュメントで書き出せなくなりました?
# てか↓を読むとそう書いてあるんですが、ちと英語力に自信がありませんで、、

http://www.nntp.perl.org/group/perl.documentation/553
>>228
漏れの目が節穴なのかもしれんが、どこに書いてある?
探してみたけど、それらしき記述は見当たらんのだが。
230デフォルトの名無しさん:04/02/03 01:11
ASP の Request.Buffer = True に相当する Perl の記述はありますでしょうか?
どなたかお教え下さい。
231デフォルトの名無しさん:04/02/03 01:17
これは Request.Redirect("html://hoge.com/hoge.html")
など、Redirect が 実行されるまで htmlヘッダーの出力を保留するためのものだということなんですが。
何卒よろしく。
232デフォルトの名無しさん:04/02/03 01:19
Request.Redirect("http://hoge.com/hoge.html") でしたすいません
233デフォルトの名無しさん:04/02/03 01:29
>>232 ありゃあ ほんとにあったよ 重ねてスイマセン まさかとおもったガ
234デフォルトの名無しさん:04/02/03 07:18
初めてのプログラミングにPerlを選び、FreeBSDで勉強し初めてのですが、
最初の「コマンド化」のところで挫折してます。
ちゃんとパスを通して、権限を変更しているのですが、「コマンドが見つかりません」になってしまいます。
何故か、一旦ログオフして再ログインすると実行できるようになります。
何か解決方法がありましたら教えてください
235234:04/02/03 07:31
あ、なんかrehashというコマンドを打つとできるようになりました。
perl以前の問題ですね。。。
おいおい
>>234
BASHを使う。
perl5.8にしてから、処理の進捗状況を示すプログレスバー(*)がうまく動きません。
ループ処理が全て完了してから一気に表示されてしまいます。
何か対処法は無いでしょうか?

(*)プログレスバーはこんな感じ
|----+----+----+----+----|----+----+----+----+----|
**********************************

問題を単純化すれば、以下のスクリプトで、1秒おきに表示にしてくれれば
いいのですが、3秒経過後に "1 2 3"と一気に表示されます。
最適化処理のせい?

for $i ( 1..3 ) {
sleep 1;
print "$i ";
}

環境は、perl5.8.2 ActivePerl(build 808) / OS:WindowsXP です。
>>238
$|=1;
>>238
最適化処理のせいだって(藁
最適化じゃなくてバッファリングな
242238:04/02/03 14:22
>>239-241
ありがと。

$|のデフォルトは0のはずなのに、何で前のバージョンだと問題無かったんだろう。
バッファリングの事なんて頭の中からすっかりフラッシュされてたよ。。。
>>238
> 環境は、perl5.8.2 ActivePerl(build 808) / OS:WindowsXP です。
前もActivePerl?
>>243
うん。前もActivePerlでした。

5.8から実装されたPerlIOが原因かな?
また的外れな事言ってるかもしれないけど(藁

ttp://www.context.co.jp/perlinfo/tech-notes/lecture-perl5.8-20020725/sld009.html
>Perl 5.8の新機能
>新しいI/Oの実装 - PerlIO
> - 従来はシステムに付属のstdioライブラリを使用
> - 5.8.0からはデフォルトで独自のI/Oライブラリ PerlIOを使う
> - 入出力時のトランスペアレントなコード変換をサポート
>>244
-tの実装がまずいのかね。
厨でスマヌ
検索してもでてこなかったので
$eps = 1e-30
が何をやっているのかわからなくて
printで出してみたんですが
1e-030とでてくるだけです
これは数値でどれくらいなんですか?
単純な演算方法でも良いんで教えてください
1に10の-30乗をかけた値
実数で書くと
0.000000000000000000000000000001
>>246
10のマイナス30乗。
無限小を設定してるのかな。
Perl5はあと何年安泰ですか?
>>247
>>248
$eps = 1e-30;
$a**2 > $eps
と書いてありいくつ以上なんだ?
と思って調べたら見つからなくて困ってました
どうもありがとうございましたm(_ _)m
>>252
とくにPerlとは関係ない。
254デフォルトの名無しさん:04/02/04 13:50
JCODE:{ my $path=$0; $path=~s/[^\/\\]+$//; require $path.'jcode.pl'; }

↑これって、require './jcode.pl'; とするのとどう違うんですか?
255デフォルトの名無しさん:04/02/04 15:19
101
256名無し募集中。。。:04/02/04 15:44
>>254
$0が実行してるスクリプトのパス+ファイル名だから同ディレクトリに置いたjcode.plをrequireするってことだろうけど
普通こんなの書かない
/usr/local//hoge → /usr/local/hoge
してるんじゃないの?
>>254
それを走らせる時点でスクリプトの置かれているディレクトリと
カレントディレクトリが違う場合は require './jcode.pl'; だと
うまくいかないのでは。
次に>>254は「カレントディレクトリってなんですか」というッ
260254:04/02/05 11:26
>>258
試してみたら、まったくそのとおりでした。ありがとうございます。

>>259
死ねハゲ!!
261デフォルトの名無しさん:04/02/05 11:32
>>260
うるせぇ、ツルッパゲ
262デフォルトの名無しさん:04/02/05 12:10
正規表現を使って置換をしたいのですが、
){  
から
) {
など。
""で囲まれているものは置換しないようにしたいのですが、
いい方法ありますか?教えてください
ない。
>>262
ごめん 読解力ないのか、君が何を言いたいのかわからない・・・
もともと正規表現で置換をする場合、指定したもの「のみ」を置換するはずなんだが・・
その正規表現がわかりませんってことだろ。
266デフォルトの名無しさん:04/02/05 17:34
ハッシュのリファレンスを受け取り、キーと値を逆にして返すスクリプトを作りたいんですけど、

%hash=("a"=>"あ","i"=>"い","u"=>"う","e"=>"え","o"=>"お");
print "実行前\n";
print "$key->$value\n" while(($key,$value)=each(%hash));
&swap_hash(\%hash);
print "実行後\n";
print "$key->$value\n" while(($key,$value)=each(%hash));

sub swap_hash{
my($refer) = @_;
while( ($key,$value) = each(%$refer) ){
delete($$refer{$key});
$$refer{$value}=$key;
}
}
を実行すると、
-------------
実行前
e->え
u->う
o->お
i->い
a->あ
実行後
e->え
u->う
o->お
i->い
a->あ
-------------
となります。何が間違ってるのか指摘してください。
perldoc -f each
sub swap_hash{
my %ahohash;
while( ($key,$value) = each(%{$_[0]}) ){
$ahohash{$value}=$key;
}
%{$_[0]}=%ahohash;
}
269デフォルトの名無しさん:04/02/05 18:22
>>266
while( ($key,$value) = each(%$refer) ){の次の行で
$key,$valueを表示させてみろ。理由がわかるから。

しかし何だな、オレだったら %hash = reverse %hash;とするがな。
\%hashと一時的に作成したリファレンスを書き換えることはできないのかな。
しかたないので、関数の最後でデータコピーするしかない。
この例の場合はデータ量が少ないから問題にならないけど、大量の場合は
速度に影響がでるかも。逆に少なければデリファレンスのコストが大きいのかな。
メモリ効率を意識したデータ操作がしたいなら、最初から無名ハッシュの
リファレンスで操作する方がいいかも。
271262:04/02/05 18:30
簡単
PerlやCやJAVAなどのプログラムのソースで
if(TRUE)〜;
の if と ( の間をあいてないものを
置換によって全て間にスペースがあるようにしたいのですが、
""でかこまれたもの、つまりCのchar[ ]型やJAVAのString型の
初期化や代入に使う文字列は、その整形の対象外にしたいので
""で囲まれた部分を置換しないようにしたいです。
そのための正規表現を教えてください。
272266:04/02/05 18:56
>>269
明解。つい自分のアホさに笑ってしまった。
しかも、独習Perlの模範解答も俺と同じ間違いをしてるしw

>>267-270
どうも
273ヽ(´ー`)ノ:04/02/05 20:09
>>271
ここで質問してる暇があったら、s{if\(}{if (}g して
$ grep 'if \(' | grep \"
した後に手で直したほうが早いんじゃないかと思うんだが。
274デフォルトの名無しさん:04/02/05 21:51
DBIのインストール方法を教えていただけないでようか?
perl -MCPAN -e 'install DBI'
276デフォルトの名無しさん:04/02/05 22:38
インストールどこからやればいいの?
>>276
コタツの上とか。
278デフォルトの名無しさん:04/02/05 22:53
わ、わからん
とりあえず根本的なところがなってない気がする。本買え。
買うのはMS-DOSの本がいいかもね
281デフォルトの名無しさん:04/02/05 23:55
MS-DOSでperl -MCPAN -e 'install DBI'
ってやるの?
詳しく教えてーー
CPANインストールなんてPerlのイロハだろ
しかもDBIなんて情報イパーイあるんだから
少しは検索してから質問してみろと小一時間(ry
283デフォルトの名無しさん:04/02/06 00:10
いや検索してみたのよ
簡単にわからんのよ
DBIでも初心者にはつらいのう
モジュールのインストール方法がわからなくて難儀しております。
環境は、Win2000 Perl v5.6.1 です。
nmake.exeをPATHの通っている場所におきました。
まず、
perl -MCPAN -e shell
を実行しました。設定は、CPANサイトの指定部分以外はENTER連打です。
ためしに、
install XML::Parser
を実行してみましたが、
Note (probably harmless): No library found for '-lexpat'
(中略)
Note (probably harmless): No library found for 'msvcrt.lib'
こんな感じのメッセージが出てうまくいかない訳です。
ここで指定されてる *.lib はハードディスクの中にはないんですけど、そんなもんなんでしょうか。
また、Makefile.PLからのエラーメッセージと思しき中に、
If expat is installed, but in a non-standard directory, then use the
following options to Makefile.PL:
EXPATLIBPATH=... To set the directory in which to find libexpat
EXPATINCPATH=... To set the directory in which to find expat.h
For example:
perl Makefile.PL EXPATLIBPATH=/home/me/lib EXPATINCPATH=/home/me/include
こういうくだりがあり、意味はなんとなくわかるんですが、
Win環境では一体何を指定すればいいのかわからず途方にくれております。
グーグルによると、
http://www.egroups.co.jp/message/perl-lesson/1233
前者は libexpat、後者はexpat.h のパスを指定するようですが、それは一体どこなのかと。
それらしきものを見つけて指定してみましたが、うまくいかないのです。
どっか根本的な解説のあるサイトなり本なりはないでしょうか。
本は・・・ないと思うなぁ
READMEとかついてねえの?

ActivePerlなら ppm コマンドとか使うんじゃなかったけ?
ppmコマンドなんてもう古い?
ppm install DBI
だね。
>>284
環境で抜けてるもんがあるだろうが。コンパイラはどうした?
コンパイラがなきゃ、XSファイルのあるモジュールは
インストールできんぞ。

コンパイラ以外、何が必要かはMakefileを読めばいいんだよ。
全部書いてある。理解するのは結構難しいがね。
俺はそうして勉強した。エヘン。
Windowsでperl使いたい場合は一番のお勧めはやっぱActivePerlだろ。
http://www.activestate.com/Products/ActivePerl/からDownloadを
辿って最新版(現在build 808)を落としインストール汁。
モジュールはppmでインストール。次のようなバッチファイルを用意して
おくと、ActivePerlのバージョンをupgradeしたいとき便利。

---^
REM repository
call ppm3 rep add theoryx5 http://theoryx5.uwinnipeg.ca/ppms/ 

REM http://theoryx5.uwinnipeg.ca/ppms/
call ppm3 install Net_SSLeay.pm
call ppm3 install DBI
call ppm3 install DB_File
---$

>>284
Expat must be installed prior to building XML::Parser and I can't find
it in the standard library directories. You can download expat from:

http://sourceforge.net/projects/expat/
って、Makefile.PLに書いてあるじゃん。Expatのソースを取ってきて
コンパイルするか、Win32用のバイナリも用意されているからそれを
持ってきてインストールすればいい。いずれにせよ、XSファイルを
コンパイルするにはコンパイラが必要。
290デフォルトの名無しさん:04/02/06 15:23
あるソースを参考にしてPerlからHTTPクライアントを作りました.
これだとindex.htmlなどは取得できますが
あるページのxxx.phpといったPHPで書かれたページは取得できませんでした.
どうしたら取得できるのでしょうか?

291290:04/02/06 15:24
ソースです.

#!/usr/local/bin/perl
use strict;
use Socket;
# 接続先ホスト名
my $host = 'www.yahoo.co.jp';
# HTTP プロトコルを使う
my $port = getservbyname('http', 'tcp');
# ホスト名を、IP アドレスの構造体に変換
my $iaddr = inet_aton($host)
or die "$host は存在しないホストです。\n";
# ポート番号と IP アドレスを構造体に変換
my $sock_addr = pack_sockaddr_in($port, $iaddr);
# ソケット生成
socket(SOCKET, PF_INET, SOCK_STREAM, 0)
or die "ソケットを生成できません。\n";
# 指定のホストの指定のポートに接続
292290:04/02/06 15:24
続きです.

connect(SOCKET, $sock_addr)
or die "$host のポート $portに接続できません。\n";
# ファイルハンドル SOCKET をバッファリングしない
select(SOCKET); $|=1; select(STDOUT);
# WWW サーバに HTTP リクエストを送る
print SOCKET "GET /index.html HTTP/1.0\r\n";
print SOCKET "\r\n";
# ヘッダ部分を受け取る
while (<SOCKET>){
# 改行のみの行ならループを抜ける
m/^\r\n$/ and last;
}
# ボディ部分を受け取り、表示
while (<SOCKET>){
print $_;
}


293デフォルトの名無しさん:04/02/06 15:41
>>290
坊や、ここで質問する前にHTTPプロトコルのことお勉強してこようね、いい子だから。
DBを使ったプログラムなんですが
一部重い処理があるので子プロセスをつくりそっちで処理させようと
forkで子プロセスをつくり、処理するまでは良かったのですが

子プロセスを開放すると、その瞬間に親がつかんでいたDBハンドラを
閉じてしまうみたいで困りました

DBを使う前に毎回DBへ接続し直せば回避はできるのですが
それだと、全体的に重くなりプロセス分けした意味も薄くなってしまいます
なので、DBを触る前にDBの接続が確認できない場合には
親がもう一度接続するという処理をしようと思ってるのですが
DBと接続されているかを調べるにはどうすれば良いのかわかりません

一度SQLを投げてみる以外に、DBと接続できているかを調べる方法ありませんか?
わかる方いらっしゃいましたら、ぜひ力貸してください

というか、ほかに何かよい回避方法ってあります?
回避方法があればそれを参考にしてみたいのですが。
295290:04/02/06 17:02
>>293
不可能ってことで良いのでしょうか?
>>295
HTTPリクエストにおいて、.html と.phpの違いは?
>>290
libwww使えばラクちん。
あと、GETなのかPOSTなのかとかわかる?
>>284
ってかライブラリ足りなかったらコンパイル通るわけないのだが
コンパイルは通るよ。と言おうとしたらPerlスレだと気づいた。
>>295
USER_AGENTだかREFERERだかでPHPに弾かれてるのでは?
301デフォルトの名無しさん:04/02/06 21:36
>>298
それ以前にコンパイラが無いんだよ(w

>Note (probably harmless): No library found for 'msvcrt.lib'
>>295
VirtualDomainとか使ってるサーバだとHostヘッダとかも必要になるよ

とりあえず、どんなレスポンスが返るんだ?
ステータスコードとかは?
>>294
> 子プロセスを開放すると、その瞬間に親がつかんでいたDBハンドラを
開放ってどういう意味?
304290:04/02/06 22:27
レスありがとうございます.
Hostヘッダを送ったら無事にレスポンスが帰ってきました.
VirturalDomainという言葉を知りませんでした・・・,ぐぐってみます.



305デフォルトの名無しさん:04/02/07 08:12
306デフォルトの名無しさん:04/02/07 08:13
>>303
wait
307死にたいです:04/02/07 10:45
入門テキスト3日目です
とつぜん 今朝起きたらプログラムが起動しなくなっていますた
始めはソースが表示されたので コーディングミスだと思っていたのですが
色々いじっていたら
ネットワークID PW ドメインを入力せよなどと。。。でてきます
心を入れ替えて勉強を始めたばかりなので 鬱で死にそうです
お助けすださい_〆ヾ( ̄(エ) ̄)
308死にたいです:04/02/07 10:48
>>307
当然ですが ローカルで アパッチを走らせて動かしています
127.0.0.1のアドレスです
パールが入っていない ということは当然ないです
>>308
で何?
>>294
環境なに?
もしActivePerlならfork使うのは諦めた方がいいかも。
311死ねば?:04/02/07 11:49
>>307
解析してほしいなら出てくるログをそのまま送れ。
ネットワークID PW ドメインを入力せよ。とか言われてもさっぱりわからん

まあ、いろいろいじってしまったなら今さらログを登校しても、
誰にも解析不能だと思うので諦めてインストールしなおせ。
312死ぬの止すわ:04/02/07 12:17
別のパソコンでお勉強再開しますた
>>312
>>1嫁、CGIは板違い
314デフォルトの名無しさん:04/02/07 13:48
PerlでWindows-GUIプログラム作れる方法ってないのかなぁ?
無いだろうと思っているけど、誰か知っている人居たら教えてください!!
tk
317314:04/02/07 14:40
>>315-316
 おおっ!! この様なモジュールがあるとは!! PERL恐るべし。
 ありがとうございました―。
Windows べたでいいなら Win32::GUI なんてのもあるみたいだけど。
Perl/Tkって使い難いっつーか、まぁGUIなんてそんなもんなんだろうけど
こんなんで本当に役に立つアプリなんて作れるのかよ、とか思う。
だが稀にすげーの見つけて驚くこともある。
320デフォルトの名無しさん:04/02/07 20:47
windows用のDBIは>ppmで上手くできて、mysqlとの
接続はできるんですが、PostgreSQLがつながんないです。
んで、その後DBD::Pgが足りないってわかってダウンロードしようと思ってるん
ですがppmではできません。
どうすれば、もっとも簡単にインストールできるでしょうか?
WindowsでもPerl使う人間がいるとは。
WindowsならなんてったってVBだね。
322デフォルトの名無しさん:04/02/07 22:37
>>320本人なのだが結局できんてことか?
323デフォルトの名無しさん:04/02/07 22:46
質問ですが、suEXECの使えない共有サーバーで
自作のCGIスクリプトのソースを隠したいのですが、
<FORM ACTION="./" METHOD="POST">
のようにパスを省略して隠している所があったのですが、
このようにして何で動くのかが分かりません。
どなたかご存知の方がいればお伺いしたいのですが・・・
>>323
うむ。webprog板にいくべきだ。
325デフォルトの名無しさん:04/02/07 23:28
>>323
板違いですいません
326デフォルトの名無しさん:04/02/08 05:35
>>319
Perl/TkはPerlMaruti(だかなんだか)のためにあんだろ。
結局、>>284はどうなったんだ。
foreach でループの最後を割り出す方法ってないですか?
たとえば↓こんな感じ

foreach $_ ( qw( a b c d e) ){
  # 末尾の e がきたときに特別な処理がしたいのですがなにか?
}
>>329
以下の各手段でダメな理由は?

my @array = qw(a b c d e);

# a. 最後の要素のみ追加処理 (非破壊)
foreach (@array) { ... }
$array[$#array] ...

# b. 最後の要素を覚えておいて追加処理
my $last;
foreach (qw(a b c d e)) {
  ...
  $last = $_;
}
$last ...

# c. 最後の要素は別処理
for (my $i = 0; $i < $#array; $i++) { $array[$i] ... }
$array[$#array] ...

# d. 最後の要素のみ追加処理 (破壊)
while (defined(local $_ = shift @array)) {
  $_ ...
  unless ($#array) { ... }
}
>>330
実際の処理はreaddirの要素数分ループする処理なんですけど、
forでは一度、配列変数に入れないと最後の要素の判定ができないので、
foreach で最後の要素か判定できればいいなと思っただけです。

つまり理由はループのために変数を用意するのが嫌だとそれだけです。

# 1.
foreach $_ (readdir(DIR)){ 〜 }

# 2.
@list = readdir(DIR));
for( my $i; $i<$#list; $i++){ 〜 }
ふと頭をよぎった方法

opendir(D);
1:
@entry=readdir(D);
$last_entry=pop @entry;
for(@entry){
...
}
code_with($last_entry);

2:
while(1){

$target=readdir(D);
$return_pos=telldir(D);
$next=readdir(D);

unless($next){
#last entry
last;
}
...
seekdir(D,$return_pos);
}

動作確認無し。少なくとも2は気持ち悪い
俺ならこう書くかなぁ。

for ($_=readdir(D),$next=readdir(D); $_ ne ''; $_=$next, $next=readdir(D)) {
 print "job $_"; # 通常処理
  if ($next eq '') {
   print " (this is last)"; # 最後
  }
 print "\n";
}
334デフォルトの名無しさん:04/02/09 09:21
たとえば、こんなコードがあったとして。

use strict;

my $a = "first layer";
while(1)
{
my $a = "second layer";
while(1)
{
my $a = "third layer";
}
}
335デフォルトの名無しさん:04/02/09 09:23
このとき、
「第二層の$aは第一層で同じ名前で定義済みですが、いいんですか?」
「変数名が同じでも、違う階層で my 宣言すれば違う変数になりますよ。いいんですか?」
とか表示させることはできないんですかね。
336デフォルトの名無しさん:04/02/09 09:27
あと、関数内では明示的に宣言したグローバル変数しか参照できない、ってムリ?
たとえば、こんな風。

use strict;
use Explict_Import;

$not_declare = 1; // エラー。
my $a;
my $b;

sub func()
{
import $a;
$a = 1; // OK
$b = 2; // インポートされていないグローバル変数を使用しました。エラー
}
337デフォルトの名無しさん:04/02/09 12:48
Perlの何がいいの?
338デフォルトの名無しさん:04/02/09 12:53
笑顔が素敵なんです。
>>335
use strictとmy,localについてよく調べた方がいいよ
スコープのこと。
340デフォルトの名無しさん:04/02/09 13:09
>>338
いや、マジメに聞いてるんだが…w
341ヽ(´ー`)ノ:04/02/09 13:22
>>336
少なくとも、
> $not_declare = 1;
これは use strict で文句言われるね。

> 関数内では明示的に宣言したグローバル変数しか参照できない
PHP の global みたいな事がしたいのかな。
同一パッケージの変数なら見えて当たり前だし、
他パッケージの変数なら、use しないと使えないんだから問題ないと思うが。
>>340
まじレスすると、昔、Wirthのアルゴリズム+データ構造=プログラムを読んで
listを扱うライブラリをCやPascalで書いて結構重宝してた。そんな時、Perl4に
遭遇したわけだ。俺は、正規表現よりリストを直接扱えるということに感激した。


>>342
LISPは?
344342:04/02/09 14:18
>>343
LISPは括弧がわずらわしくて覚える気がしない。アルゴル系オンリー。
EditorでMeadowを使っているがマクロはいじる気がせん(w
>>344
その気持ちわかるぞ
Perl4ってハードリファレンスがないんでしょ?
そんなものでどうやって萌えられるの?
>>346
その時代の事は俺も知らんけど、多分他の言語のレベルも低かったんじゃない?
いや、全然知らないんだけどね、昔はw
他の変数の参照の仕方には確か5、6種類あるはずだよ。
ハードレファレンスってのは言ってみればアドレス経由の参照で
その内の1種類。
Perl4には名前経由の参照(ソフトレファレンス)があったから
まあ、BASICよりはマシだった。
Perl4って、古!!
perl4にはグロブがある。
Jcode5 MLの管理人は生きているのか?
ウィルス入りのメールが流れても何もしないし、
アーカイバにもそのまま載せてる。
5.8でJcode不要になったじゃん。
>>352
Jcodeが一番速くない?
>>338
ヤヴァイ。ハゲシクワラタ
>>336
ourを使い、最初の宣言をブロックの中で行うといい

{
our $global_var_a = 1;
our $global_var_b = SomeClass->new();
}
sub f{
$global_var_a++; # コンパイルエラー
}
sub g{
our($global_var_a, $global_var_b);
$global_var_b->do_something($global_var_a);
}
作者同じやん<Jcode、Encode::JP
URLからホスト名とパスを抜き出すのに
自分で正規表現を書いている人が多いけど
モジュールとか無いの?
モジュール使うまでもないだろ
モジュールはあるんだろうけど
うん。探すより書いたほうが早かった…。
依存物増やすデメリットとの兼ね合い
ガンガン CPAN モジュール使ってる私は逝って良しですか?
>>357
URI::*とか。
まぁ、漏れもそのくらいなら自分でするけど。

>>361
新しいPCに非標準モジュール全部入れなおそう、とか思うと鬱になる程度には使ってるよ
>>362
> 新しいPCに非標準モジュール全部入れなおそう、とか思うと鬱になる程度には使ってるよ
バッチ処理できるようにしとけば?
Perl使っててCPAN利用しないのは片手落ちというものです。
みんなPerlで何作ってるの?CGI以外で。
366クンクン(葬式):04/02/10 14:51
>>365
シェルスクリプトの代わり。
Perl/Tk つかった簡易 GUI。
GDS II (IC のレイアウトデータ) の解析。
クククのクーソ。。。

>>361
CPAN モジュール使わない香具師の方が逝って善しだと思うわ。。。
クククのクーソ。。。
Win用Activeperlで、実行中の処理をタイムアウトさせることはできませんか?
具体的にはDNSを引いていて以下のようにしているのですが
LINUXの時と違い実行中は終了してくれません…。

$SIG{ALRM}=sub{die 'timeout'};
eval{alarm 1;@mx=mx($res, $serv);};
alarm 0;if($@ =~ /timeout/){print "timeout.";}
>>367
>>222-223を見ち呉れ。実装にsetTimerを使っている限り永遠に無理。
チミがtimeSetEventを使ってコーディングし直してくれ。ヨロスク。
369さんま:04/02/10 17:29
ソースに下記のような$sock_addrっいうのがでてきました。
これって構造体のようですが、システムに既に用意されているものなのですか?
たとえばargcみたいに
19: # ポート番号と IP アドレスを構造体に変換
20: my $sock_addr = pack_sockaddr_in($port, $iaddr);
>>368
mx引いてるところをwhile(1){}にすると期待通り動くんですが
他の方法はないでしょうか?
forkでわけて、タイムアウトならチャイルドプロセスを切るとか…。


371ヽ(´ー`)ノ:04/02/10 17:41
>>369
perldoc Socket
372デフォルトの名無しさん:04/02/10 17:42
>>370
alarmに関してはwin32を書き直すべし。alarm以外の方法は白根(w
fork等、試して報告してくれるとウレスイ。
373>>372:04/02/10 18:10
forkは試してみました。
動くんですが、forkするのに1秒くらいかかるのでちょっと。
変数の引渡しがファイル間でできないのとメモリがリークしてる気が
するのが問題のような…。

if ($pid=fork()){sleep(10);kill($pid);}else{
@mx=mx($res, $serv);exit}
mxを引く(Net::DNS)には処理が終わる前に帰ってくる
呼び出し方もあったような気がするけど?
#!/usr/bin/perl

$content = "a\nb\nc";
$count = ($content =~ tr/\n/\n/);
print "$count\n";

このプログラムですが、なぜ2と表示されるのかわかりません。
$content =~ tr/\n/\n/ は$contentの\nを\nに置き換えるのだから
$contentは何も変化せず、
$count = ($content);
つまり、$countを表示すると
a
b
c
が表示されると思うんですが。どこがまちがってます?
失礼しました。
trはマッチした部分の数返すって書いてありました。
tr/\n/\n/はもとの文字列をこわさないようにしてるようでした。
>>363
あー、そか。
っつってもコンパイルしなきゃいけないモジュールとか、一発で入らないことも多いしヤパーリ面倒だが
"てすと"<[email protected]>

という文字列をWanderlustと同じように

=?ISO-2022-JP?B?IhskQiRGJDkkSBsoQiI=?= <[email protected]>

と変換してくれるMIMEのライブラリを探しています。(もちろんperlで)

Jcode.pmだと次のように<...>の部分までまとめてエンコードされてしまいます。

% perl -e 'use Jcode; print Jcode->new(qw{"てすと"<[email protected]>})->mime_encode, "\n";'
=?ISO-2022-JP?B?IhskQiRGJDkkSBsoQiI8dGVzdEBleGFtcGxlLm5ldD4=?=

また、mimew.plだと、「"」がエンコードされません。(たしか".."の中にはMIMEエンコードされた
文字列は入ってはいけないんじゃなかったかと)

% perl -e 'require "mimew.pl"; print mimeencode(qw{"てすと"<[email protected]>}), "\n";'
" =?ISO-2022-JP?B?GyRCJEYkOSRIGyhC?= "<[email protected]>
>>378
"〜"と<[email protected]>の間にスペースが無いとそうなるみたいだな。

$_ = '"てすと"<[email protected]>';
s/</ </g;
print Jcode->new($_)->mime_encode;

あまり厳密に考えず適当にこうじゃだめ?
2ch 鯖監視係。とか、Rock54 御本尊様とか、BBQ 砦 とか。
そろそろ C に移行すべきか悩み所。

でも気軽で奥の深いところが好き(惚)@perl
381デフォルトの名無しさん:04/02/11 16:54
RedHat8 についてきた v5.8.0 built for i386-linux-thread-multi を
使っています。
$str = "ahoAbakaAunkoAA";
@tokens = split(/A/,$str);
とすると
@tokens = ("aho","baka","unko","","")
とならずに
@tokens = ("aho","baka","unko")
となったのですが、これって仕様?

こうなるとことを前堤にプログラムしても安全かな?
$perl -e '@a=("a","b","c");push @a,"";print $a=@a;'
4

$perl -e '$s="ahoAbakaAunkoAA";@a=split(/A/,$s);print $a=@a;'
3

おれもよく分らないけどこういうものなんかな?
↑どうでもいいけど、こういうのって情報価値ゼロだよな。
該当箇所の抜粋ぐらいしろ、と。じゃなきゃ答えるな。
全部読めば良いじゃん、大して長いもんでなし

>>384 どうでもいいなら黙ってろ。
で、どの部分が該当するの?
By default, empty leading fields are preserved, and empty trailing ones are deleted.
389デフォルトの名無しさん:04/02/11 19:58
>>382-388
うーむ仕様か。ありがとう。
将来の perl もこのままならよいが..
>>384
英語も読めん香具師は毛唐の作ったもの使うな(w
391デフォルトの名無しさん:04/02/11 20:08
>>389
お前もきちんと読めよ(w
$" = '!';
$str = "ahoAbakaAunkoAA";
@tokens = split(/A/,$str);
print "@tokens\n";
@tokens = split(/A/,$str,20);
print "@tokens\n";
>>391
おまえもな。

> If LIMIT is negative, it is treated as if an arbitrarily large LIMIT had been specified.
393378:04/02/11 23:47
>>379
そうなんですよね。"〜"と<〜>の間にスペースあれば問題ないんです。
Jcode.pmちらっと読むとまず/\s+/でsplitしてるんでその辺じゃないかと
思いますが私が簡単になおせそうなものではなかったです。

ゲンミツにはまずい場合がありそうですけど空白を補う案は実用的には
大変魅力的なので採用しようかなー。
以下のようなスクリプトでWebページをGETしたいんですが、
動作速度を速めるために、目当てのWebページのソースの
最初の一定バイト数または一定行数だけGETする方法ってありませんか?
もしあったらどなたか教えてください。。。

my $ua = LWP::UserAgent->new();
my $h;
if ($GET_PROXY) {
$ua->proxy("http", "http://$GET_PROXY/");
$h = HTTP::Headers->new('Pragma' => 'no-cache');
}
$ua->agent($USER_AGENT);
$ua->timeout($GET_TIMEOUT);

my $req = HTTP::Request->new("GET", $url, $h);
my $res = $ua->request($req);

my $content;
if ($res->is_success) {
$content = $res->content;
}
>>394
HTTP を勉強すれば、使うべきメソッドが分かるだろう。
http://www.studyinghttp.net/rfc_ja/2616/sec14.html#sec14.35
>394
perldoc LWP::UserAgent で content_cb がキーワード。
HEADメソッドですむならその方がいいかもね。
397さんま:04/02/12 10:07
perldocでSocket調べたのですが、その中でpound-definesってでてきたのですけど、どういう意味でしょうか?
下記の文ででてきたのですが。
This includes all of the commonly used pound-defines like
AF_INET, SOCK_STREAM, etc.
398 :04/02/12 14:36
ソースでこういうものがあるのですが、どういう意味でしょうか?
stty で echo >/dev/nullを2>&1に置き換えているのでしょうか?


system("stty echo >/dev/null 2>&1");
man stty
400378:04/02/12 17:09
自己レスですが、 ttp://tats.iris.ne.jp/im/ のIM::Iso2022jpでいけることがわかりました。

% perl -e 'use Jcode; use IM::Iso2022jp; print struct_iso2022jp_mimefy(Jcode->new(q{"テスト"<[email protected]>})->jis),"\n";'
=?ISO-2022-JP?B?IhskQiVGJTklSBsoQiI=?= <[email protected]>

401デフォルトの名無しさん:04/02/12 17:36
Perl初心者です。
http://daichanchi.net/
↑のような、閲覧者にログインしてもらって、
ログインしてる人としてない人で、チャットや掲示板に入室制限などを
かけたいのですが、参考になるソースや、配布されているCGIはないでしょうか?
教えてください。
402 :04/02/12 17:55
右の式っていったいなにがどうなってるんでしょうか?

$buf =~ /^(\d\d\d)([ |-])(.*)/;
先頭から数字3桁のあと、スペースかハイフン、その後は何でもよし
$1 に数字3桁、$2にスペースかハイフン、それ以降が$3に入る
>>401
掲示板に書き込むときは注意事項をよく読もう>>1
405284:04/02/12 22:35
手動のコンパイル言語を使いたくなくてPerl始めた人間なもので、
それでもコンパイラがいると聞いてちょっとショックを受けておりました。
# 目が覚めました。少し。

これまでの流れで、PPMを使ったインストール方法の応用を知り、
(ppdがググると出てくるとは気付かなかった……)
今回の件の必要モジュールはインストールできたので、
それを使ったスクリプトを作成していて今まで遅くなりました。
# 結局、提示した問題自体は解決できていない訳です。お恥ずかしい。

で、どのコンパイラを入れればいいのかとぼちぼちさがしたりしてました。
Borland の C++ とかでいいんでしょうか。
HDが小さめなもので無駄なインストールはできれば避けたいですし、
インストールアンインストールを繰り返してレジストリをガンガンいじるのも怖いし、
ここまで来るとスレ違いかも知れませんが、なんか安心できるコンパイラはないでしょうか。
>>405
WindowsでActivePerlを使う積もりなら素直にMicrosoftのVC++ ver6.0だろ。
モジュールをVC++以外でコンパイルしてActivePerlの下で使うのも多分
OKだろうが(未確認、保証はしない)、コンパイルするにはConfig.pmを
書き換えなきゃならないので面倒臭い。
Freeのコンパイラを使うという手もある。CygwinとかMingwなど。
Mingwだと全部自分でコンパイルすることになるが、うまくいくと思う。
ActivePerlのbuild522(perl5.00305)を以前Mingwでコンパイルしたときは
テストもOKだった。最新のbuild808がうまくいくかどうかは保証できない。

HDくらい買えよ。
cygwin入れるのが一番楽だろう。
つかHDも買えない貧乏人はWindowsを削除して
FreeBSDを入れるのがいいだろう。
今初心者に進めるなら Linux の方がいいと思うけどねぇ。
LinuxなんてVMwareで十分だよ(プ
VMware5万くらいする、高いよな…
411デフォルトの名無しさん:04/02/13 14:42
for ($i = 0; $i < 500; $i++) {
$url = 'http://hoge.foo/'.$i.'.html';
$ua = LWP::UserAgent->new;
$res = $ua->request(GET $url);
push(@a, $res->as_string);
}

こんな感じで連番のファイルをダウンロードしたいのですが
(wget,curl等の外部プログラムを使わずに)、これだと相手のサーバーに
ものすごい負担をかける事になるのですか?

だとしたら、極力負担をかけずにこんなようなことがしたい場合
どうすればいいのでしょうか?
500個のファイルねぇ…。
まず、それが全部存在することは確実に分かってんの?
pushの次の行にsleep(365*24*60*60);を追加。
これでサーバへの負担はかなり減らせる。
つーかwait入れればいいのでは
415 :04/02/13 15:55
>>403
ありがとうございます =~ はマッチング なんですね
416 :04/02/13 16:17
autoflush $sock (1);
これの(1)ってなにを設定しているのでしょう
0以外は毎回フラッシュする
>>411
500回も毎回newするのか・・・オエー
500回のnewなんて普通だろうに……ホゲー
クライアントが少しでも遅ければサーバが楽なわけで.......
んな訳ねぇーか(w
普通はループ前に1回だけnewするだろ。
ずいぶんケチ臭いな
一回外出するたびに靴を捨てるのが普通で、そうしないのをケチと呼ぶなら、
確かにこれもケチだが。
また随分と御自分に都合のいいたとえですね
というか君に都合が悪いんだろう。
いいえ。ピントの外れたたとえをされても都合はわるくありません。
427411:04/02/13 20:14
いろいろとレスありがとうございます。

use strict;
use LWP::UserAgent;
use HTTP::Request::Common;

my ($url, $ua, $res, @a);
$ua = LWP::UserAgent->new;

for (my $i = 0; $i < 500; $i++) {
    $url = 'http://hoge.foo/'.$i.'.html';
    $res = $ua->request(GET $url);
    push(@a, $res->as_string);
}

こんな感じで問題ないですか?
>>426
都合が悪いからピントはずれということにしているだけだろう。
そんな事よりよ、ちょいと聞いてくれよ。
このあいだ、>>411のレス見たんです。>>411
そしたらなんかUserAgentをめちゃくちゃいっぱい作ってるんです。
で、よく見たらなんか質問しててて、負担になるのですか、とか書いてあるんです。
もうね、アホかと。馬鹿かと。
お前な、くだらない質問如きで普段来てないム板に来てんじゃねーよ、ボケが。
プログラム板だよ、プログラム板。
なんかいらすまもいるし。「●現役女子中学生の●無毛姿●写真あり●」か。おめでてーな。
「ども」、とか言ってるの。もう見てらんない。
お前らな、150円やるからム板から出て行けと。
ム板ってのはな、もっと殺伐としてるべきなんだよ。

>>427
newはループの中に入れたほうがいいよ。ケチだと思われるよ。
431デフォルトの名無しさん:04/02/13 21:14
432デフォルトの名無しさん:04/02/13 21:29
http://uncorrelated.no-ip.com をはっくせよ
ハックという程のレベルじゃないな。
>>427
得ろ画像収集乙

for $i (0..500){
  print "<IMG SRC='http://hoge/$i.jpg'>\n";
}
こんなんでもいいんじゃないの?サム寝入るっぽくできて便利だよ。
いや、得ろ画像じゃないかもしれんが。
435デフォルトの名無しさん:04/02/13 23:48
perl 5.8で、日本語の処理をしようとしています。
ちなみにperlを書くのは初めてです。
やりたいことは
(1)Shift-JISの日本語のファイルを読み込み、
(2)日本語の正規表現を使って置換して
(3)Shift-JISで書き出す
ということです。
いざ、やろうとしてから、perlのバージョンによって、またJperlを使うか
Jcode.pl, Jcode.pmなどを使うかで複雑な事情があることなどがわかりました。
これまでに得た情報の中では、
Perl5.8以降を使うのが最善だろうという結論に達しました。
(ここまでは間違っていないだろうと思います)
ところが5.8以降はまだ資料も少なく、あっても初心者向けに書かれてはいません。
おそらく(2)の部分がネックになって、Shift-JISで読み込んでから一旦euc-jpに変換して、それから置換して、それをまたShift-JISに変換して書き出す必要があるのではないかという予測はつくのですが、実際にどうコーディングするのかがわかりません。
use encoding "euc-jp";
とか
binmode STDOUT, ":encoding(euc-jp)";
とか
use open IO => ":encoding(euc-jp)";
open( F, "< filename" ) or die;
とか
を使うのでしょうか?
どなたかご教授をお願いします。
5.8.0は苦労するかも
>>435
どんなことをやりたいの?
具体的にいってみてよ
あと shift_jis <=> euc なら別に5.8である必要はないと思うが
jcode.pl or Jcode.pm 使うんだし
>>435はマルチ
>>434
それ、場合によっては、referer見られて鯖が画像送ってくれないことが多々ある。
>>434
それ以前に$i がシングルクオートでくくってあるから(ry
>>435
eucにいちいち変換する必要などない。
encodingのサンプルにしたがって書けば5.8.2ならあんたの用途ならOK。
>440
my $hoge = "'$i'";
443デフォルトの名無しさん:04/02/14 12:16
Perlは以前(3年ぐらい前)と比べて流行り廃りはどんな感じでしょう?
>>427
これを機会にzshを入れたらどうだ?
% wget http://hoge.foo/{0..500}.html
zsh使ってる人見るたびに、
「この人はエッチな人。間違いない」
と思うようになりました。
>>443
普通。取り敢えずUNIX文化では10年後も今と変わりなく定着してる。
GUIはあんま得意じゃない&インタプリタってコトでwin圏には流行しにくいと思われ。
でもなんか今後普通にexeファイルを生成出来るようになる気配が見え隠れする。

全部漏れの勝手な見解だけどねー。
って言うか、どのくらい流行ってるかとか聞かれてもそんなの分かりま千円。
始めたてで解らない所があったんで教えてほしい事があります。
繰り返しについてなんですが、
whileの処理が数時間経過後もしくは数回後に、別の処理へ移動して
その別の処理が終わったら、またwhileに戻す。
の、繰り返しを作りたいのですがどういう風にすればいいんでしょうか?
>>447
while(1){
&function();
}
449デフォルトの名無しさん:04/02/14 22:49
$a= "2月 13日 23時 18分"

my ($mon,$day,$hh,$mm) = なんらかの処理($a);

どのようにすれば、スマートに分割できますか?
450デフォルトの名無しさん:04/02/14 22:52
>>449
sprit(/ /,$a);
451デフォルトの名無しさん:04/02/14 22:58
>>450

すみません。説明不足でした。
数字だけ抜き出したいのです。
以下のような感じとなりますでしょうか。
あんまりスマートでないような。

my ($mon,$day,$hh,$mm) = sprit(/ /,$a);

$mon =~ s/月//;
$day =~ s/日//;
$hh =~ s/時//;
$mm =~ s/分//;
perl -e '$date="2月 13日 23時 18分"; @date=($date=~m/\d+/g); print "@date\n";'
453451:04/02/14 23:36
>>452

なるほど。勉強になりました。
ありがとう御座いました〜。
最近のPerlは正規表現が売りじゃないのか・・・
455435:04/02/15 12:35
435です。すいませんレス遅れました。
みなさんの話を聞くと、5.8.2では日本語の正規表現がそのまま使えるという
ことなんでしょうか?
やろうとしていることは以下のようなことです。

$filename='chikanmae.txt';
$newfilename='new'.$filename;
open(FILE, $filename) or die "$!";
@file = <FILE>;
close(FILE);
foreach $line (@file) {$line=~ s/濾過/ろ過/g;
open(NEWFILE, "> $newfilename") or die "$!";
print NEWFILE @file;
close(NEWFILE);
これを実行すると、結果は置換されていません。
これではいけないのでしょうか?
ものすごく簡単なことではないかと思うのですが。
よろしくお願いします。
>>455
#test.pl
while(<>){
s/濾過/ろ過/;
print;
}

%perl test.pl < chikanmae.txt

これでええやん
457435:04/02/15 13:13
すみません。while文の使い方もよくわからなくて。
これを標準入力ではなくて、外部の、ファイル名を指定して取り込んだものに
対して実行して、またファイル名を指定して書き出す方法がわからないのです。
コンソールから
$perl -i.bak -pe 's/濾過/ろ過/g' chikanmae.txt [enter]
(Dos窓なら C:\>perl -i.bak -pe "s/濾過/ろ過/g" chikanmae.txt [enter])

456さんと同じことだけど。
>>446
>今後普通にexeファイルを生成出来るようになる気配が見え隠れする。
もし実現したら嬉しい。
460435:04/02/15 14:00
458さんありがとうございます。
Dos窓から実行して、置換はできました。
これを、Dos窓から実行するのでなく、単体の.plファイルから実行するやり方が知りたいのです。
つまり、test.plが、実行されると、chikanmae.txtを置換して、別ファイル名で保存する、
というやり方です。
おそらく
foreach $line (@file) {$line=~ s/濾過/ろ過/g;
のあたりをwhile文でなんとかできるのではないかと思いますが、
標準入力でないファイルの受け取り方がわかりません。
おわかりになりませんでしょうか?
このスレ、いろんなスレの人が来るな。。。
>>460
>foreach $line (@file) {$line=~ s/濾過/ろ過/g;
閉じ括弧は?
463435:04/02/15 14:16
あ、すいません。閉じ括弧はあります。
foreach $line (@file) {$line=~ s/濾過/ろ過/g;
実はこの後延々と置換だけの式が続くのでそこをカットしたときに
とじ括弧も消してしまいまいした。

syntax errorは出ません。newchikanmae.txtというファイルも出来ます。
ただ、中身が置換されていないのです。
ポカーン
perl test.pl chikanmae.txt >chikango.txt
465435:04/02/15 14:35
えーとすいません。そのtest.plの中にどういう風に書けばいいのでしょうか?
もう一度ソース貼付けてしまいますが、
$filename='chikanmae.txt';
$newfilename='new'.$filename;
open(FILE, $filename) or die "$!";
@file = <FILE>;
close(FILE);
foreach $line (@file) {$line=~ s/濾過/ろ過/g;}
open(NEWFILE, "> $newfilename") or die "$!";
print NEWFILE @file;
close(NEWFILE);
これで置換されないのはなぜか?
どうすれば置換されるのか?
という質問です。
よろしくお願いします。
文字コードとかの問題はないよなまさか
467466:04/02/15 14:44
>>465
スクリプトの文字コードとchikanmae.txtの文字コードは
どうなってんの?
468435:04/02/15 14:44
ちなみにソースはeuc-jp、改行はLFで保存しています。
置換対象のファイルの方はShift-Jis,改行はCR+LFです。
あははは
こうにでもするこった
open(NEWFILE, ">> $newfilename") or die "$!";
foreach $line (@file) {$line=~ s/濾過/ろ過/g;
print NEWFILE $line;}

470466:04/02/15 14:52
>>468
スクリプトか、データファイルのどちらかの
文字コードに統一汁
471435:04/02/15 15:10
それが、できればいいのですが、
置換前のファイルはshiftjisで勝手に保存されてくるもので、ソースをsjisに
合わせると、正規表現を使うときに日本語の2バイト目がバックスラッシュに
当たる文字がエラーになります。
なので、
use encodingとか、
binmode STDOUTとかを使う必要があるように思うのですがこのあたりの
使い方がいまいちわかりません。
よろしくお願いします。
472デフォルトの名無しさん:04/02/15 15:22
$lineはforeachのなかだけのローカル変数だろーが!!
473466:04/02/15 15:23
>>471
foreach $line (@file) {$line=~ s/濾過/ろ過/g;}
の処理部分を

require 'jcode.pl';
foreach my $line(@file){
&jcode::convert(\$line, 'euc');
$line =~s/濾過/ろ過/;
}

これにしてやってみたら?
今風ならばJcode.pmを使うべきなんだろうけど
#!perl
#このソースはUTF8で保存
use utf8;
binmode($_,":encoding(cp932)") for STDIN ,STDOUT ,STDERR;
$input_filename =shift @ARGV;
$output_filename =shift @ARGV;
open(IN ,'<:encoding(cp932)',$input_filename) or die "open $input_filename: $!\n";
open(OUT,'>:encoding(cp932)',$output_filename) or die "open $output_filename: $!\n";
while(<IN>){
s/濾過/ろ過/g;
print OUT $_;
}
close(IN) or die "read $input_filename: $!\n";
close(OUT) or die "write $output_filename: $!\n";

これでわからなかったら5.8の機能使わないほうがいいよ
おっと、
binmode($_,":encoding(cp932)") for \*STDIN ,\*STDOUT ,\*STDERR;
の間違いだった(use strictの場合)
476435:04/02/15 15:32
>>473
えーと、それを、Jcode.plやJcode.pmを使わずにperl 5.8.2だけで
やる方法はないものでしょうか?
ちょっと前になってしまったのですが、435の書き込みを読んでいただければ
うれしいのですが。
ソースの文字コードにutf8を使うのがイヤなら

use Encode;
$length= from_to($text,'shift-jis','euc-jp');

でjcode.pl と同じようなことはできる。
単に日本語の書き換えなら、置換が使えるテキストエディタ使った方が良さそうですね。
perldoc Encode とかしていそうにないし、、、
479デフォルトの名無しさん:04/02/15 15:43
$line=~ s/濾過/ろ過/g;
で置換した$lineを新しいファイルに書き出せばいいだけですが、、、
435さんは置換はしているけど、書き出してませんよ。
perldoc perljp http://www.eng.buffalo.edu/util/perl-5.8/manual/pod/perljp.html

くらいはよんどこうな。
481435:04/02/15 15:53
>>474
すみません。全くわかりません。
これを実行するとOpen: No Such File or Directoryとなってしまいます。
>>477
これは、Undefined Subroutine &main::from_to...というエラーになってしまいました。
>481
shift @ARGVの意味はわかる?
そこをファイル名に変えてもいいよ。

from_toを Encode::from_to に変えて。
perl/tkについていくつか質問させて貰いまふ。
よく分かってないので、もしかしたらアホな質問するかもしれません。
windows98, ActivePerl5.8使用。

1:GUI作ってるのになんかDOS窓が開いて、正直なんか嫌です。
これ出て来ないように封印する方法あったら教えて下さい。

2:通常の画面をEUCで書いたらもれなくバケます。
出力する文字codeの宣言はどうやったらいいのでしょうか?
(出力をEUCにしたい理由はないんですが、記述をEUCにしたいんで、出力もそのままEUCにしたいです)
ついでに、DOSにEUCを表示させる方法もご存知でしたら教えてほしいです。

3:tkで作ったテキスト入力フィールドが、なにやら文字化けします。
これの解決方法はないのでしょうか?


なんかイパーイ質問してすみませぬ。
484435:04/02/15 16:43
shift @ARGVのことはわかりませんが、
(標準入力を配列として受け取る??)
そこをファイル名に置き換えたら
できました。本当にありがとうございました。
http://flex.ee.uec.ac.jp/texi/perl/perl_11.html
http://d.hatena.ne.jp/tateisu/20040112
とかを読んだら何となくcp932というのを使う必要があることとか
おぼろげながらわかりました。
しかし、初心者にはとても難しく、半分も理解できません。
5.8.2で初心者向けの書籍というのは発売されないものでしょうか。
特に日本語の処理について、詳しく書いたものはあまりないような気がします。
「文字コード超研究」という本を買ってはみたのですが、
これもちょっと難しく、私のやりたいことの部分については
書いていなかったもので、ここで質問してしまいました。
>>483
どこかで見つけてスクラップしておいた記事だけど・・・

> 263 名前:259 投稿日:2003/11/24(月) 09:25
> setenv LC_ALL ja_JP.EUC
> setenv LANG ja_JP.EUC
> setenv XMODIFIERS '@im=kinput2'

> と環境変数を設定しておけば、

> #!/usr/bin/perl
> use Tk;
> MainWindow->new()->Text()->pack();
> MainLoop();

> で、テキストウィジェットが開いて日本語入力&編集できるようになりました。
> perl/tkは日本語も使えて便利でいいですね。
>483
perl\bin\wperl.exe

Tcl/Tk 8.1以降は内部unicodeだが、Tk.pmが使ってるTcl/Tkのバージョンは?


ソースの記述は素直にutf8にしてしまうことを勧める。
utf8からなら binmode(STDERR,":encoding(cp932)") でDOS窓にはSJISで吐ける。
487482:04/02/15 17:01
>484

perl5.8以降で use utf8; すると以降の識別子、文字列リテラル、正規表現などはutf8で書かれていると解釈される。
次に入出力の際に文字コードをutf8に変換すれば内部では全てutf8扱いになるので多国語を問題なく処理できるようになる。

どういった入出力があるかというと

・コマンドライン引数 (@ARGV, <>等)
・ファイルハンドル(open で ":encoding()" を指定)
・標準入出力(STDIN,STDOUT,STDERRにbinmodeで指定)
・ファイル名,ディレクトリ名( 今のところ毎回decodeするしかない)

変換の際に使うエンコードの一覧や変換機能については perldoc Encode; を読むこと。
5.8の文字コード関係はまだホットなので書籍がそろうにはまだ時間がかかるが、
和訳なら http://digit.que.ne.jp/work/index.cgi?Encode で読める。
簡単なガイドは http://www.context.co.jp/perlinfo/tech-notes/lecture-perl5.8-20020725/index.html
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
cp932Windowsの日本語版で標準的に使われているエンコーディング。
ほとんどシフトJISなんだけど半角カナや機種依存文字の扱いが微妙に異なる。
unicodeのマッピングの混乱 (参考 http://www.ingrid.org/java/i18n/encoding/ja-conv.html
を避ける理由もある。
>>483
ActiverPerl付属のperlwin32より。

(前略)If you want to start a copy of "perl" without opening a command-line window,
use the "wperl" executable built during the installation process. Usage is exactly
the same as normal "perl" on Win32, except that options like "-h" don't work
(since they need a command-line window to print to).

というわけで、ダブルクリックしてもコマンドラインウインドウが出ないように
.plファイルの関連付けを上記プログラムに変更すれば良い。
490483:04/02/15 18:47
>>485
ぬおぉぉぉぉ!
ありがとうございます。

>>486
バージョン…、調べてみます。
utf8使うだけで解決(sjis出力)出来るんですか。。。
て言うかbinmode(STDERR,":encoding(cp932)") これ意味分からないんで調べてきます。
標準エラーにバイナリモード?でcp932にエンコードして出力する…?
いや、調べてきます!

>>489
マジ英語苦手なんですがめちゃくちゃ適当に訳してみました。

もしあなたがスタートにコピーする、外に開くperlコマンドウィンドウを欲するのならば、
作った実行ファイルはwperlでプロセスを立ち上げろ。
使用法は同様に正しくしろ(?)。取り敢えずオプションは-hじゃないほうが良い。
(以降、コマンドラインウインドウの出力が必要だ?)

がーーーーん、意味分からない。取り敢えずwperlて何か検索してきます。
リア厨か。まあ頑張れ。
つか485のはwindowsじゃないだろ。
493484:04/02/15 19:16
>>487
ありがとうございます。
勉強します。
>>483
拡張子をplwにすればよかったような
>>490

 もしおにいちゃんがパールをこまんどらいんうぃんどうを開かずにじっこうしたいなら
 いんすとおるしたときに作られる"wperl"っていう実行ファイルを使ってね。使いかたは、
 ふつうのwindowsのパールといっしょだよ。でもでも、-hとかのおぷしょんは使えないの
 (だってこういうおぷしょんって、結果を表示するうぃんどうが必要なんだもの!)。


とりあえずもえたん買って来い。簡単な英語でもできるようになるとPerlはもっと便利に使えるぞ。
>>495
キモ
497デフォルトの名無しさん:04/02/15 20:04
FreeBSDでperl5.6を使用しています。

use strict;
use POSIX;
use IPC::SysV qw( IPC_STAT IPC_SET IPC_CREAT );
use IPC::Msg;

require "sys/ipc.ph";
require "sys/msg.ph";

$msd = new IPC::Msg( $key, $flag );

$msd->set( qbytes => $newsize );

上記を実行すると
Can't call method "pack" on an undefined value at /usr/local/lib/perl5/5.6.1/mach/IPC/Msg.pm line 78.
となってしまいます。

Msg.pmを読んだのですがpackは定義されていませんでした。
これは、私の使い方が悪いのでしょうか

モジュールではなくてperl関数のmsgctlは
msgctl ID,CMD,ARG
ARGは msqid_ds 構造体が入る変数でなければいけませんと書いてあって、
その変数はどのように作るのかもわかりません。

setでもmsgctlでもどちらでもいいのでメッセージキューを制御する方法を教えてください。

BSD使いの集まるスレに行った方がいいとおもうよ
499デフォルトの名無しさん:04/02/15 20:59
perl でメモリ空間を節約しながら sort | uniq する方法はないでしょうか?

下記のソースで、100MBのファイルを処理しようとすると
750MBの仮想メモリを喰い尽くしてしまいます。。。

while(<>) {
  $data{ $_ } = 1;
}

for ( sort keys %data ) {
  print;
}

環境:OS WinXP / ActivePerl 5.8.2
merge sortでも使え。
501499:04/02/15 21:46
>>500
sortする前の段階(ハッシュにデータを詰め込む作業)で750MBのメモリを喰ってしまうのです。

sort|uniq の用途以外にもハッシュに大量のデータを詰め込むと、異常にメモリを喰います。
実際のデータのファイルサイズよりも遥かに多くのメモリが消費されるので
いつも不思議に思っていました。

何でだろう。。。
>>497

> Msg.pmを読んだのですがpackは定義されていませんでした。
SysV.xsに定義されてるが
>>501
>>500は全部メモリに置かないようにするって話だろ
ハッシュはそういうもんだ。仕組み調べればわかる
「初めてのPerl」と「続・初めてのPerl」を読んだ程度なのですが、
勉強になるPerlのコードで、良いコードはありますか。
やぱり標準モジュールの*.pmコードですか?
だろうね
>>499
配列にすれば少しは減るんじゃない?

@data = grep (($tmp eq $_) ? 0 : ($tmp=$_,1), sort <>);
>499
perlのメモリ管理、ハッシュ、sortはやや柔軟性に傾いたチューニングになっている。
メモリ効率が重要な時は専門家を雇うか、専門家なみの処理を自分で書け。
専門家を雇う=open2等でsort|uniqを呼ぶ、な。
>504
クックブック。
510499:04/02/16 12:00
>>503
やっぱりファイル全体を読み込むのは避けた方がいいのか。。。
でも、全部メモリに入れると便利なんだけどな。

>>506 のソースそのままで実行してみましたが、
同じ位のメモリ(700MB)を消費するみたいです。
配列のコピーで喰ってるのかもしれんけど。

>>507-508
専門家なみの処理は自分では書けないので、専門家にお願いしようかな。
UNIXだとパイプを進んで使うけど、Windowsだとちょっと抵抗があるんだよなあ。
とりあえず、cygwinのsort,uniq を使ってみます。
>>499
ワサビでも塗っとくと喰いつかなくなるぞ。
ものすごくつまらん
>>510
> とりあえず、cygwinのsort,uniq を使ってみます。
sort -u がいいと思われ。
すごくガイシュツな案件の予感
515デフォルトの名無しさん:04/02/16 14:49
#!/usr/bin/perl -w
package abc;
$a="test\n";
while (($key, $value) = %abc::) {
print "$key $value\b";
}

これが無限ループしてしまうんですがどうしてなんでしょうか。
516  :04/02/16 14:50
下記のコードでsocketの引数にSOCKET, PF_INET, SOCK_STREAMとありますが、これはなんなのでしょうか?
ソースの中で定義されていないのですが・・・・

socket(SOCKET, PF_INET, SOCK_STREAM, 0) or die "ソケットを生成できません。\n";
>>515
each を忘れてないか?

>>516
Socket.pm 読んでみ。
518デフォルトの名無しさん:04/02/16 16:50
みんなラクダ本は丸暗記するほど読んでからコード書いてるの?
表紙は見ました
>>518
第2版は索引がイモだから丸暗記していないと使い物にならん(w
521デフォルトの名無しさん:04/02/16 17:04
>>520
あっ、訳本ね。原書はOK
>>518
丸暗記というか、八割から九割は理解してないとまともなコードはかけないと思うぞ、マジでな。
青ラクダはレシピ集がないからとっつきにくいんだよ。
みんなクックブック読もうな。あれ読めばわかる。
与えられた文字列にある文字がいくつ含まれているかを調べるには
どうするのがいいでしょうか。Cならループしてそのまま数えるところ
ですが、perlでループまわしてsubstrしてというのはあんまり気が
すすまないのです。
>>520
第3版じゃなくて?
>>524
こんなのは?
use strict;

my $string = "hogehoge";
my $pattern = "h";

my $count = $string =~ s/$pattern/$pattern/g;
print $count, "\n" #2;
>>524
$str = 'ahobakaotankonasuomaenokaachandebeso';
%check;
grep $check{$_}++,split //,$str;
for my $letter (sort keys %check) {
printf"%s -> %2d\n", $letter, $check{$letter};
}
perl -e "@a = ( 'AAA' =~ /A/g );print 0+@a"
perl -e "while('AAA'=~/A/g){ ++$a} print $a"
my $string = "hagehigehugehegehoge";
my $pattern = "h";
print eval {$string = tr/$pattern/$pattern/;};
>>518
赤ラクダで一生懸命覚えたので、いまだにリファレンスを使いこなせません。
>530
動かしたか? w
赤のころはperlなぶるやつはC屋ばかりだから
レファレンスについちゃさしあたり問題ないような。
たまにはまって悩むってのならともかく。
>>532
吊ってきますm(_ _)m
s/= tr/=~ tr/ です。。。
535520:04/02/16 21:39
>>525
第3版の訳本は上下併せて1万だろ、買う気しねぇ〜。原書の方が安い(w
お釣にちょっと足せばObject Oriented Perlが買える。
第2版(訳本、初版)の索引は怒りを通り越して笑っちゃうぜ。CONTENTSと
いうのがあったので、何?と思って見たら、サンプルコードの中のハッシュのキー。
もう、阿呆か馬鹿かと。
それでいて、ISAとかSUPERとかが載ってないんだよね。
>534 それだけか?w

my $string = "hagehigehugehegehoge";
my $pattern = "h";
print eval {$string =~ tr/$pattern/$pattern/;};

はうちでは7を表示するけどなw
537526:04/02/16 22:03
なんで7なのかわからなかったけど、
変数が展開されてなくて $ p a t e r n 全てにマッチしてるみたいだね。
つーか俺の書いたのちょっといじっただけじゃん(w
>>535
漏れ、1 (赤ラクダ)、2、3版全部持ってる…

ちなみに第3版の索引も微妙に使えない。
>>535 の意味ではなく、思いっきりページが間違ってる。
最後にもう一回 makeindex + LaTeX かけるのを忘れたかのように、ところどころ1ページくらい
ずれてる (いや、LaTeX で処理してるのかどうかは知らんけどね)。
すいません、ActivePerl使ってます
実はSTDOUTに対しbinmodeしたんですが、その後テキストモードに戻したいわけです。
テキストモードに戻したい時は一旦closeして同じファイルハンドルでopenすればいいらしいですが、スクリプトがCGIでのSTDOUTなのでどうやってopenすればいいか分らんのです。
というわけでwebサーバ上でのSTDOUTをopenする方法あったら教えて欲しいのですが・・・
もしくはbinmodeの影響を局所化する方法とかありませんか?
{
local *FH = *STDOUT;
binmode FH;
...
close FH;
}
などとやってみましたがSTDOUTもcloseされてました
>>537
も一回吊ってきますm(_ _)m
仕組みをちゃんと理解していなかった。。。

$_ = "hagehigehugehegehoge";
$pattern = "h";
print eval "tr/$pattern/$pattern/";
linuxで異なるバージョンのperlのモジュールを共用させるにはどうすればいいのでしょうか
>539
バイナリモードのまま使い続けろ。で\nの変わりに \x0d\x0aと書け。
\nは処理系での論理改行を示しているに過ぎないので、
ネットワーク的な改行(たいていCRLF)を意識するなら出力に\nは使うな。
ttp://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
>>542タン。カコイイ
>>542タン。カコイイ

>>539
5.8ならPerlIOのレイヤー使うという手もある
545524:04/02/17 17:53
>>526 (s///で置換回数を数える)
>>527 (1文字ずつにsplitして数える)
>>528 (配列コンテクストの//gで要素数を数える)
>>529 (スカラーコンテクストの//gでループ)
>>530 (trで置換回数を数える)

いろいろあるものですな。Benchmarkで試してみたところ、trが一番速い感じでした。
正規表現じゃない分有利なのでしょうね。文字列書きかえる必要ないのに書き換える
のが一番速くなるあたりにperlっぽさを感じます。
つーかtrで数えるのって常識じゃん・・・
>>539
open FH, ">&STDOUT" or die $!;
binmode(FH);
...
close(FH);
binmode FILEHANDLE, ":crlf"; # CRLFモード(テキストモード)
binmode FILEHANDLE, ":raw";# RAWモード(バイナリモード)
cygwinのperlでどーも上手く動作しなかったので質問しようかと思ったら
解決できちゃったので、自分への怒りにまかせてカキコ

src.txtというテキストを用意。内容は
aa
bb
cc
[EOF]

で、test.plという名前で
my @arr;
open (FH, "src.txt");
while (<FH>){
 chomp;
 push @arr, $_;
}
close FH;
foreach (@arr){
 print "$_\n";
}

このtest.plを実行したら
aa
bb
cc
という出力を期待していたのだが、どういうわけか
cc
としか出力されていなかった。

なんのこたーない。src.txtの改行コードがCRLFだったというだけのお話。
鬱だ氏脳。
>>549
>src.txtの改行コードがCRLF
CRでしょ?
LFでもCRLFでもちゃんと3行出たよ。
This is perl, v5.8.2 built for cygwin-thread-multi-64int
すみません、皆さん。
perlで書かれたスクリプトを改造して欲しいのですが、
perlに対する熱い思いと、2chユーザーへの慈悲をお持ちの方、
いませんか…?(´・ω・`)
>>551
ム板にはいない。
WebProg板にはいるらしい。

【 スクリプト改造依頼スレ 】(丸投げ)
http://pc2.2ch.net/test/read.cgi/php/1076831972/l50

【 スクリプト改造工房 PART 7 】
http://pc2.2ch.net/test/read.cgi/php/1063780103/l50
>>550
いや、CRLF。
最初はperlが5.8.0なのに問題があるのかもと思い5.8.2を入れ直したが
CRLFだとやっぱり同様の振る舞いをする。
そんで
foreach (@arr){
 print "$_\n";
}
この部分を
foreach (@arr) {
 print "$_";
}
にして、./test.pl > result.txtと実行したあとresult.txtの内容をmoreなんかで見ると
aa^Mbb^Mcc^M
というようになってるっす。(5.8.2での結果)
catしたら ^Mで行頭にいってるからccしか見えなかったという話か。
それperlじゃなくてcygwinの改行コードの問題。吊って来い。
5557743:04/02/18 21:08
Perlでオブジェクト指向するには
Packageを覚えればいいのかな?

他に覚えることある?
>>555
Perl でオブジェクト指向ってのはあんまりオススメしないが、
やるんだったらとりあえず man perltoot
>>554
ごめんなさい…
PerlはLisp風に書くのがいいよー。値を保存するのは
オブジェクトじゃなくて、関数ということで。
>>555
packageよりはアロー演算子(->)とblessかな。
アロー演算子を色々使って遊んでれば身につくと思われ
Perl6って出るの?
561デフォルトの名無しさん:04/02/20 00:22
STDIN,STDOUT,STDERR などの標準ファイルハンドルと、
ユーザーの作成したファイルハンドルとの違いは、
起動時に存在しているかどうかだけですか?

標準ファイルハンドルをclose→openして開きなおしたときに、
明示的なcloseを書くべきかどうか迷っています。
すでに在るファイルハンドルでopenした場合は勝手にcloseした後にopenされますよ
例えば

for (my $i = 0; $i < $restsec ; $i++) {
print "Waiting : $i / $restsec \n";
sleep(1);
}

のようなときに、同じ行に繰り返しメッセージを描画するには
どのようにすればよいのでしょうか?
print "Waiting : $i / $restsec \r";
>>564
>>565
ありがとうございました。感謝
567デフォルトの名無しさん:04/02/20 08:16
$std=\*STDOUT;
$std=*STDOUT;
この二つはまったく同じ意味ですか?
>>561
全てのファイルハンドルはプログラム終了時にcloseされるので、明示的にcloseする必要はない。
570デフォルトの名無しさん:04/02/20 09:54
>>568
そのサイトの例にもあるように、

1) *this = *that;
2) local *Here::blue = \$There::green;

1はthatというシンボルで名指し出来る6種類の値全てのエイリアスとして
thisを設定するという意味です。
2はThereパッケージのgreenシンボルの「スカラー値」のエイリアスとして
Hereパッケージのblueシンボルのスカラー値を設定するという意味です。

そこから考えると567のは
$std=\*STDOUT;これはファイルハンドル値だけをエイリアス設定して、
$std=*STDOUT;は全のて値を設定していると見ていいんでしょうか。

なんかいろいろ考えてたらわけわからなくなってきました
571デフォルトの名無しさん:04/02/20 10:05
$STDOUT="STDOUT\n"
$std=\*STDOUT;
これはSTDOUTというシンボルで示すことのできるハッシュ値の
リファレンスを$stdに代入しているんですよね。しかし
print $std "$std" なることができるこの不思議。
結果はこうです→GLOB(0x817b350)

$std=*STDOUT;
こちらはprint $std "$std"の
結果はこうです→*main::STDOUT

スカラーコンテキスト、リストコンテキストと並んで
ハンドルコンテキストみたいなものがあって、暗黙の
デリファレンスがあることはわかりましたが、
この二つの出力の意味するところが分りません。
>>570-571
>>568 のページにも書いてあるだろう?
> perlref, perlsub, perlmod を参照してください。
と。
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlref.html#Making_References

$std = \*STDOUT; はグロブリファレンスの代入。
$std = *STDOUT; は型グロブの代入。
実用上はどちらもほぼ同じ事。

ファイルハンドルという「型」に対応する prefix は存在しないし
リファレンスも作れないが、シンボルテーブルのエントリ = グロブ
を介してアクセスする事はできるので、ファイルハンドルを持ち回り
たい時はグロブを持ち回る。
573初心者:04/02/20 14:20
$check1,$check2,$check3,$check4,$check5という変数があって
その1,2,3,4,5というところをさらに変数にして
for文などでまわしたいんですけれど
そういうことってできるんでしょうか?
もしよろしかったら教えていただけませんか?
配列にしなさい
Win32::APIモジュールの基本的な使い方ってどうでしたっけ?
ど忘れしてしまったんで、教えてくださるとありがたいです。
>>573
シンボリックリファレンス
古の時代の技法なり
>>575
ぐぐるの使い方とドキュメントの見かたもど忘れしたんですか?
>>537
my $num = 1;
while(${'check'. $num}){
${'check'. $num};
$num++;
}

もっとも勧められないタイプの記述ですが。
勧められた方法使いたいならハードリファレンス調べなさい。
>>573
あとはeval使う方法もある
言語として出来ることと正直おすすめできない方法は
分ける必要があるよな〜
evalってそういうどうでもいいことには使うべきではないかと。
当たり前だけど。

ところでevalって例外以外にはどんな使い方してますか?>ALL
evalと一口に言ってもeval($str)とeval{ statement }はまったく用途が違うわけで。
前者は動的にコードを作成する為にしか使わない(使うべきではない)し、
後者は例外補足以外には使わない。
>>581
なるほど。でも詰まらないね。
>569
perlの場合、close の戻り値をチェックしないのは深刻なプログラムエラーだ。
特にperlではオープンした後にエラーを受け取る機会がない例が結構ある。
584561:04/02/20 23:40
標準ファイルハンドルも含むファイルハンドルはすべて、
明示的にcloseして、さらにエラー処理を行うのが正解
ということですね。
ありがとうございました。
>>580
CGIでcookieとかQUERY_STRINGとかの文字列を
perlのハッシュの定義形式に変換してevalするなんてことを前にやったことあるよ

こんな文字列を
var1=aaa&var2=bbb&var3=ccc
↓に変換してeval
('var1'=>'aaa', 'var2'=>'bbb', 'var3'=>'ccc')

しかし、地道に一個一個分割して処理したほうがよいことを知った。_| ̄|○
586デフォルトの名無しさん:04/02/21 00:35
質問です。
変数 $hoge の中身が
XXX\nXXy\nXyy\n
だったとします。

これを要素一つだけの配列 @hogehoge に
XXX
XXy
Xyy
のように格納するにはどうすればよいのでしょうか?

foreachで使えるようにしたいのですが。
587split /\n/;:04/02/21 00:43
588デフォルトの名無しさん:04/02/21 00:58
それで良いんだ・・・・・・・・・・

どうも@_ = split(/ptrn/,$hoge );
に慣れてなかったです・・・・・・・・

ありがとうですっ。
>>586
要素一つだけの配列?
590573です:04/02/21 02:49
質問に答えていただいた方ありがとうございました。
配列に入れるのが簡単なのは知ってたんですけど、
ちょっと他のやり方はあるのかなと疑問に思ったもので
質問させていただきました。
>>582(580?)
OK.わかった。じゃあ取って置きのevalの使い方を教えよう!

・eval($str)
コイツがあればCの#ifdef - #else - #endifディレクティブのエミュレートができるぜ!
BEGIN{
if(expr){
eval <<'EOT';
code
EOT
} else {
eval <<'EOT';
else-code
EOT
}
こいつぁ便利だ!!

2.eval{ statement }
これはdo{}同様式にならない文を式として扱えるぜ!
ただこれはdo{}と違って中でreturnすることでeval{}を終わらせることが出来るんだぜ!
print do{ return 'foo' }
# => Can't return outside a subroutine
print eval{ return 'foo' }
# => foo

evalは奥が深いぜ!!
print &{sub{ return 'foo' }}
(w
lispだとevalってどんなかんじで使うの?
594デフォルトの名無しさん:04/02/21 13:10
>>591
詰まらないと言ったのはそういう意味じゃないの。
頭が固いね、という意味。
アンタの例なんてCPANのモジュールを読めば
腐るほど出てる。別に解説してもらう必要はない。
eval はCGIで更新系を評価しないために使うよ。
表示系だけ必要な場合が圧倒的に多いし、そんなときにパーサ動くのって無駄じゃん。
最近はData::Dumperもファイルハンドルに出力できるからデータの保存はラクになったよね。
昔は必ず一度文字列にしてしまってたからデータ量が多いとかなり無駄があった。
読むときは do ファイル名 だとperlで行単位でパースするよりかなり高速。
まあ行ごとに捨てるようなことできないのが難っちゃ難だけどね。

ヒューマンリーダブルでなくていいならStorableでいい話か。

597あぼーん:あぼーん
あぼーん
RS232C接続でメッセージを送信するスクリプトを作っているのですが、
モードのセットがうまくいかずに困っています。
ちなみに、win2kserver&active perl5です。

OUT +>>COM1:96,N,8,1ではどうやらうまくセットされているようではなく、
困った挙句にsystem("mode BAUD=96 DATA=8")などとやってみました。

systemを使うとうまくはいくのですが、
comが占有されている状態では、「COMは今つかえません」とかいう
メッセージが標準出力に出てしまい、そこで処理が止まってしまいます。

できれば占有状態ならリトライをかけたいのですが、
うまい方法はありませんでしょうか。
systemに頼らずにモードをセットできるのが一番いいなーとは思うのです。

いい方法をご存知の方、知恵を貸してください。
教えて君&長文で申し訳ないのですが、宜しくお願いします。
599デフォルトの名無しさん:04/02/22 01:23
例えば my @list
というようにリスト変数を用意し、pushしてその中身をいくつか入れたとします。
その後、このリスト変数の要素を一度、空にして、再度 push して別の要素を
入れていきたいと思った場合、@list = () で一端空にすればよいのでしょうか?
(pushして入れたデータを明示的に取り出してリストを空にしなくても良いのでしょうか?)
>>599
配列やハッシュは素直に () で中身を空にすればよろし
とラクダ本に書いてあったような気がする
>598
ActivePerlからWin32APIを呼ぶ。
呼ぶAPIは http://piza2.2ch.net/tech/kako/973/973187725.html の260以降参照

>599
@list=(); でも undef @list でもお好きな方を。$#やらspliceやらでもいいよ
CやPHPみたいなdefineって無いんですか?
コンパイル時に置き換えてくれるやつ
>>598
Win32-SerialPort
>>601
perl4 の頃は $# 減らして増やすと中身復活したけどな。
今はデストラクタ絡みがあるから復活しないが。
>>605
602じゃないけどそんなのあるんですね。知らなかった。
実行時にコンパイルする以上あんまりありがたくないね
pushで適当に中身を入れた@listがあるとき
@list = ();しないで @list = @list2; でも @listの
中身は@list2にならない? うちのはそうなるよ。
それが正しいのかどうかは知らないけど、、
609デフォルトの名無しさん:04/02/22 20:34
ひょっとしたら、すんごい勘違いかなにかかもしれませんが…

最近「初めてのperl(3版)」始めたんですが、<STDIN>で躓いてます。
p.66の練習問題なんですが…
標準入力を1行ずつ受け取って、逆順にして表示(出力)という問題で、回答例が
print "Enter some lines, then press Ctrl-d:\n"; #又はCtrl-z
print revese <STDIN>;
実際に「1<ENTER>2<ENTER>3<ENTER><Ctrl-z>」とやると「2」と「1」しか表示されません。
「1<ENTER>2<ENTER>3<ENTER><ENTER><Ctrl-z>」と最後に余分にENTERを入れると「3」から表示されます。
またreverseを抜いて、入力順に表示させようと
print <STDIN>;
とやって「1<ENTER>2<ENTER>3<ENTER><Ctrl-z>」と入れると最初の「1」が表示されません。
「<ENTER>1<ENTER>2<ENTER>3<ENTER><Ctrl-z>」とやると「1」から表示されます…

どちらの場合も1番最初の数字が表示されないのは何故なんでしょうか?

入力したものを@linesとかに入れて全部表示させると、$lines[0]にきちんと入っているようなのですが

#念の為:Win95 perl v5.8.2
w2kで試してみたが、君の言うような例は起きなかった。

perl -e "print reverse <STDIN>;"
入力
1改行2改行3改行^Z改行
出力
3
2
1

f:\oyama>perl -e "print <STDIN>;"
入力
1改行2改行3改行^Z改行
出力
1
2
3
>>602
プリプロセッサとは全く異なるが、定数を定義するプラグマが提供されてるよ

#!perl -w
use constant FOO => 2;
print FOO * 2, "\n";
__END__

値が単純なスカラーであればコンパイル時に展開されるから変数使うより速い。
612デフォルトの名無しさん:04/02/23 00:28
定数は文字列に埋め込むときにめんどくさいんだよな....
ちょっと話違うかもしれんけど。

sub PI(){
3.14;
}

↑コンパイル中に、PIが定数として定義される技。
引数も&も書かないで記述中にPIって書いたら3.14って書いたコトになる。
616デフォルトの名無しさん:04/02/23 10:25
>>615
色々なやり方がある所がPerlらしいですね。
617609:04/02/23 12:06
>>610
ありがとうございます。

自宅のPC(WinMe)で試したところ…

610さんのように
perl -e "print reverse <STDIN>;"
とDOS上で叩くと上手くいくようですが、
ファイルに
print reverse <STDIN>;
と書いて(例えばtest.plとして保存し)、
C:\perl\bin > perl test.pl
を実行すると最初の文字が表示されませんでした。

なんでだろう…

618デフォルトの名無しさん:04/02/23 13:52
Ruby の p ないし pp みたいな便利関数はありますか?
Data::Dumper の出力はカコワルイです。
たくさんの正規表現があって、テキストファイルからそのどれにもマッチしない行を抽出
したいのですが、どう書けばいいのか迷っています。

とりあえず@REに正規表現の文字列が入ってるとして

LOOP: while (<>) {
foreach (@RE) {
next LOOP if /$_/;
}
print $_;
}

というのが思いつきますが、これだと毎回正規表現がコンパイルされそうです。

これを解消する方法として、

(1)内側のループを展開したプログラムを生成してeval
(2)(?:$RE[0])|(?:$RE[1])|...|(?:$RE[n])のような一つの正規表現にまとめる

というのを考えましたがどっちがましでしょうか? あるいはもっと良い方法は?

621ヽ(´ー`)ノ:04/02/23 14:25
>>613-616
というか、constant.pm は >>613 の性質を利用してる。

>>619
qr// と //o、あとはベンチマークしる、としか。
>>620
>>621
qrというのがいつの間にかできていたのですね。ありがとう
わしもリファレンスはらくだ本2ndEditionばっか見てたからqrは最近知りました・・・
ダメだな〜
624デフォルトの名無しさん:04/02/24 01:48
パターンマッチングで、例えば、文字列の最後がセミコロンで終わら「ない」行
を抽出したい場合、このようなマッチしない行を取り出すにはどうすれば良い
でしょうか?
>>624
!
626デフォルトの名無しさん:04/02/24 04:30
パターンマッチングで、本を読んでいたら
$s = abcdefghijk;
$f = a;

$s =~ /$f/;

これで$sの中身はaになると思っていましたが、違うようです。
$sの中身はabcdef..と全部出てきます

$s の中身をaだけに、つまりマッチングしたものだけにする方法をお教えください。
// はマッチングを行うが文字列の変更はしない。
/// はマッチングした部分に置換を行う。
まず m// と s/// の説明を読め。

$s =~ /(a)/ and $s = $1;
あ、 /// なんて表記はなかったな。 s///
>>626
( $s ) = ( $s =~ /($f)/ );

とすれば$sはマッチングした文字列になるよ。
マッチしなかったら空になるけど。
>>602
以前ここで聞いたんだけど、プリプロセッサはないそうだ。
632626:04/02/24 15:39
マッチした部分は取り出せました。追加質問ですが
$s = agagagaga;
$f = a;

で、$sをaaaaaにするにはどうすればよいでしょうか?
$s =~ /($f)/g and $s = $1;
( $s ) = ( $s =~ /($f)/g );
でもaは一つしか出てきませんでした。
>>632
毎回正規表現の度に質問するのか?ちょっとは頭使えよ。
そんなに大きくないデータを扱うプログラムを書いて見ようと思うのですが、
以下の3点を考えています。
Data::Dumper
Storable
DB_File
速度とかメリットとかデメリットとか、
その辺を比較してあるサイトありませんか?
>>635
自分でベンチマークしろよ。そんな手間でもあるまい。
>632
print join'',($s =~ /($f)/g);
>635
Dumper ヒューマンリーダブル。マシン間の互換性も問題ない
Strorable ↑の逆。
DB_File 設計から変わるので上2つとは全く違う話になる。環境依存で設置が面倒。
639635:04/02/24 20:00
>>636
返す言葉もありません。。
と言う事でベンチして見る事にします。

>>638
ありがとう。シンプルな説明で非常にわかりやすかった。
CGIの事じゃなくて CGI.pm の事はココで良いのかな?
# スレ違いなのかスレ違いじゃないのか悩む

CGI.pm で no_xhtml プラグマを指定して、start_html のパラメータ -style のオプション -src に配列リファレンスを渡すと、
HTML 4.01 Transitional としてオカシイ <link rel="stylesheet"> が出力されるんですが、、コレって仕様ですか?CGI.pm のバージョンは 2.752です。
# <link .. >/ <- 最後に /(スラッシュ) が入るんですよね

それと解決方法としてはベターな方法があれば教えて頂けますか?
パッと思いついたのは、1. CGI.pm 最新版を入れてみる、2. perl5.8 (98.2%却下されそうですが、、)、3. CGI.pm を直接修正してみる、4. no_xhtmlをやめる、ぐらいなんですけど。
# 個人レベル(私の権限)で出来るのは(4)だけか、、

use strict;
use CGI qw(no_xhtml);
my $cgi = new CGI;
print
    $cgi->header(-type => 'text/plain'),
    $cgi->start_html(
        -style    => { -src => [ 'hoge.css', 'foo.css' ] }
    ),
    $cgi->end_html;
exit;

# 出力
<!DOCTYPE html
    PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en-US"><head><title>Untitled Document</title>
<link rel="stylesheet" type="text/css" href="hoge.css">/
<link rel="stylesheet" type="text/css" href="foo.css">/
</head><body></body></html>
641デフォルトの名無しさん:04/02/24 20:51
文章内に語彙外の単語があるかどうかの検索をしたいんですが・・
@bunという配列のリスト(各行)の中に@word外の単語を含んでいるリストのみを
抜き出したいのですがどうすればよいでしょうか?
検索されたリストが重複してしまいgrep関数を使ってもうまくいきません。
@bun=("1行目","2行目"・・・);
@word=("単語","単語"・・・);
>>640

>>1にこう書いてある
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc2.2ch.net/php/ )
>>640
ついでに何か勘違いしているもより。
http://www.w3.org/TR/html4/loose.dtd 嫁。
>>640
CGI.pm の最新版を適当なディレクトリに入れて use lib し、
XHTML で書く。
>>641
my $pattern = join '|', @word;
my @unmatch = grep !/(?:$pattern)/o, @bun;
646デフォルトの名無しさん:04/02/24 21:42
>>645
感謝
♥α
648デフォルトの名無しさん:04/02/25 08:31
>>645
それだと@word内の単語が一つも含まれていない行を抽出するような希ガス。
お題は@word内の単語以外のものが含まれてるリストでしょ?
>>640
該当バージョンの CGI.pm 1390行目から読んでこい、以上
650649:04/02/25 09:57
ちなみにこれはバグらしい。ver2.81で直っている。

> Removed extraneous slash from end of stylesheet tags generated by start_html in non-XHTML mode.
>>640
2.752とはずいぶん古いバージョンだな。とりあえず最新版入れろと。
勉強がてら

#! c:/perl/bin/perl

#カウントファイルの読み込み
open(FILE, "+<./count.dat") or die("エラー:カウントファイルを開けません");
eval{flock(FILE,2);};
$count = <FILE>;

#カウントファイルの書き込み
seek(FILE, 0, 0);
print FILE ++$count;
close(FILE);

#サーバー出力
print("Content-type: text/html\n\n");
print("<html>");
print("<head><title>counter</title></head>");
print("<body>$count</body>");
print("</html>");

っていう簡単なカウンター作ってみたんだが
SSI以外で表示させるにはどうすればいいんでしょうか?
> SSI以外で表示
できてるんちゃうの?
>>1
SSI以外でHTMLページに埋め込みたいんじゃないの?
ちゅうか、あれこれこっちで井戸端想像せないかんような質問すな
656652:04/02/25 12:06
>>653
すいません・・・
まだ当方初心者なもので・・・
もちろんCGI単体などでは表示できるんですが
HTMLなどに貼り付けて表示させたいんですが
その方法がわからないんです・・・
<img src=count.cgi>などと貼り付けてもうまくいくわけないですし・・・
HTMLにこのカウンターを組み込むにはどうすばよいのか
アドバイスをいただけると助かります。
658652:04/02/25 12:18
すいません。WEBプログ板逝ってきます
>>656
まああれだ、HTMLにCGI取り込むんじゃなくて、CGIでHTML取り込んで
カウンタくっつけて吐き出せ。
>>1の文面を少いじった方がいいのかな。

質問がweb、http、mail、html、cgi、SSIに関係するものはweb programming板へ

とか。
糞味噌に単語を列挙しておかないとわからないやつがいるようなので。
こちらでやってもかまわない質問も多少排除されるかもしれないが、
少なくともweb programming板で板違いと言われることはないだろう。
マジレスすると、HTMLにperlのCGI取り込むなら
・embperl
・ePerl
・Apache::ASP
・apacheでAddTypeとAction駆使して独自に実装
とかか?
662デフォルトの名無しさん:04/02/25 13:25
ProgrammingPerlの4thはまだですか?
3edを買おうかどうか迷っていますが、次が出る予定が
あるならそれまで待とうかと。
それはそうとPerl CD Bookshelf, Version 4.0が出てますね。
http://www.amazon.com/exec/obidos/tg/detail/-/0596006225/
663640:04/02/25 13:47
>>649-650
を、やっぱバグなのね。
それなら上を説得出来る(かも)。
# CGI.pm の1391行目を修正すれば直るのは理解しました

>>644
verUPしてくれなかったらそれで対処してみます。
ありがとうございました。
664デフォルトの名無しさん:04/02/25 19:46
半角が混ざった(空白と数字)文章で
s///構文を文字化けせずに使うにはどうすれば
良いのでしょう?

>>664
>>3 の下二つのサイトを参照
666デフォルトの名無しさん:04/02/26 00:12
perl で UNIX の ncurses を制御したいんですが、それ用のモジュールって
どれなんでしょうか? CPAN の Term カテゴリをざっと見てみたんですが、
それっぽいのが見当たりません。
667デフォルトの名無しさん:04/02/26 00:18
>>666
CPAN search
>>666
CPAN探したっての嘘だろ。あまり人を舐めるなよ。
http://search.cpan.org/search?query=Curses&mode=all
669DQN666:04/02/26 00:26
あぁ、そうか。search がありましたね。いきなり Term ディレクトリに行って
中を眺めてました。失礼しました&ありがとうございました。
CPAN行っても英語だしなー
>>670
毛唐が作ったプログラムを使うには毛唐語が読めなきゃ....

と、いうのは置いといて。 そんなあなたにお勧めのページ。
ズバリ CPAN JAPAN! http://www.cpan.jp/ 逝って見ろ。
・・・・スグにキャンセルするようになる・・・
>>663
へぇ、今どきはちゃんとHTMLのDTDを守ったソースを書かせるのか。
ひと昔前の「ITバブル」のときなんかはもう無茶苦茶だったんだけどな。
674デフォルトの名無しさん:04/02/26 13:53
Win2000でPerl作ってます。

HTMLからPerlへデータを送信するものを作ったのですが、Perlの結果画面に
切り替わった後に前の画面に自動で戻す方法ってあるのでしょうか?
>>674
ActiveStateの中の人?
HTMLと関係するものは板違い
それに質問の意味が分りません
>>674
これって、cgiの問題ですらないような…

Webのリンクでcgiのページを開いて、
一定時間後に前ページに戻るってことでしょ。

HTMLの記述の問題だろ。仕様書かどっかのサイト見れ。

ということで、終了。
おマイら、
>Win2000でPerl作ってます。
で気が付けよ。

パール作る神がなんでここに降臨したもうたかを
田崎真珠の人かも。
print "\a";
sleep(2);
print "\a";
sleep(2);
print "\a";
sleep(2);
print "\a";
これだと6秒経ってからビープ音が鳴るのですが理由分かる人いませんか?
\aじゃなくて文字なら2秒ごとに表示してくれるのですが。
682681:04/02/27 03:28
>>238-242 だった・・・
>>682
なるほど、デフォルトでバッファリングONだったわけですか。
ありがとうございました。
>>679
あこや貝の中の人かもしれない
>>684
スネ夫?
ちょいと教えて下され。最近やっとこstrict宣言を付けるようになったのです。んで、
Variable "%hash" will not stay shared.
このエラーを回避する為に、今まで↓のように書いていたのを、

my %hash = (
    name => 'Tarou',
    age    => 12,
);
sub hoge {
    my $name = $hash{name};
}

↓のように変更してみたんですが、

use strict;
sub hash {
    my $key = shift;
    my $self = {
        name => 'Tarou',
        age => 12,
    };
    return $self->{$key};
}
sub hoge {
    my $name = hash{'name'};
}

これって、、変ですか?
なんと言うか、strict宣言した場合の美しいな変数の取り扱い方がわからないのです。
687640:04/02/27 19:58
>>673
> へぇ、今どきはちゃんとHTMLのDTDを守ったソースを書かせるのか。

超個人的なコダワリだったりします。
レスついでにどうなったかと言いますと、
「めんどくさいからヤ」との一言で却下されますた。。。
root権限1分でイイから俺によこせと、、(つд`;)

なので use lib で使っております。
# てか一緒に落としてきた HTML::Template の方が便利な事に気が付きました(笑)
>>686
根本的になにをしたいのか全く分からん
> my $name = hash{'name'};
そしてこれも謎だ。
ある処理の前にウェイトを置きたいのですが
sleepだとプログラムの処理を完全に止めてしまうので困っています。

止めている間もパケットの処理をしたいのですが
何かいい方法ありませんでしょうか?
>>689
やりたいことがよくわからんが、forkか?
>>686
それじゃerrorもwarningも出ないよ。こんなことしてるんじゃ?
use strict;

sub hoge { 
    my %hash = ( 
        name => 'Tarou', 
        age    => 12, 
    ); 
    sub fuga {
        print $hash{name}, "\n";
    }
    fuga();
}
hoge();

C:\WINDOWS\デスクトップ>perl -cw test.pl
Variable "%hash" will not stay shared at test.pl line 9.
test.pl syntax OK

C:\WINDOWS\デスクトップ>perl test.pl
Tarou
SIGALRMでがんばれ!
たぶんhoge()とfuga()で%hashを共有したいんだろうけど
そんなことはできてないので無駄ですよーということ。
直接fuga()を呼ぶと何も出力されない。
漏れなら素直にグローバル変数にするけど。
>>686
それ以前にblessしてない変数の名前が$selfってのが個人的に落ち着かない…
>>686
変かどうかで言えば
my $name = hash{'name'};

my $name = hash('name');
理由がわからないInternalServerErrorが出て困っています。
Apacheの設定、パーミッションの設定は間違ってないと思います。
perlのパスもバッチリです。誰か原因はわかりませんか?ソースは以下です。

#!/usr/local/bin/perl --

#データファイルのオープンとロック
$datafile = "./counter.dat";
open DATAFILE, "+<$datafile";
flock(DATAFILE,2);

#カウントの取得とインクリメント
seek DATAFILE,0,0;
$count = <DATAFILE>;
$count++;

#カウント表示
printf("%4d", $count);

#カウントの書き込み
seek DATAFILE,0,0;
print DATAFILE "$count\n";

#データファイルのロックと解除とクローズ
flock(DATAFILE,8);
close(DATAFILE);

exit
質問させてください
if(mode == "A"){ Aの処理 }
elsif(mode == "B"){ Bの処理 }

などのように1ページで処理させるのと

Aの処理はAのスクリプトへジャンプ
Bの処理はBのスクリプトへジャンプとして
複数ページ分けて処理するのではどちらが早い(サーバーに負担がかからない)のでしょうか?
>>696
CGIでしょ?HTTPヘッダ出力してねーじゃん

>>697
同じ
気にすんな
あとはスクリプトの規模と保守性の問題
早い話あなたがやりたい方でやれ
>>696
exit ;
~~~
まあ違うと思うが。。。
700697:04/02/29 06:57
膨大なスクリプトだと複数に分けたほうが早いのではないでしょうか?
また、一時ファイルなどの関係もありますし、
その場合は1つのスクリプトでやったほうが早いと思うのですが
まったく同じではないでしょう?違ってたらスマソ
>>700
速度が気になるならベンチとりゃいいだろが。

>複数ページ分けて処理するのではどちらが早い(サーバーに負担がかからない)のでしょうか?
一応言っとくけど速いと負荷は全然違うぞ。

まぁなんにせよ、聞かれても絶対に誰にも答えられない質問だな。
そして自分で調べりゃ一発で分かる問題だ。

つか普通は速度より先に保守性優先するけど。
じゃあ頑張ってな
702697:04/02/29 07:48
>>701
あのぅ
>>一応言っとくけど速いと負荷は全然違うぞ。

負担がかからなくて早い方法を 聞いています

>>つか普通は速度より先に保守性優先するけど。

速度の話をしています
もちろん保守性優先してますよ
>>1
>>700
そんなに速さを気にするなら Apache::Registry 使って、
それぞれにハンドラ割り当てとけ。
705697:04/02/29 09:02
>>704
Thx

>>703
Uza
>>697
そんなの気にする前にアルゴリズムを(r
>>698
SSIです。でもHTMLヘッダがなくてもInternal鯖エラにはならないとおもうんですが。
Internal鯖エラはSSIで読み込むためのスクリプトを直で見に行ったときに出ました。
shtml上では[なんかエラーおきてるよ]っていう意味のエラーメッセージが出てました。
>>707
HTTP Header ね。
ヘッダが問題ならサーバのログに premature end of script とかが吐かれてるはず。
ログの該当部分くらい貼ってくれ。
ま、Webプログラミング板へどうぞ。

Perl コーディング初心者質問コーナー Part31
http://pc2.2ch.net/test/read.cgi/php/1075545279/
いまActivePerl5.8.3 で使えるDBM系って SDBM_File とDB_File くらい?
711デフォルトの名無しさん:04/02/29 15:48
>>710
GDBM_File
>ppm install GDBM_File
Error: Package 'GDBM_File' not found. Please 'search' for it first.
>>712
GDBM_File.ppd でググれ。
そして考えろ。
714デフォルトの名無しさん:04/02/29 19:28
715デフォルトの名無しさん:04/03/01 22:49
一つのファイルを二つの別々のプログラム内でflockで排他制御してるん
ですがAプログラムが実行中でロックがかかってる最中にもう一つのBプログラム
を実行してファイルを参照しようとしたら排他制御って成立しますか?
>>715
そのためのflockでしょうに。
>715 両方がflockしてたら成立する。
718715:04/03/01 23:48
>>716,717
ありがとうございます。
Perlやりはじめでまだ良くわからないもので!
助かりました。
definedって1か空を返すようですが、となると
if(defined($foo)){}
って無駄と言うか冗長と言う事になるのでしょうか。
$foo=0;で
if $fooと
if defined $fooは別物
#if
#ifdef or #if defined
の違いやね。
>>719
defined($foo) は $foo が undef でなければ 1、undef なら undef を返す。

my $foo = 0;
defined($foo);    # => 1
$foo = '';
defined($foo);    # => 1
$foo = undef
defined($foo);    # => 0;

OK?
723722:04/03/03 14:16
-defined($foo); # => 0;
+defined($foo); # => undef;

間違えた_| ̄|○
724デフォルトの名無しさん:04/03/03 16:39
Perlしか書けない自分ですが、Cで書かなきゃいけない事情が出てきますた。
ゼロから始めて、1週間でPerlで書いたものをCに移植ってできますかね?
カンは悪くはないと思うのですが、間違っても天才ではないです。普通のアホです。
お勧めの書籍とかないでしょうか?
>>724
たぶん無理だよ…。
ともかく、どんなスクリプトを移植するかによると思うので、
そのへんを詳しく書かないと。
726724:04/03/03 17:06
がぁん 無理でつか・・・・・

内容は、数十万の文字が意味なく並んだファイルの中身を、先頭から12個づつ取り出して調べて、
その12文字の並びがある条件を満たしていれば、その前後の文字も取り出して先の12文字に足して
さらにその条件を満たすかどうか調べる。
というものです。
文字同士の関係を見ているので、マッチ演算子などは使えません。
条件を満たすための最小長さが12文字で、最大長さは決まっていません。
サイズが小さいファイルではsubstrなんぞでうまくいってたのですが、
数十万字になるとお手上げなのでつ。
>>726
> サイズが小さいファイルではsubstrなんぞでうまくいってたのですが、

while ($n = read(FILE, $buf, $size) ) {
$bufを小さいファイルと思っていじる
}
$sizeは12の倍数。
てな感じでやったら、境界のところは注意しなきゃいけないけど
728724:04/03/03 17:22
ありがとうございます;;
今日はもう作業環境から離れてしまうので、明日試してみまつ。
端的に言えば「0」を通すか通さないかと言う事ですね。
>>729
""モナー
という話よりは、きちんと undef の概念を知った方が後々困らないと思う
>>724
お主に必殺技を教えてあげよう。
perldoc perlembed

半分本気である。
733デフォルトの名無しさん:04/03/04 01:41
ActivePerlって、VisualStudio .NETを使えばコンパイルできるのですか?
734デフォルトの名無しさん:04/03/04 02:03
>>733
すでにコンパイル済みだぞ
シフトJISの2バイトの英数字記号を1バイトに変換したいのですが
例えば「魔あ」ですとバイナリが「96 82 82 A0」でしてこの中の
「82 82」の部分が「b」と同じで「b」に変換されて「96 62 A0」になってしまいます。
これを回避するにはどうすればいいのでしょうか?

jcodeでEUCに変換すればよいかとも思いましたが結局同じ問題を孕んでいるように思いました。
まだPerlに理解が足りないのでこういう事が良く解らないのですが、
小さなスクリプトを書く時、そのまま書いても良いのにわざわざサブルーチンにする利点って
何かありますか。

例えばflockの場合、

open(LOCK, ">$lockfile") or die $!;
flock LOCK, 2;
main();
close LOCK;

で良いのに、わざわざ

sub lock{
open(LOCK, ">$lockfile") or die $!;
flock LOCK, 2;
}

sub unlock{
close LOCK;
}

lock();
main();
unlock();

のようにしてみたりとか。
LOCKをグローバルで持ちまわるのか。サブルーチン化の意味全く無し。
らくだ本にもそんな感じで書いてるやね。
740デフォルトの名無しさん:04/03/04 04:17
>>737
それをやるならファイル関係をクラス化したほうがいいんじゃないの?
741テストさん:04/03/04 04:57
ちょっとてすと
てすてす
742724:04/03/04 10:57
>>732 有難いです師匠。ラクダ本広げてます。試してみまつ。
処理時間云々に加えて、Cで書かねばならない事情がありまして・・・
がんがります。
>>737
その例で書いてるサブルーチン化はまったく意味ないので、
それ書くなら、そのまま書いたほうがいいね。

ただ世の中には本当にうまくサブルーチン化できる香具師も
いっぱいいるので、その人のソースを参考にして勉強すべし
>ただ世の中には本当にうまくサブルーチン化できる香具師も
>いっぱいいるので、その人のソースを参考にして勉強すべし

Perlだけしか知らん人間にはいないだろうな
745クンクン(葬式):04/03/04 14:33
Linux で動くデーモンを Perl で書いています。
普段は root 権限で起動していて、クライアントからのアクセスがあると、
Linux 上の各ユーザの権限で子プロセスが fork するようにしたいのですが、
どういう風に書くといいですか。

クククのクーソ。。。
746クンクン(葬式):04/03/04 15:09
>>745
setuid とか使えばいいみたいでしたね。
クククのクーソ。。。
747クンクン(葬式):04/03/04 15:24
>>.746
POSIX::setuid だった。
他にも $< とか $UID に代入してもいいらしい。

クククのクーソ
ちょいと質問なのですが、
文字列と、別の文字列を比べて、構成文字がどのくらいかぶるか
ってのを出したいと思っています。
たとえば、abcdeとabcedだったら構成文字は同一で100%
abcdeとabcdfだったらかぶり率80%
といった感じに。

一文字ずつにsplitして、ハッシュのキーにぶち込んでみようか?
とか思ったのですが、データ量が200とかあるから、ちょいとコストが・・・

何か言い方法はないでしょうか?
かぶり率をちゃんと定義しろ
abcdeabcde と aaazzz ではどう計算していくらになる?
3個以上のデータでのかぶり率の定義は?
>>749
そんなレベルの人には聞いていないんじゃないかな。
diffとか参考にできるんじゃないの?
いちおー差分抽出アルゴリズムとかあるんでしょ?

まぁでもどの程度まで「かぶる」なのかはっきり決めないと
例えばaabbcc と aaddcc だとかぶり率いくらにしたい?>>748
752748:04/03/04 18:53
レスありがとうです。
>>749
結局やりたいことは、「入力されたデータに似たものがすでに登録されてないか?」
なので、その二つの場合は0でいいと思います。
同様に、3個の場合の比較はしないので・・・

>>751
aabbccとaaddccの場合は、4/6で66%といった感じです。
diffか・・ 見てみます。

上で書いたようにやりたいことは、
たとえば名前がfieldというデータを登録する際に、
すでに名前がfieldのデータがあった場合は上書き処理にしているのですが、
fieldをfiledと間違えた場合に、当たり前ですが新規登録になってしまいます。
(間違えるなってか、登録する前に確認ぐらいしてくれって感じですが(汗)
その際に、
「類似データが1件あります。(fieldのデータ表示) 名前間違えてませんか?」
と言う風に出したいのです。

なのでかぶり率の定義としては、類似のものを取り出せるレベルでいいのですが、
どう計算したものか・・・_no
aaabbbzzz
aaabbzzz
これはどーなんの?
zはかぶってんの?かぶってないの?
ispellとかのスペルチェッカーがやってるようなことがしたいのね
755748:04/03/04 19:10
>>753
その場合は8/9 88%ぐらいで、zはかぶってると判断したいです。

>>754
ispellというものは知らなかったのですが、
まさにそのとおりです。
列中の要素の追加・削除・入れ替えという編集操作を何回繰り返すと、
別の列と等しくなるかを編集距離という。
ところが、この編集距離の最小値を求めるのが、難しいらしい。

ispellは、1文字の追加・削除・変更・隣の文字の入れ替えだけに
限定しているので、中身は知らないけど多少大きなハッシュを持つだけで
対処している。

というわけで、このあたりに限定して、
ありうるパターンを全部正規表現で書いて、
順々に比較していくというのはどう?

例えば abcde なら

追加:
.abcde, a.bcde, ab.cde, .....
削除変更:
[^a]?bcde, a[^b]?cde, ab[^c]?de, .....
入れ替え:
bacde, acbde, abdce, .....

なので、5文字なら15パターン。
順々じゃなくても、全部一気にやればいいか
>>745
root でいごかすよりか、setuidgid した方が安心かも。多い日は。
>>748
もう完全にスレ違いだけどインターフェイスを換えるのも手では?
既存のものは選択肢として与えて、新規登録は別枠の入力にするみたいな
いずれにせよ人間のタイプした文字列をそのまま使うのはセキュ穴の元ですよ・・・
クククのクーソきもい
761デフォルトの名無しさん:04/03/05 12:41
住まん、このスレは、Perl/CGIの話題おkでつか?
"CGI"色が強いならWebProg板の方がよさげでは?
http://pc2.2ch.net/test/read.cgi/php/1077612929/l50
763デフォルトの名無しさん:04/03/05 13:39
>>762
"CGI"色が強いならWebProg板の方がよさげでは?
http://pc2.2ch.net/test/read.cgi/php/あほかお前は/l50
764724:04/03/05 16:08
>>727 師匠、報告します。 12文字の取り方は、
123456789101112
123456789101112
1234...
なので、「12の倍数」というのは使えないのですが、
ファイルを少しずつかぶった数千字づつに分けてやってみますた。
そしたら! 数十万を全てsubstrで見るのと、ほとんど処理時間は同じでした。
意外・・・・・ ってか当然ですか? 折れ・・・・・ アフォ?
765724:04/03/05 16:10
あれ。 最初の3行は、
123456789101112
_123456789101112
__1234...

のつもりでした。
766デフォルトの名無しさん:04/03/05 20:34
VisualStudio .NET で ActivePerl 使ってる人いる?
使い勝手とか聞きたいんですが。

#perlな人ってみんなUNIX系でやってるのかな?
767デフォルトの名無しさん:04/03/05 22:03
クククのクーソ
おさげでは?
769デフォルトの名無しさん:04/03/06 01:12
文字を$data = "10"の$dataから数値を返す関数ってありますか?
>>769
$num = sprintf "%d", $data
771770:04/03/06 01:16
ごめん。うそついた。
$num = $data + 0
関数て言うか、perlには変数に対する固定型はないから。
数値コンテキストで求めれば数値が返るよ。
どんなやりかたでもおk
773770:04/03/06 01:23
>>771,772
即回答ありがとうございます
774デフォルトの名無しさん:04/03/06 09:51
質問です。
2chの現在のトリップ機能をperlで表現するとどうなるでしょうか?
同じトリップになるとありがたいです。
2chtrip()
777デフォルトの名無しさん:04/03/06 12:34
VisualStudio .NET で VisualPerl 使ってる人いる?
使い勝手とか聞きたいんですが。

#perlな人ってみんなUNIX系でやってるのかな?
ActivePerlなら使ってるが.NETにはまったく必要を感じてない。俺はGUIいらんし。
cygwinのperlもいいよな。モジュール入れやすいし。
780デフォルトの名無しさん:04/03/06 17:06
#!/usr/bin/perl

%test = (
"1" => "a",
"2" => "b",
"3" => "c",
"4" => "d",
"5" => "e",
"6" => "f",
);
print %test;
を実行したときの%testの表示順って何順?
ActivePerl
>780
***/***
って出るけどいいのかな(・∀・)ニヤニヤ
782デフォルトの名無しさん:04/03/06 17:17
ハッシュに順序持たせたいときって、どうしてますか?
キーの値だけからなる配列を確保しておくんですが、それって
かなり無駄ですよね。何かいい方法はないものでしょうか?
>>782
> ハッシュに順序持たせたい
って、弱冠ハタチ意味不明なんだが、sort keysじゃあかんのか?
>>783
例えばCSV形式の設定ファイルから値を取ってくる。
そのときにハッシュにしておけば、キーで値を取得するから
コードの可読性が上がる。配列だと数十個の値に対して
番号しかないから。

設定ファイルからハッシュへの値の代入においては、
キーの値の配列を使ってハッシュのスライスを作り、そこに
がばっと代入できる。逆に設定ファイルへの書き込みも
同じようにハッシュのスライスをうまく使える。

そもそも設定ファイルの書式がおかしいのかな。
キーもまとめて設定ファイルに書きこむべき?
>>784
設定ファイルの中はkey=valueの形式じゃあかんのか?
あんたの説明の設定ファイルだと、順序に意味があるってことになるよね。
不注意で書漏れがあるとそれ以降の設定値がトンデモデ−タになる。
まあ、perlの話題じゃないな。一人で悩んでくれ。
プログラム的に規則性の無い独自の方法でソートしたいって事?
レスが少し遅かった予感。
788デフォルトの名無しさん:04/03/06 18:29
Perlをサーバーソフト(ANHTTPD)などを使わずコンパイルするにはどうすればいいんだっけ?
そんなソフトがあった気がしますが・・・
むしろデータの配列におまけでハッシュを作っとくって表現が正しい。
ハッシュにデータ行へのリファレンスつっこむなり配列のインデクスつっこむなりすれ。
>788
君は根本的に間違ってるから、コンパイルって用語から調べなおした方がいい。

HTTPサーバはperlスクリプトをperlインタプリタに実行させるだけ。
791デフォルトの名無しさん:04/03/06 18:31
スマソ
Copalでした。
792デフォルトの名無しさん:04/03/06 18:38
>>784
AppConfig使え
>>789
>ハッシュにデータ行へのリファレンスつっこむなり配列のインデクスつっこむなりすれ

それだとデータの参照時に余計なデリファレンスが発生しませんかね。
>>784に書いたやり方は、設定ファイルの読み書きが殆ど発生しないケースに
おいてはそこそこ使えるやり方ではないかなあと思っていたのですが、、、
もしくはCのように配列に対してのインデックスを
不可変な変数として作っておくことですかね。

>>792 しらべてみます。どうもです。
>>793
DB_FileのDB_BTREEを調べて見れ。自由にソートされた状態に出来る。
ただ、Perl組み込みハッシュを使うより速度はおちると思うがな。
>793
発生したら何か困るのか?

先に回答いっとくと pseudo hashはperlでは一時期だけ存在した。
しかし全く効率的ではないために廃止。


あとはあんたのデータ構造の問題なんで一般的な回答はない。
頭がバイナリですね
perlを使おうか、それともJavaを使うべきだろうかみたいな
798デフォルトの名無しさん:04/03/07 13:15

最近わいせつな書き込みや宣伝書き込みが多発し、対策として、
レンタル掲示板のTcupにある「アルバム機能」というもの
が装備されている掲示板を探しております。
アルバム機能とは、投稿があった場合、管理者が内容を確認し
てから掲載させる機能です。
この機能搭載しているフリースクリプトを探しているのですが、
1週間ほど努力しましたが見つかりませんでした。
投稿があったらメール通知される機能込みで、管理者が内容確
認してから表示できる掲示板スクリプトの所在をご存じの方あ
りましたら、是非とも教えてください。
宜しくお願いいたします。
WebProg板いけ。
>>798
CGI探しの相談はwebProg板でも相手されないと思われ

Web制作板へどうぞ
【CGI】こんなCGI探してますver.12【素材】
http://pc2.2ch.net/test/read.cgi/hp/1075737677/
801デフォルトの名無しさん:04/03/07 15:48
あるログを閲覧する様なCGIで、ちょっと悩んでいます。

ログ中の日本語部分が、\x82\xA0\x83\x90 みたいに記録されています。
これを普通に漢字で表示したい場合は、どうすれば良いのでしょうか?

ご存じのかた、どうかよろしくお願いいたします。m(__)m
pack
SJISをEUC-JPに変換する。
>801
http://www.din.or.jp/~ohzaki/perl.htm の URIエンコードの部分のコードみて、後は自分で考えろ。
805デフォルトの名無しさん:04/03/07 16:32
ありがとうございました。

\x を % で置き換えた後で、アンエスケープ処理したら表示が出来ました。

本当にありがとうございましたぁ。m(__)m
質問させて下さい。
Apache 2.0.47 for Win32の設置に関する
質問はこちらでしてもかまわないでしょうか?
結構です
808デフォルトの名無しさん:04/03/07 18:18
>806
だめ
809デフォルトの名無しさん:04/03/07 19:37
>>806
いいよ。
>>808
死ね
>>806
>>1
>>806
だめ。
>>809
3回死ね。
812798:04/03/07 20:30
>800
すみませんでした。移動します
813デフォルトの名無しさん:04/03/07 20:50
ファイルに
0 0 0 a
1 0 0 b
2 0 0 c

と言ったようなかたちで格納されているデータを3次元配列
$配列名?1番目の数字、2番目の数字、3番目の数字?=アルファベット部
で呼び出せるようにしたいんですが、
自分が使ってる教科書では多次元配列についてなにも記入されてません。
Perlで多次元配列は使えますか?また、具体的にはどのようなソースをかくと良いのでしょうか?
>>813
>>3
815デフォルトの名無しさん:04/03/07 21:00
>813

my $result=[];
while(<DATA>){
s/[\x00-\x20]+$//g;
s/^[\x00-\x20]+//g;
next if not length;
my @l= split /\s+/,$_;
@l >=2 or next;
my $r=$result;
while(@l>1){
my $k = shift @l;
$r = ($r->[$k] or $r->[$k] = (@l==1?(shift @l):[]) );
}
}
use Data::Dumper;
print Dumper($result);
__DATA__
0 0 0 a
1 0 0 b
2 0 0 c
0 0 1 d
1 0 1 e
2 0 1 f
ありがとうございます。
817デフォルトの名無しさん:04/03/07 23:26
だーかーらー
「VisualStudio .NET で VisualPerl 使ってる人いる?」
って俺様に何回言わせんだよボケども。あぁ?コラ!
Perlに関してはかなり深い知識をお持ちのあなた方が
がん首揃えて答えられない質問じゃねーだろーが!
さっさと質問に答えればいいんだよバーカ。
それではご教授お願い致します。(かしこ)
いねーんだろ。
819デフォルトの名無しさん:04/03/07 23:53
レスが憑かないことから判断できない池沼がいるスレはここですか?
いたらどうなの?
Winsowsの話は別スレでやってもらおうぜ
隔離だ隔離
>>821
ヒステリー婆ぁ、氏ね
ActivePerl使いとしては隔離には反対。
unix固有の問題も隔離してくれるんなら同意してもいいけど、不毛だろ?


俺はperlのWindowsでもMacOS9でもunixでも動くあたりが好きだよ。
シェルスクリプトでもバッチファイルでもこうはいかん。
それこそがPerl(゚д゚)
>>819の書き込みを見てようやく「池沼=知障」だと気づいた。
いけぬまって誰だよ・・・と思っていた。
>>825
なるほど。。。そういう意味だったのか。ありがとう。
MSがActivePerlを標準搭載してくれればな。
DVDが当たり前になってきたし、SFUとセットでも
構わないけど、なんらかの形で標準添付してほしい。
UNIX上でもPC-UNIXがPerlを標準搭載してから
爆発的に普及した。ActivePerlにもそれを期待したい。
LightConeさんもPerlに少し入れ込んでるらしいし。
828デフォルトの名無しさん:04/03/08 11:38
誰ですそのLightConeさんとやらは。
【OS界の】LightCone様とNWSOS【貴公子】
http://pc.2ch.net/test/read.cgi/os/1075632569/
830827:04/03/08 12:02
LightConeを知らない香具師がいたとはな。
死んでくれよマジで、このスレから消えろ。
perlで構造体はどう定義するの?
速度やCPUやメモリ等の負荷を計測する為のモジュールとかありましたっけ?
# benchmarkって速度だけですよね?

100kbぐらいのデータの読み書きなんですが、
DB(postgres)へ保存するかテキストで保存するかちと迷い中なのです。
実際に負荷はどのぐらい違うんだろうと思った次第でして。
>>830
はい、828は逝ってしまいました。
代わりにご報告おば。
なんだよそのLightConeとやらは。おいしそうだな。
>>827
Winの場合、UNIXみたいにテキストベースの案件が
さほど多くないからね。
Officeとか独自形式のファイル多いし。
COM使えないと話にならない世界
ActivePerlってCOMもいけるの?
Win32::OLEとか普通に使ってるが…?
>>839
それってcygwinのPerlじゃだめなんだよね?やっぱり。
今度入れてみるか<ActivePerl
8421●CLIE ◆GodOnnFcO. :04/03/10 02:04
2chの鯖争奪戦の投票用スクリプトでハードウェアIDから固有のIDを生成して投票したらどうか
という意見が出ているのですがそういうスクリプトを作ることは可能でしょうか?
Perlじゃ無理でしたらできそうな言語とか紹介していただけませんか?

【oyster争奪戦】新サーバ情報スレッド 3
http://qb3.2ch.net/test/read.cgi/operate/1078822540/
843デフォルトの名無しさん:04/03/10 02:06
>>842
そんなものいくらでも偽れるが。
You gave me an odd number of parameters to param()!

HTML::Template のエラーなんですけど、
このエラーってどうやって対処すれば良いのか分かる方いらっしゃいますか?

いくら見直してもどこのコードが間違っているのかわからないんですよ。。
意味もわからないし、、
8451●CLIE ◆GodOnnFcO. :04/03/10 02:26
>>843
マジ?
なんかできないらしいと言われたんだけど、、
簡単にできるならソースぎぼん、、スンマソン
>>844
ハッシュってさ、「キー=値」の組なわけじゃん?
そしたら、配列とみなした時の要素数は絶対偶数になるはずじゃん?
odd number(奇数個)だったらおかしいじゃん?
>>844
odd numberも分かんないのか?辞書引けよ。
普通、HTML::Template のparam()の説明とコードを見ればわかると思うが。
param()の引数が空->セットされているパラメターの名前のリストを返す。
param()の引数が1つの文字列->文字列がパラメターの名前なら対応する値を返す。
param()の引数がHASHのレファレンス->OK
param()の引数がHASH->引数の数は偶数->OK

848844:04/03/10 03:18
>>846
あ、、なるほど、奇数ってそう言う意味で言ってたのか。
激しく理解しました。ホントありがとう。お陰で原因個所もわかりました。
以下、備忘用に原因をメモ。

use CGI;
use HTML::Template;
my $cgi = new CGI;
my $tmpl = new HTML::Template(filename=>'tmpl_file');
$tmpl->param(
  hoge => 'hoge',
  hogehoge => $cgi->param('hogehgoe'), # <- 原因
  foo => $cgi->param('foo'), # <- 原因
);
print $cgi->header, $tmpl->output;

# fix
use CGI;
use HTML::Template;
my $cgi = new CGI;
my $tmpl = new HTML::Template(filename=>'tmpl_file');
my $hogehoge = $cgi->param('hogehoge');
my $foo = $cgi->param('foo');
$tmpl->param(
  hoge => 'hoge',
  hogehoge => $hogehoge,
  foo => $foo,
);
print $cgi->header, $tmpl->output;
849844:04/03/10 03:28
>>847
だぁぁあ、すまぬ、言葉が足りなかった。ごめんよ。
ちゃんと詳細を書けば良かったですね。
丁寧に例題まで出してくれてありがとう。大感謝です。


それにしても、、俺はなんでこう単純な事で長時間ハマるかなぁ、、ハァ、、orz
850デフォルトの名無しさん:04/03/10 03:31
>>845
ソースもなにも・・・送信するデータを偽れば済む話だろう。

-wを指定した時、特定の警告メッセージを出さないようにする方法ってありますか?
なんか、出るって分かってるメッセージが出てきてうざいって言うか…。
以下のようにsortの昇順と降順を切り替えたいのですが、
もっと美しく書く方法があれば教えて頂けませんでしょうか。

@array = sort {$a cmp $b} @array;
if ($sort_down) {
  @array = reverse @array;
}

一行とかで書けないものですかね。
$sth_weapon = $dbh->prepare("UPDATE weapon set EQUIP = ? where ID = ?");
$sth_bothhand = $dbh->prepare("UPDATE bothhand set EQUIP = ? where ID = ?");
$sth_bow = $dbh->prepare("UPDATE bow set EQUIP = ? where ID = ?");

$sth_armor = $dbh->prepare("UPDATE armor set EQUIP = ? where ID = ?");
$sth_armorMB = $dbh->prepare("UPDATE armorMB set EQUIP = ? where ID = ?");
$sth_armorTB = $dbh->prepare("UPDATE armorTB set EQUIP = ? where ID = ?");
$sth_armorTM = $dbh->prepare("UPDATE armorTM set EQUIP = ? where ID = ?");
$sth_armorTMB = $dbh->prepare("UPDATE armorTMB set EQUIP = ? where ID = ?");

open FILE, "0EQUIP.txt";
foreach (<FILE>) {
s/\r//g;
s/\n//g;
@sp = split /\x09/, $_;
$switch = int($sp[0] / 1000);
if ($switch == 1){
$resule=$sth_weapon->execute($sp[1],$sp[0]);
$resule=$sth_bothhand->execute($sp[1],$sp[0]);
$resule=$sth_bow->execute($sp[1],$sp[0]);
} else {
$resule=$sth_armor->execute($sp[1],$sp[0]);
$resule=$sth_armorMB->execute($sp[1],$sp[0]);
$resule=$sth_armorTB->execute($sp[1],$sp[0]);
$resule=$sth_armorTM->execute($sp[1],$sp[0]);
$resule=$sth_armorTMB->execute($sp[1],$sp[0]);
}
}}
$f=$sort_down?sub{$b cmp $a}:sub{$a cmp $b}; @ar=sort $f @ar;
sortに関数リファレンスをそのまま渡す方法がわからなかった。
>>852
@array = sort {($a cmp $b)*($sort_down ? -1 : 1)} @array;
856854:04/03/10 09:44
漏れの疑問にも誰か答えてくんろ
>>855
> >>852
> @array = sort {($a cmp $b)*($sort_down ? -1 : 1)} @array;
>
おお、なるほど。
852じゃないけど
>>855
おお、なるほど。こりゃすげえ。
以前は$aと$bを入れ替えたものをif文で切り替えてたよ
if(syojun){
  @array = sort {($a cmp $b)} @array;
} else {
  @array = sort {($b cmp $a)} @array;
}
自分があほくさい。俺も852じゃないけど

>>854
その>>854でやってる方法しかないのでは?
859858:04/03/10 10:55
と思ったが、単に$aと$b入れ替えるだけで昇順降順になるなら、こうすりゃいいわけだ。
@array = sort {($sort_down?($a cmp $b):($b cmp $a)} @array;
この方法もいいかもしんない。
860852:04/03/10 11:09
>>855
ぉぉぉぉぉぉお、美しい。惚れますた。

>>859
元々これを聞いたのは sort {$a <=> $b} の $a に当たる部分が
リファレンスだったりするので激しく長くなる訳なのです。
なので二回書きたくなかった、と。
>>845
MAC アドレスはいくらでも偽れる。
ものによればランダムに振られていない(設定で好きな値にできる)ものとか、
NIC が氏ぬと 00:00:00:00:00:00 になったりとか……。オススメできない。
あと、俺のマシン、NIC 4 本刺さってるんだけど、4 回投票しちゃうよ?(*´−`)

>>851
-w を使わない……しか無いと思うが。

use warnings や $^w を止めるなら -X。
> 警告メッセージ

Perl5.6以降ならかなり自由に設定できるぞ。

# 全ての警告メッセージを有効にする
use warnings;
print $undefined_variable; # -> Use of uninitialized value in print at ...

# このブロック(or ファイル)内はundefが出てもいいとしよう
no warnings 'uninitialized';
print $undefined_variable;
# ただし他の警告は有効
print 'foo' + 1; # -> Argument "foo" isn't numeric in addition (+) at ...

use warnings FATAL => 'uninitialized'; # 特定の警告を、致命的エラーとして扱う
print $undefined_variable; # -> Use of uninitialized value in print at ... (致命的エラー)

更なる詳細は
perldoc perllexwarn
perldoc warnings
を参照のこと。
>>862
> -wを指定した時、
って言ってるから、ソース変更しなきゃいけないんじゃ意味ないかと。
864perl FTPツール質問:04/03/10 16:44
今、掲示板を作ってるんですけど、
cgi(perl)の先頭行で
#!/usr/bin/perl   はOUTで
#!/usr/bin/perl -- だとOKなんですよぉ...

"--"って何なんでしょうか??
ちなみにFTPツールはNex○FTPです。
roo○FTPならいけるという情報も...
nextFTPで--無しでアップする方法は無いんでしょうか??
ソース全体についてある種のwarningが出なくなるというのでいいなら、

perl -w -M-warnings=〜 hogehoge

とかすればいいんじゃねーの?

ただし、漏れとしてはソース直して必要なところに個別にno warnings
書く方がいいと思うけどね。それ以外の場所で予期しないのが出る状態
になってたときに発見が遅れると思う。

>>864
改行コードを誤認識されるせいらしい。
8671●CLIE ◆GodOnnFcO. :04/03/10 18:02
多少偽れてもいいので>>842が可能かどうか教えて下さい
次回のOyster争奪の投票に利用したいので
じゃー無理で。

スレ違いだ、ボケ。とっとと消えろ。
> この板はプログラムを作る人のための板です。
> あらゆる質問はまずすれ立てるまでもない質問はここでスレにしてください。
投票のためって大義名分があれば、ローカルルールを
無視してもイイとでも思ってるんだろうか。
読んでないんだろ、どうせ。
>867
未承諾広告さんに聞けばいい

\e
>>867
ともかくサーバ側で動く集計プログラムの仕様がわからにゃ何とも

MACで票の一意性を保ってるならLinuxなら自由にMAC設定できなかったっけ?
パケット偽装するならイーサネットレベルだからスクリプト言語なんかじゃ無理だと思うが
873デフォルトの名無しさん:04/03/10 20:18
サーバサイド・スパイウェアをPerlでつくるスレはここですか?
はどうえやIDを検証する方法があればねぇ(哀)
投票数を & 0xFF すれば愉しそうだけど。@嫌われているところが一目瞭然(w
お神籤でもあみだくじでもよさそうな。
MAC設定出来るも何も、レイヤー考えれ

まーネットで信頼性のある投票なんてできた試しがないよな。

どうせネットで送信するのだから、送信するものはいくらでも偽装できるし。
やるとしたら、ハードウェア固有の何か(ここで言われてるようなMAC
アドレスとか)を独自アルゴリズムでコード化してそれを送信して、
受け取る側ではそのコードの整合性をチェックすればいいと思うけど、
そうするとアルゴリズムは当然秘匿しなきゃいけないから、Perlじゃ無理だね。
独立スレでも立てたら?
独立スレたてたところで、
厨房っぽさ前回の香具師らが騒ぐだけで
まともな意見はでないと思われ
ドングル買った奴だけ投票できるようにする。
技術的にはhttp://www.jpki.go.jp/使っても出来るけど、犯罪だね。
8791●CLIE ◆GodOnnFcO. :04/03/10 23:49
perlじゃ無理か、、
PHPでも無理らしいです
ってか専用ソフトでもないと不可能ですかね、、
>>879
もう書き込まなくていいよ
ネットワーク上の特定のノードを検出できる絶対に偽装が不可能な
方法が必要なわけですよね。もしそれを思いつくことが出来たなら、
2ちゃんの鯖投票に使う前に特許とって会社起こしたほうがいいですよ。
882デフォルトの名無しさん:04/03/11 00:37
HTML::FormParserというモジュールCPANからとってきたのですが
サンプルどおりにやってもうごきません。

use HTML::FormParser;
$p = HTML::FormParser->new();
$p->parse($html,
 start_form => sub {
my ($attr, $origtext) = @_;
 print "Form action is $attr->{action}\n";
});
start_タグ名という名前で関数を渡してやれば、タグを発見した時にコールバック関数が呼ばれる
見たいですが、何も表示されません。

どなたか使ったことあるかたいましたらおしえていただけませんでしょうか?
一人で複数のノード持ってたり、一つのノードを複数人で共有してたら、
どうなればいいの?
# 完全スレ&板違いだが
板違いのレスで埋まりまくってんな。

>>879
あんたのように板違いを承知でマルチしてるやつが
投票の管理をしてるとはね。
すれ違いですまないがレス。

ここまでのレスで指摘されたのはMACアドレス偽造などのネットワーク的な問題点。
perlだからどうというものではない。(クライアントサイドだしperlが向いているとも思わないが)

したがって、もし続けたいならネットワークプログラミングのスレへ移動するのを薦める。
>>882
今、インストールして動かしてみたがチャンと動いたぞ。
まさか、お前、$html空じゃなかろうな?
>>882
$htmlにはどんな文字列を入れましたか?
>MACアドレス偽造
LANカード複数持ってればそれだけ投票可能

メール認証はISPメールに限定すればいけるかも
889デフォルトの名無しさん:04/03/11 01:40
>>886,>>887
HTML::FormParserのドキュメントには書いてなさそうだったので
HTML::Parserのparse()を見てみたのですが
ファイル名かファイルハンドルを渡せばよいのではと思っているのですが
間違ってましたか?両方試したのですが何も出力されません。
>>889
>HTML::Parserのparse()を見てみたのですが
> ファイル名かファイルハンドルを渡せばよいのではと思っているのですが
それは、parese_file!

それをやりたいなら、FormParser.pmに次のものを書き加えろ。

sub parse_file
{
my ($self, $file, @types) = @_;
my %cbs = @types;

for (@tag_names) {
$self->{$_ . "_callback"} = $cbs{$_} if exists $cbs{$_};
$self->{$_ . "_start_callback"} = $cbs{"start_$_"}
if exists $cbs{"start_$_"};
$self->{$_ . "_end_callback"} = $cbs{"end_$_"}
if exists $cbs{"end_$_"};
}
$self->SUPER::parse_file($file);
}

一回吊ってこい
891890:04/03/11 02:00
>>890
s/parese_file/parse_file/

くそ、つい興奮してしまった、鬱
まずはFormくらい自前でパースできるようになろうね
モジュールに手を出すのはそれから
893デフォルトの名無しさん:04/03/11 08:07
>>889

PODを読むとDESCRIPTIONの冒頭にはっきり書いてあるのだが...

HTML::FormParser takes a string containing HTML text and parses it, looking for forms.
ケチ論
英語が読めない香具師はCPANモジュールを使うなどという、大それた野望を抱いてはいけない!
ttp://cgi0.biwa.ne.jp/~yabuta/study/jmeter/

↑みたいなperlで書かれたapache負荷計測プログラムみたいなもんてあります?
896デフォルトの名無しさん:04/03/11 13:41
webprog板から誘導されてきました。
変数を別ファイルに設定ファイルとしたい。
ラクダvol2のdo関数の項目でdoを使うとよいとかいて
あったけど、use strictを使うとaborted due to compilation error
と怒られました。use varsで変数を宣言しても同様です。
<main.pl>
use strict;
do './ini.pl';
print $aa;
<ini.pl>
use vars qw/$aa/;
$aa='aa';
スコープの問題だと思うけどuse strictを使って
exporterやファイルopenして処理する方法以外でよい方法は
ない?設定ファイルは簡潔にしたいので。。
>>896
あらかじめini.plの中で定義したい変数名を決めておいて、main.plの
側でそれらをuse varsしとけば問題ないはず。ini.plでuse varsしても
ダメ。

898337:04/03/11 13:54
>>897
いけました。ありがと。
use varsはパッケージグローバルで
ファイルの終わりによって効果が切れるから
という理由でいいのかな。
>>898
違うだろ。単純にdoでコピペするファイルの中身はコンパイル時には展開されていないつぅ事だろ。
試しにini.plの中にuse varsで定義してない変数を書き込んでごらん。素通りだから。
要するにuse strictの恩恵は受けられないつぅ事だ。いいんだか、悪いんだか。
設定ファイルを持ちたいなら
キー=値\n
とでもしてハッシュにぶち込んだ方が保守性良くないか?
なるほどそういうことだったのか。誤解していたよ。

同様にeval使って

use strict;
eval '$x = 1;'

なんてのも通るのね。知らんかったわ。

902896:04/03/11 14:54
>>899
すっごいわかった。今までの疑問がすべて溶けていったよ。
もひとつ便乗質問します。

<main.pl>
use strict;
my $aa;
do './ini.pl';
print $aa;
<ini.pl>
$aa='aa';
上のソースでmain.plのprintが表示されないのは
どうしてでしょうか?
実行時
use strict;
my $aa;
{$aa="bb";}
print $aa;
こんな感じになるって思ってたんだけど。。
903896:04/03/11 14:57
>>900
確かにそう。だけどファイルオープンしないで
するのってなんかスマートかなって。
>>902
myはそれが宣言された最内のブロックまたはファイルの末尾までが有効範囲。
ini.plの中の$aaは別ファイルだからmain.plの$aaは見えなくてmainパッケージの
$aa($main::aa)になってるはず。

ラクダ本3版の2.5.1名前の探索をよく読もう。
>>902
コンソールの具合だろ。
print $aa,"\n";にしたら確実に表示されるだろ。


それより、そんな経験の少なさでuse strictの恩恵を
受けられないdoのコピペで大丈夫かよ。
まあ、他人のやる事だからどうでもいいんだけど。
せいぜい、もがいてperlの達人になってくれ
906905:04/03/11 15:20
>>905
おっと、俺が経験不足だった(w 吊ってくるわ
>896
向こうにレスしようと思ったら誘導されたのねん。

設定ファイルでpackage宣言して呼び出し側で$pacage::aa;で呼び出すのは駄目?
というかそもそも変数だけのファイルならdo使う意味があまり無いんじゃ。
単にrequireで良い気がする。
908896:04/03/11 15:42
>>904
読みました。納得!!以前読んだ時は具体的な意味わからなかったけど
こういうことなんですね。ありがとうございます。
そのページにこのスレの印刷はっときます。
>>905
はい、頑張ります。perlってなんか面白く感じるから飽きないね。
909896:04/03/11 15:50
>>907
駄目じゃないです。いい方法のひとつだと思います。
requireでなくdoなのはラクダ本で紹介されてたから。
910デフォルトの名無しさん:04/03/11 15:50
>>903
package Hoge::Config;
no strict;
%config = ( hoge => hage, ... );#パケージグローバルな変数
1;
--------------
use strict;
use Hoge::Config;
%Config::config;
or
my %config = %Config::config;
--------------
でいいじゃん。
911910:04/03/11 15:52
>>910
とか、ファイルでもつなら
--------------
use strict;
use Data::Dumper;
my %config = ( hoge => hage, ... );
open CONFIG, ">foo.conf" or die "CONFIG: $!\n";
print CONFIG Dumper(\%config);
close CONFIG;
--------------
でどっからでも、
use strict;
my $config = do "foo.conf";
print $config->{hoge}; #hageです
--------------
なんかさあ、
Config.pmにハードコーディングした
パッケージグローバルな変数書いといて、
完全修飾して使うなり、レキシカルにコピーするとか
がまともなんじゃねえの?

とか、普通しねえけど同じpackage 宣言しといて
名前空間同じにするとか、

どっちにしたって読み込むのにopenせんでも
ちゃんとした方法が用意されてるだろうに
912896
>>910 かっこいーですね。
でも、perl勉強のためにはいいんだけど
できればini.pl側はiniファイルみたいな形式に
したくて、かつmain.pl側ではuse strictを使って
フリーのスクリプトみたいにrequireとかで一発取り込み
をしたかったんです。