Perlコーディング初心者質問スレ Part 41

このエントリーをはてなブックマークに追加
1nobodyさん
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
2nobodyさん:05/03/10 00:47:50 ID:sT66OcmD
関連スレ
△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/

CGIだけど、なんか質問ある? Part 12
http://pc5.2ch.net/test/read.cgi/php/1097334246/

【Perl,CGI】参考書籍 第三版
http://pc5.2ch.net/test/read.cgi/php/1030209573/

【Perl】ファイルロック(排他処理)について語ろう
http://pc5.2ch.net/test/read.cgi/php/1024795138/

★負荷軽減対策委員会(Perl、PHP)★
http://pc5.2ch.net/test/read.cgi/php/1034645635/

Perlモジュールについて
http://pc5.2ch.net/test/read.cgi/php/997829243/

CGIに依存しないPerlの話題一般/Part2
http://pc5.2ch.net/test/read.cgi/php/1030548610/

★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc5.2ch.net/test/read.cgi/php/1077525387/

【 スクリプト改造依頼スレ 】(丸投げ) part3
http://pc5.2ch.net/test/read.cgi/php/1105046286/
3nobodyさん:05/03/10 00:49:42 ID:???
4nobodyさん:05/03/10 00:51:53 ID:???
5nobodyさん:05/03/10 00:52:43 ID:???
6nobodyさん:05/03/10 00:53:19 ID:???
7nobodyさん:05/03/10 00:54:37 ID:???
8nobodyさん:05/03/10 00:55:10 ID:???
ム板Perlスレより

[プログラミング自体の経験が無い奴はまずココを読め]
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://perldoc.com
perldoc.jp: http://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/
9nobodyさん:05/03/10 01:03:06 ID:???
前スレと同じテンプレにしたけど、足りない箇所、間違いあったら訂正よろしこ

過去ログ貼るとき「httpが多すぎます」って出た。こんな制限あったんだ

そそ、「コーディングとは云々」ってやつ無かったけどあれやめたの?
前スレ終盤、とんでもないスレ違いの書き込みがあったので気になりますた
10nobodyさん:05/03/10 02:53:34 ID:???
ひらがな -> カタカナ変換はぐぐりまくって

$value =~ s/\xa5\xa4/`/g;
$value =~ s/\xa4([\xa1-\xfe])/\xa5$1/g;
$value =~ s/`/\xa5\xa4/g;

とやればできるとなんとかたどり着いたのですが、この逆の
カタカナ -> ひらがな 変換がどうしてもヒットしません。

ご教示いただけますと幸いです。
11nobodyさん:05/03/10 08:33:39 ID:Cjqv3NW2
ダウンロードツールを作ってます。
ボタンを押して、ページを切り替えるタイプの掲示板cgiのログを落とせるようにするには
どうすればいいのですか?
getでページ切り替えを送信する掲示板ならまだできそうですが、postで情報を送信する掲示板だとどうしていいかわかりません。
12nobodyさん:05/03/10 08:40:58 ID:Cjqv3NW2
13nobodyさん:05/03/10 09:01:21 ID:???
>>10
正規表現の左右逆にしてできないん?

>>11
getでできるならpostでもできるだろ。
何なら書き込みフォーム以外の <form method="post"> を <form method="get"> にすれば? とか。
14nobodyさん:05/03/10 09:11:12 ID:???
>>1 乙。
関連(参考)スレに
・正規表現道場 [ http://pc5.2ch.net/test/read.cgi/php/1105930285/ ]
も加えるとか。
15nobodyさん:05/03/10 15:29:02 ID:Mmpnq31h
例えばとあるCGIを起動したら
http://www.hoge.com/index.cgi
にPOST形式でクエリを送り付けたいのですが不可能ですか?
この送り先は自分のCGIではないです。
CGIの起動はcronで毎日1回です。

getならリダイレクトとかでできると思いますが、POSTはどうすればいいんでしょうか?
16nobodyさん:05/03/10 15:40:29 ID:???
>>15
CGI proxyとかそんな感じじゃないの
socketとかLWPとかで検索してみたら
17271:05/03/10 17:35:54 ID:0qqwutep
csvファイルを読み込み処理するプログラムを作っています。
csvが","のみで区切られているときは、split(/\,/,$file)
等で読み込みできます。
しかしcsvファイルがaaa,"bbb,ccc",dddのようになっている
時に上手く分割する方法を思いつきません。どおすればいいのでしょうか?
18nobodyさん:05/03/10 17:39:53 ID:???
>>17
いったい区切り文字は何なんだよ。
," なのか ", なのか , なのか?
, なんならそれでできるはずだが
19nobodyさん:05/03/10 17:51:58 ID:???
>>17
そんなあなたにPerlメモ
20nobodyさん:05/03/10 17:53:11 ID:???
どこの271だw
21nobodyさん:05/03/10 17:57:38 ID:???
Text::CSVってモジュールあったような。
22nobodyさん:05/03/10 18:06:19 ID:???
>>12のでグルるとJapanese.pmってのがやたらと引っ掛かるけど、
DLしてみたら31万バイトもありやがる。これじゃ鯖が可愛そうな
んで、自分でそのときの必要に応じて作ったほうがいいと思うが
どうよ。漏れは>>10じゃないが。

23nobodyさん:05/03/10 18:12:19 ID:???
>>10
こいうこと?
perl -e '$str="aaa,\"bbb,ccc\",ddd"; @str=split(/,\"?/, $str); print $str[1], "\n";'
bbb
2423:05/03/10 18:13:06 ID:???
ごみん、>>10>>17
2523:05/03/10 18:16:07 ID:???
こうしないとダメだたorz
split(/\"?,\"?/, $str);
すかす変なデータやなぁ
26nobodyさん:05/03/10 18:24:49 ID:???
どうせ split したあと "" => " の unescape とかもしなきゃいけないんだろうから、
Text::CSV か DBD::CSV を使っといた方が良さげ。
27nobodyさん:05/03/10 19:57:46 ID:???
>>10
use String::Multibyte;

my $euc = String::Multibyte->new('EUC_JP');
my $kana = $euc->mkrange('ァ-ン');
my $hira = $euc->mkrange('ぁ-ん');
my $kanahira = $euc->trclosure($kana, $hira);

my $value = 'ヌルポ';
$value = $kanahira->($value);

--
perl 5.8以降
use encoding "euc-jp";

my $value = 'ヌルポ';
$value =~ tr/ァ-ン/ぁ-ん/;
28nobodyさん:05/03/10 19:59:47 ID:0qqwutep
17です。(271は間違いです)
皆様ありがとうございます。

>>17
>いったい区切り文字は何なんだよ。
>," なのか ", なのか , なのか?
>, なんならそれでできるはずだが

区切り文字は,なのですがデータ中に,があった場合に
データがカンマやダブルクォートを含む場合には
"(ダブルクォート) で囲むというルールがあるので
困っていました。
結局下のようなモジュールを使用して解決しました。
http://www.nsknet.or.jp/~kamichan/prog/CSV_pm.html
29nobodyさん:05/03/10 20:18:10 ID:???
>>18
CSVの意味わかってないだろおまえ
3023:05/03/10 22:15:15 ID:???
藻前、区切り文字の意味わかってねーだろ。
3123:05/03/10 22:17:23 ID:???
ってか、タブ区切りでもCSVってExcelで拡張子つくけど・・・
漏れはK3形式だな。>>29はK3てわかってねーだろ(w
32nobodyさん:05/03/10 22:30:19 ID:???
相手がわかってないと思ったら知ったかぶりばかりしてないで説明すりゃいいじゃん。

ちょっとちょっかい出されたくらいで不毛な煽りで返すのは大人げないからやめれ。
3323:05/03/10 22:31:42 ID:???
何か勘違いしてたみたい。

(´Д`)
( 八)
 〉〉
スミマセンスミマセン
34nobodyさん:05/03/10 22:34:02 ID:Lndb2Cof

■■■ お勧めレンタルサーバー ■■■

【ホームページを作るならここをあたれ!】

A:無難なサーバー。 お勧め!!  
 ttp://www.webspeed.ne.jp/  
 ttp://www.wadax.ne.jp/
 ttp://www.ktplan.ne.jp/
 ttp://www.wakwak.net/
 ttp://www.cpi.ad.jp/  
 ttp://solid.ad.jp/  

B:ある程度の障害は大目に。  
 ttp://www.binboserver.com/
 ttp://s55.net/
 ttp://www.j-navi.com/
 ttp://domainya.net/
 ttp://www.j-speed.net/main/
 ttp://www.cyberjellyfish.com/

35nobodyさん:05/03/11 03:18:48 ID:???
>>34
ソケット使えて、しかも怒られないところ教えて
36nobodyさん:05/03/11 03:21:22 ID:???
>>35
バカだな
37nobodyさん:05/03/11 07:04:53 ID:???
おまえさんのアソコこそが最高のソケットじゃないか
38nobodyさん:05/03/11 08:49:18 ID:???
>>37
キモ
3915:05/03/11 11:01:25 ID:BXH5EoKa
>>16
モジュールですか?探して見ます。
4015:05/03/11 11:21:11 ID:BXH5EoKa
http://search.cpan.org/~gaas/libwww-perl-5.803/lib/LWP.pm
今ここでLWPについて見てますが、英語であんまりわかりません。
とりあえずPOSTでクエリを送りつけるのはできるような感じですが、素朴な疑問があります。

例えば
http://www.hoge.com/test.cgi
というところにあるCGIが、ユーザからp=1という要求を受けた時に
http://www.hoge.com/file/
にユーザのIPアドレスをファイル名としたファイルを作成して、それの処理の正否を
ブラウザに出力するプログラムだったとします。

その時に
http://www.sample.com/send.pl
というのがcron起動でhttp://www.hoge.com/test.cgiにp=1という要求を送った場合には
しっかりhttp://www.hoge.com/test.cgiこのCGIはIP名のファイルを作成するのでしょうか

cron起動だと出力内容を受け取れませんよね。もちろんsend.plの出力内容はとれますが、
send.plが何も出力せずにhttp://www.hoge.com/test.cgiにクエリを送った場合には
http://www.hoge.com/test.cgiこの出力内容もLinuxの方には受け取れない?それとも
受け取っているがtext/htmlのものは表示できないだけ?
41nobodyさん:05/03/11 11:43:03 ID:wWuZgVEw
あるcgiの中で
 foreach (@QUERY){
 ($n,$v)=split(/=/);
 next if $n eq "data" && $v !~ /[^\d\%]/ && (@data = split('%',$v));
 $v=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 $n=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 ・・・

って書いてあったんですが、3行目のnextの部分が、どういう処理をしているのかがわかりません。

どなたか、日本語訳を教えてください。
42nobodyさん:05/03/11 11:48:17 ID:???
>>40
>cron起動だと出力内容を受け取れませんよね。
試してみた?
4315:05/03/11 11:49:53 ID:BXH5EoKa
っていうかLWPってかなりごちゃごちゃと難しいんですね。
DBI程度しか使ったことない人間にとってはorz
でもこれを理解すればかなりのことができるような予感。
頑張ります。

>>41
next if 条件式
これは条件式が真であればそれ以降の処理をすっとばして次のループに移るのです。
つまり
$n eq "data" && $v !~ /[^\d\%]/ && (@data = split('%',$v));

$nを文字列比較してdataと同じで且つ、$vの中には\dと%以外が入っていて、
最後の代入文を実行する。

3つの文が全て新ならnext発動です。
4415:05/03/11 11:52:32 ID:BXH5EoKa
>>42
すみません。勘違いでしたm(_ _)m
とにもかくにもwwwってのはブラウザに限らないんですね。
LWPの解説をちょっと読んだらそういうことが書いてありました。

クローラーもLWP使えば作れちゃいそうな感じですね。
ただ、モジュールというよりモジュール群のようなので難しいです;
45nobodyさん:05/03/11 11:54:39 ID:???
>>41
QUERYの内容がurl encodeされていたらurl decodeをする
4641:05/03/11 11:55:17 ID:wWuZgVEw
>>43
いずれにしても、最後の代入文は実行されるということで
いいんですよね?
4715:05/03/11 11:59:20 ID:BXH5EoKa
>>46
&&という演算子を勉強するといいです。
0 && 1
この場合1は評価されません。
1 and 1
1は評価されます。
48nobodyさん:05/03/11 12:00:25 ID:???
>>40
英語でわからんとかごちゃごちゃ難しいとか言ってないで
そこのサイト(ってCPAN本家だけど)の An Exampleだけで目的のことはできるような。
4915:05/03/11 12:02:58 ID:BXH5EoKa
>>48
http://homepage3.nifty.com/hippo2000/perltips/LWP.html
今こっちの日本語ページで勉強してます。
LWPの全容を理解するのが大変なだけで、今回やりたいことだけに的を絞れば
そんなに複雑なことでもないんですね。
50nobodyさん:05/03/11 12:06:46 ID:???
>>49のサイトの

# ユーザ・エージェント オブジェクトを作成
use LWP::UserAgent;
$ua = new LWP::UserAgent;
$ua->agent("AgentName/0.1 " . $ua->agent);

これなんで
$ua->agent("AgentName/0.1 " . $ua->agent);
こんなことしてんだ?
$ua->agent("AgentName/0.1");
の間違いだろ。
5141:05/03/11 12:08:42 ID:wWuZgVEw
>>46
条件文の&&は 且つ という意味でいいと思っていますが。
しかし、最後の文は比較するのではなく、代入してるっぽいので
前の条件文が評価されなくても、代入されるのかなと思ってますが。

間違ってますか?
5248:05/03/11 12:11:10 ID:???
自分もLWP::UserAgent以外使ったことないんだけどね。
5348:05/03/11 12:14:04 ID:???
>>51
間違いです
条件が満たされなくなった時点で次の判定式はスルーされます
5415:05/03/11 12:28:51 ID:BXH5EoKa
これは面白いですね!
他のページの出力内容を自分のページに埋め込むことができるというのはすごい!

LWPを紹介してくださってありがとうございますm(__)m
55nobodyさん:05/03/11 12:45:14 ID:???
なんとなく、 Perl や Web プログラミングをおぼえたてのナイーブだったあの頃を思い出させるスレの流れ。
5641:05/03/11 12:57:15 ID:wWuZgVEw
>>53
ということは、1つ目の条件式をクリアしたあと、
2つ目の条件式をクリアしたときにだけ
代入されて、次のループに移るってことですね?
5748:05/03/11 13:17:32 ID:???
>>56
正解
複数の式を||でつないだ場合は逆に式が真の時点で判定は終了する。
58nobodyさん:05/03/11 13:42:15 ID:???
小数点切り上げって関数がないようですがどうすれば?

$n = 100/49;
if ($nが小数点を含んでいたら){
int $n+1;
}

なんか面倒なのですがこれが普通ですか?

59nobodyさん:05/03/11 13:43:56 ID:???
というか小数点を含む数値がどうか調べる関数もないorz
60nobodyさん:05/03/11 13:47:09 ID:???
馬鹿な話ですがuseってプログラムの先頭に書いたほうがいいんですか?
使う直前の方がいいですか?

後者だと重複useがでる可能性がありますが、それを良しとするなら見やすいですよね。
意見お願いします。
61nobodyさん:05/03/11 13:58:58 ID:???
>>58
>>59
POSIXモジュールのceilとかmodf使えば?
6215:05/03/11 14:20:21 ID:BXH5EoKa
実装できました。

ところでこのLWPって制作側としてはものすごい便利ですが、これを使うと、
ユーザが直接アクセスしてもいないサイトへユーザの情報が自動的に送られてしまったりしますよね?

例えばとある悪質なアダルトサイトがあったとして、悪質だと気付かずにそこに
月額契約をした場合にその入力内容をそのまま他の数十のアダルトサイトへも
LWPでリクエストが送られて自動的に登録されてしまうような惨事も起きてしまう可能性もありますよね。

当然勝手に登録されたといっても、住所や電話番号からクレジットの暗証番号まで正確なので
下手したら裁判でも負ける気がするのですが・・・・

まあもちろんアダルトサイト管理人がLWPを使わずとも手動で顧客の情報で他のサイトにも
登録するのと同じことですが。

このあたりってみなさん気にしたことありませんか?
6310:05/03/11 14:30:12 ID:???
返答遅れてすみません。色々試してました。

正規表現を逆にしてみたりPerlメモの文字コードの
正規表現を見ながら自分なりに書いていたつもりだった
んですけど、上手くいきませんでした。

Unicode::Japaneseは315,392 バイトあるということで、
プロジェクトマネージャに却下されました。。。

色々とご教示いただき、誠に有難うございました。
もしも カタカナ->ひらがな変換に成功した際はこちらで
報告させていただきます。
6415:05/03/11 15:05:14 ID:???
>>63
よくわかんないけど、jcode.plですぐできるんじゃないですか?

jcode::tr(\$str,"ア-ン","あ-ん");
もしも半角カナもというならこれをやる前に
jcode::h2z_euc(\$str);
をやるだけ。

バイト云々ならlength関数とか使いながら一旦適度な長さに分割してそれからくっつける。

そういうルーチンを自分で作ればいいけど何か問題でもあるのかな?
6515:05/03/11 15:07:40 ID:???
追記
単に分割は危ないので、ちゃんと文字の区切りでやりましょう。

my @strings = $string =~ /[\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\xA1-\xFE]/og;
これはeucコードでなくてはならないので先にeucに変換して下さい。
6615:05/03/11 15:21:57 ID:BXH5EoKa
あ、すみません。LWPで1ヵ所質問です。

# リクエストを作成します
my $req = new HTTP::Request POST => 'http://www.perl.com/cgi-bin/BugGlimpse';
$req->content_type('application/x-www-form-urlencoded');
$req->content('match=www&errors=0');

今動作確認したらどうやら
$req->content('match=www&errors=0');
この値は自動的にURIエンコードしてくれてはいないみたいですが、
たとえば
hoge=あいうえお
なんて場合には自分で「あいうえお」だけエンコードしろっていう仕様なのでしょうか?
67nobodyさん:05/03/11 15:29:44 ID:???
>>62
https以外で本名、住所書いたことないし。それもある程度有名なところ。
その他のwebで入力した情報は一般に公開したものと思ってるから気にしてないしそういうとこ個人情報は書かない。
4月から個人情報なんたらは始まるけどどうなんでしょうね。
68nobodyさん:05/03/11 15:37:40 ID:???
LWPはhttpsでも問題なく使えるがそういう問題ではないのか?
よくわからん。そもそも勝手に登録されたものなんて無効だよ。
気にする必要なし。
6960:05/03/11 15:39:38 ID:???
お願いします;
70nobodyさん:05/03/11 16:05:15 ID:???
Perlって

の文字がエラーになるって聞いた覚えがあるんだけど、EUCで書いてれば無問題?
71nobodyさん:05/03/11 16:09:22 ID:???
>>70
sjisでもエスケープすれば無問題
72nobodyさん:05/03/11 16:20:46 ID:???
eqとか==の演算子って$_をデフォルトで対象にしてくれないみたいですが、
そういうことをしてくれるモジュールってありませんか?

for(0..4){
print "3回目" if 3 eq;
}

とかできると便利なんですけどね。
73nobodyさん:05/03/11 16:28:02 ID:???
あっそ
74nobodyさん:05/03/11 17:02:50 ID:???
aa... eq
75nobodyさん:05/03/11 17:25:44 ID:???
>>72
4回目だろ、とかいう突っ込みはありかな
76nobodyさん:05/03/11 18:45:46 ID:stOV0FtX
こんなのは?
print "3回目" if /^3$/;
77nobodyさん:05/03/11 19:20:11 ID:???
横着したがるのもたいがいにせいよと
78nobodyさん:05/03/11 20:08:10 ID:???
>>10
$value =~ s/\xa4\xa5/`/g;
$value =~ s/\xa5([\xa1-\xfe])/\xa4$1/g;
$value =~ s/`/\xa4\xa5/g;
79nobodyさん:05/03/11 20:13:17 ID:???
>>10
ところで、ひらがな→カタカナの変換はあれで大丈夫?

$value = "ばぅばぅ";
$value = "靴が痛い";

こんなのが、ちとヤバイと思うのだけれど。

>>60
大抵は先頭だね。
でも、配布するモジュールでもなければ好きな所に書いていいと思うよ。
(それから、encodingは、エンコードを始める位置で宣言する必要があるはず。)

>>72
sub at($);

for(1..4){
print "3回目" if at 3;
}

sub at($){ $_ == shift }

# 意味不明な世界へようこそ。
8060:05/03/11 21:13:35 ID:???
>>79
やっと来た・・・・・

やはり先頭ですよね。でももしも間違って
100行目: use DBI;
.
.
.
700行目: use DBI;

とかしても表面上にはエラーにならないくらいだから、内部的にも何の問題もないんですよね?(encordingなどは別として)
81nobodyさん:05/03/11 21:30:45 ID:???
use はコンパイル時に評価されるのでは?
実行時に評価されるのは require で。
82nobodyさん:05/03/11 21:43:35 ID:???
>>80
useやrequireは何度呼び出しても問題にはならないことになっている。
モジュールを先頭で呼び出すのは分かりやすくする為にすぎないので、実際に使う分にはどこに書いても構わない。

83nobodyさん:05/03/11 21:57:38 ID:???
>>80
大丈夫。

http://www.harukaze.net/~mishima/perl/man/perlfunc.1.html
> use Module
> 指定したモジュールから、現在のパッケージにさまざまな
> 内容をインポートします。 多くは、パッケージのサブル
> ーティン名や、変数名に別名を付けることで、実現されて
> います。 これは、
>
> BEGIN { require Module; import Module LIST; }
>
> というのと、全く同値です。

> require EXPR
...
> ファイルは、同じ名前で 2 回読み込まれることはありま
>せん。

http://www.harukaze.net/~mishima/perl/man/perlvar.1.html
> %INC ハッシュ %INC は、do や require によってインクルード
> された、個々のファイル名をエントリとして持っています。
> key は指定したファイル名で、value は実際に見つかった
> 場所となっています。 require コマンドは、指定された
> ファイル名が既にインクルードされているかを、この配列
> を使って調べます。
84nobodyさん:05/03/11 23:40:01 ID:???
モジュールの依存関係がわかりやすいように
useは頭に並べておくのが良いと思います。
85nobodyさん:05/03/11 23:55:38 ID:???
自分のサイトでだけ使うサブルーチンライブラリなんかで、
後からどんどんルーチンが増えていく時に、useだけルーチンから出しておくと、
何かと面倒。

なので俺は両方に書いてる。
86nobodyさん:05/03/12 00:26:54 ID:???
Perlで会員制ネットショップのCGIを組むとします。

ログインとかログアウトってどうやるんですか?
CGI::Session使えば簡単なセッションはできますが、相手のIDとPASSをセッションファイルに入れればいいのかな?
なんかセキュリティ云々がよくいわれてますが、どちらにしても言うほどのセキリティなんか実装しようがないですよね。

つまりどのレベルまですれば一般レベルなのかということです。

CGI::sessionでセッションIDはクッキーに焼くことで渡し、セッションファイルにIDとパスを。
IDとパスが実在すればログイン状態。

↑これはセキリティ的に足りないでしょうか?
87nobodyさん:05/03/12 00:43:48 ID:???
>>86
・IPの一致チェック
・cookieはディスクに保存させない
・可能ならSSLを使用
スクリプト作成者にできることはこれくらいでは。

それと、パスは保存する必要なしかと。
88nobodyさん:05/03/12 02:35:22 ID:DLGfeKNq
すいません。四捨五入させなさいとはどう記述すればいいのですか?m(__)m
89nobodyさん:05/03/12 03:03:55 ID:???
>>86
セッションで渡り歩かなくても済むような構成にしてしまうのも手。
渡り歩いた履歴はCookieに溜め込んで、最後のページでIDとPassを入力させて完了とか。

>>88
int()をちょいと工夫すればOK。マイナスには気をつけるよろし。
90nobodyさん:05/03/12 07:24:17 ID:???
PerlMagickは初心者でOKなんかな。
透過PNGの出力ができないんだけど、仕様ですか?
(透過しない)

透過GIFならできました。
91nobodyさん:05/03/12 08:11:23 ID:???
>>88
$num>0 ? int($num+0.5) : int($num-0.5);
92nobodyさん:05/03/12 14:10:22 ID:???
>>91
小数点切り上げもそれくらい短くすっきりとできませんか?
93nobodyさん:05/03/12 15:33:01 ID:???
$num==int($num) ? $num : int(++$num);
94nobodyさん:05/03/12 15:53:09 ID:???
>>93
おお!!
95nobodyさん:05/03/12 17:09:44 ID:???
その短いコードが何をやってるかぐらい理解しようや
96nobodyさん:05/03/12 19:44:08 ID:???
>>60
ちょっといまさらだけど。
useは、通常の実行文ではなくて、コンパイル中に実行される文だから、普通は先頭。

例えば、
1 + 1;
use hoge;
2 + 2;
とか、書いてしまっても、
絶対にuseから処理される。

if(bool){
  use hoge;
}
とか書いても、ifとか、そんな次元じゃなく、
1番最初にuseが処理される。
だから、普通は先頭に書く。

実行結果は、どこに書いても同じになるかもしれないけど、やっぱ普通は先頭。

スコープに影響するプラグマモジュールなら、話は別で、
適切な場所に書いておくよろし。
(ただし、この場合も実際にはuseは最初に処理されている)。

requireは、実行中に処理される普通の文なので、常に適切な場所が良いと思う。
でも、どこに書いても構わないなら、やっぱ先頭がいいなー。わかりやすいから。
97nobodyさん:05/03/13 08:25:22 ID:oiuJgK8i
掲示板つくってるのですがログを読み込んで全部配列に入れて処理してます。
メモリやばいですよね?
98nobodyさん:05/03/13 08:32:34 ID:???
>>97
whileで処理した方がいいなぁ
99nobodyさん:05/03/13 08:58:13 ID:???
>>97
ログの大きさにもよるが、負荷考えるならまず
書き込んだらhtmlに吐き出すタイプにしような。
100nobodyさん:05/03/13 11:22:33 ID:???
>>95
ん?どこが難しいの?
101nobodyさん:05/03/13 11:44:21 ID:???
パーミッションの変更はchmodで出来るけれど、
確認する方法はある?
102nobodyさん:05/03/13 12:53:41 ID:???
>>101
ファイルテスト演算子
103nobodyさん:05/03/13 13:32:47 ID:???
ふつー
chmod … || die
104nobodyさん:05/03/13 15:24:50 ID:???
>>87
テンポラリクッキーを使うのですか?でもそれって相手側に協力を求める必要があるんですよね。
IPチェックはちょっと面倒ですが、ログイン時の人間であるかどうかを確認するとセキリティの向上には
なかなかの効果がありそうですね。
SSLは当然です^^

>>89
それだとちょっと利便性が落ちそうですね。
会員価格とかが実現しづらくなります。


あ、IPチェックも無理だ・・・・・
携帯は確か毎回違うIP提出してくるキャリアがあるんだった・・・・

105nobodyさん:05/03/13 15:25:19 ID:???
remove関数
106nobodyさん:05/03/13 17:40:44 ID:???
>>105
誰に?
107nobodyさん:05/03/13 18:35:32 ID:???
コーディングのスレじゃなくて
perl全般の質問スレになったの?
108nobodyさん:05/03/13 18:39:04 ID:???
うん。
109nobodyさん:05/03/13 23:36:26 ID:???
>>107
っていうか分ける意味がわからんだろ
110nobodyさん:05/03/14 01:38:13 ID:???
>>109
でも、WebProgにあるのにActivePerlのインストール方法とか聞く奴がいるからなあ。
111nobodyさん:05/03/14 11:03:24 ID:???
>>110
それはスレを分けても変わらないでしょ。
基本的にこの板内のPerl関係の質問は大抵同じ人間が回答してるんだから
個人的には分割することに意義を感じられないな。まあ既に分かれてるものを
無理してくっつける必要があるというわけではないけどさ。
112nobodyさん:05/03/14 13:44:36 ID:???
確かに板自体がもうずっと人少な杉だし
回答者はどのスレでも一緒だろうな

そろそろどっかとまた合併すんじゃね?
113nobodyさん:05/03/14 14:07:00 ID:???
そもそもマとムとwebprogと分けるに至った経緯が知りたい。
ヲタク板なんて細分化する必要ないのになぁ。
114nobodyさん:05/03/14 14:52:44 ID:???
ゲ製も別だし
115nobodyさん:05/03/14 16:09:47 ID:???
ユーザ層が違うんだよ。
116nobodyさん:05/03/15 10:01:02 ID:3Ik8WJWF
gzip圧縮転送についてですが
tp://tech.bayashi.net/pdmemo/gzip.html
これを/bin/gzipでなくCompress::Zlibでやりたいのですが
open(STDOUT,"| $gzip -1 -c");の部分をどのように処理すればいいか
分かりません。どなたかご教授願います。
117nobodyさん:05/03/15 10:28:44 ID:???
118nobodyさん:05/03/15 11:26:01 ID:???
>>115
ユーザ層ごとに分けてどうするのよ。どうせ同じPerlだろ。
周辺関連に差は出るが、広い意見だったりちょっと関係ない知識までつくのが大手掲示板の利点でしょ?

CGIは作れるがwindowsで使える簡単なソフトは作れないなんていう人はこの板には結構いそう。
なんかもったいない。みんな一緒なら、知らずに目に入って付く知識で十分できるようになるのに。

って個人的な意見ゴメンね,(__),
119nobodyさん:05/03/15 11:53:16 ID:???
>>115が言いたいのはマ、ム、ウェブプ、ゲ製で
扱われる言語や話題のユーザー層が違うってことだろ
120116:05/03/15 11:56:36 ID:3Ik8WJWF
>>117
ご回答ありがとうございます。
教えていただいたwebに私のやりたい処理と似たような処理が紹介されてましたが
ちょっと違う感じです。スクリプト内部にprint文で書かれた内容全部をgzip圧縮させて
転送させたいです。スクリプトを貼り付けると、以下のような感じで処理したいです。
##の部分がうまくいきません。

#!/usr/bin/perl
use Compress::Zlib;

if ($ENV{'HTTP_ACCEPT_ENCODING'} =~ /gzip/) {
 print "Content-type: text/html\n";
 if($ENV{'HTTP_ACCEPT_ENCODING'} =~ /x-gzip/){
  print "Content-encoding: x-gzip\n\n";
 } else {
  print "Content-encoding: gzip\n\n";
 }

## ここで$bufferに<h1>Hello world</h1>以下の出力内容全てを代入したい

 print Compress::Zlib::memGzip($buffer);

} else {
 print "Content-type: text/html\n\n";
}

print "<h1>Hello world</h1>";
print "aaaaaa";
121nobodyさん:05/03/15 12:24:33 ID:???
>>120
printした後は標準出力に渡されるのでPerlでは圧縮しようがないのだが。
パイプでつなぎたくなければ圧縮してからprintするしかなかろう
122nobodyさん:05/03/15 12:35:49 ID:???
すいません。助けてください。
ID番号の出るスレッドに書き込みしたのですが
どうしてもそのレスを消したい場合に方法はないのでしょうか?
すごく困っています。絶対入れてはならないことをレスしてしまったもので・・
123nobodyさん:05/03/15 12:39:02 ID:???
>>122
レスの削除は、削除依頼板。
http://qb5.2ch.net/saku2ch/
124nobodyさん:05/03/15 12:52:16 ID:???
>122
どこやねwん
125116:05/03/15 13:03:28 ID:???
>>121
ご回答ありがとうございます。
tp://www.rfs.jp/sitebuilder/perl/02/08.htmlを参考にして子プロセスを作ることで出力を$bufferに代入することができました。
回答していただいた方々ありがとうございました。
参考までに成功したスクリプトを貼っておきます。(直したほうがいいところは指摘お願いします)

#!/usr/bin/perl
use Compress::Zlib;

if ($ENV{'HTTP_ACCEPT_ENCODING'} =~ /gzip/) {
print "Content-type: text/html\n";
if($ENV{'HTTP_ACCEPT_ENCODING'} =~ /x-gzip/){
print "Content-encoding: x-gzip\n\n";
} else {
print "Content-encoding: gzip\n\n";
}

if( open BUF, "-|" ){
while ($buf = <BUF>) {
$buffer = $buffer.$buf;
}
close(BUF);
print Compress::Zlib::memGzip($buffer);
exit(0);
}
} else {
print "Content-type: text/html\n\n";
}
print "<h1>Hello world</h1>";
print "aaaaa";
126nobodyさん:05/03/15 13:05:48 ID:???
>>125
その汚さなんとかしろよ
127125:05/03/15 13:06:21 ID:???
すいません。全角でインデントするのを忘れてました。
それ以外で直したほうがいい部分は指摘ください。
128122:05/03/15 13:31:20 ID:???
削除スレ教えていただきありがとうございます。
ですが、とてもじゃないけど、該当する項目がなくって無理でした。
というのが、自分の独り言を赤裸々にタイピングしてる途中に、
間違って「書き込む」のボタンを押してしまったんです。
しかも、人に知られたら恥ずかしいし、どうしようもない内容なんです。
で、IDが1日たっても変わってなかったってのもあって、きっと誰かが
それに気付いて恥をかくか、煽りの的になるなーと思うと、もー気になって
気になってパニックしてます。書き込みは慎重に行うべきですね。
129nobodyさん:05/03/15 15:54:03 ID:???
>>127
いや、全角インデントとかの話じゃなくてさ。
まあ好きにしてくれ。
130nobodyさん:05/03/15 15:54:46 ID:???
>>128
というか何を血迷ってここに書き込んでるんだ?
Perlとどういう関係があるんだよ。
131nobodyさん:05/03/15 16:10:30 ID:???
DBIでMySQLにつないでるんですが、例えばnameフィールドが重複してるデータだけ検索するのって可能ですか?

MySQLだけでは無理だと思うのでPerlでやるしかないと思うのですが、

name,age,mail
太郎,19,[email protected]
次郎,28,[email protected]
....

こういうデータからnameの重複文だけ表示させたいのです。
こういうのって1回ずつやらないといけないのでしょうか?

my $data = select 1番目のデータ取得
my @重複 = select 色々 where name=$data

みたいに。(変な書き方ですみません。)


dataの中から例えばメールアドレスが重複してるのがあるかないか、あるなら
それをすべて表示。
一発で[email protected]という値がいくつ重複してるか、[email protected]がいくつ重複してるかを調べたいのです。
132nobodyさん:05/03/15 16:27:56 ID:???
>>131
全データのnameフィールドを取り出してハッシュで数えれば一撃。

133nobodyさん:05/03/15 16:40:21 ID:???
>>125-126
そう? 少し気になるとこもあるけど、まだマシな方だと思うなあ。
というわけで >>126 お手本プリーズ
13448:05/03/15 16:49:20 ID:???
>>131
>MySQLだけでは無理
普通にできますが
SELECT count(*) AS `count`, * FROM `table` GROUP BY `name` HAVING `count` > 1 ORDER BY `count` DESC
135134:05/03/15 17:01:28 ID:???
確認したらエラーが出たので訂正
SELECT count(*) AS `count`, `name` FROM `table` GROUP BY `name` HAVING `count` > 1 ORDER BY `count` DESC
136nobodyさん:05/03/15 19:02:33 ID:???
>>131
対象列がnameからmailに変化してるのにワロタ
137nobodyさん:05/03/15 22:04:08 ID:???
ム板の香具師にこのスレが低能集いスレに扱われている件について
138nobodyさん:05/03/15 22:04:56 ID:???
>>125
見ただけでもヘッダのつき方が滅茶苦茶だと思う。
問答無用で圧縮されたものを送っているというのも。
139138:05/03/15 22:06:55 ID:???
おっと、ブラケットを読み間違えてた。ごめん。
140nobodyさん:05/03/15 22:09:23 ID:???
>>137
どっちも見てる奴がほとんどじゃないの?
141nobodyさん:05/03/15 22:09:47 ID:???
142nobodyさん:05/03/15 22:17:03 ID:???
いや、でも誤読を誘発しやすそうなコーディングではあると思うよ。
143138:05/03/15 23:51:35 ID:???
腹が立ったので書き直してみた。
圧縮された内容にヘッダが付かないようにしたのと、
forkに失敗したときの対策。

my $pid;
if ($ENV{HTTP_ACCEPT_ENCODING} =~ /((?:x-)?gzip)/){
    my $encoding = $1;
    if ($pid = open(BUF, "-|")){
        local $/;
        my $buffer = <BUF>;
        close(BUF);

        print "Content-encoding: $encoding\n",
            "Content-type: text/html\n\n",
            Compress::Zlib::memGzip($buffer);
            exit;
    }
}
if (not defined $pid){
    print "Content-type: text/html\n\n";
}

print <<"EOF";
<html>
<head><title>test</title></head>
<body><h1>Hello world</h1><p>test-test</p></body>
</html>
EOF
exit;
144nobodyさん:05/03/16 00:23:12 ID:???
if ($ENV{HTTP_ACCEPT_ENCODING} =~ m/((?:x-)?gzip)/ and open BUF, '-|'){
    my $encoding = $1;
    local $/ = undef;

    print "Content-Encoding: $encoding\n",
          "Content-Type: text/html\n\n",
          Compress::Zlib::memGzip <BUF>;

    close BUF;
    exit;
}

print "Content-Type: text/html\n\n",
      <<"EOF";
<html>
<head><title>test</title></head>
<body><h1>Hello world</h1><p>test-test</p></body>
</html>
EOF
145nobodyさん:05/03/16 01:23:42 ID:???
144 > 143 ?

しかし local $/ = undef; っていいな、使える。 いままで気づかなかったよw

コードはいいけど、HTML中途半端なのは何でかなw
どうせ省略するなら title と p だけでいいのに。
146nobodyさん:05/03/16 06:44:11 ID:???
>>144
圧縮する内容物にもヘッダが付きますが、必要ですか?
147125:05/03/16 08:48:11 ID:???
>>143-144
きれいに修正ありがとうございます。
活用させていただきます。
148nobodyさん:05/03/16 11:21:44 ID:uAWX38vA
htmlファイルをopenして、その中のリンクを取り出し、アンカー名 URL、というふうにしたいのですが、
URL中に?があるときだけうまく取り出せません
念のためエスケープしてもうまくいきません
たすけて

348 while ($main=~m/(<a href=\"(.*?)\">(.*?)(?: +?)?(?: +?)?<\/a>)/ig){
349 $matc1=$1;$matc2=$2;$matc3=$3;
350 if ($matc2 eq $matc3){
351 $main=~s/\Q$matc1/$matc2/;
352 }else{
353 $main=~s/$matc1/$matc3 $matc2/;
355 }#if else;
356 }#while;
149nobodyさん:05/03/16 13:37:59 ID:???
>>148
いろいろ無駄っぽw

$main =~ s{<a href="(.*?)">\s*(.*?)\s*</a>}{ ($1 eq $2) ? $1 : $1 .' '. $2 }eig;
150nobodyさん:05/03/16 13:40:10 ID:???
あ、: $2 .' '. $1 か。
151nobodyさん:05/03/16 14:36:59 ID:???
>>150
別にeqまでしなくていいでしょ。それならtitleとか考慮したら?

s{<a\s+.*?href="(.*?)".*?>\s*(.*?)\s*</a>}{$2 $1\n}ig;

152nobodyさん:05/03/16 15:11:14 ID:???
> 別にeqまでしなくていいでしょ
え、なんで?
>>148 でそう書いてるなら、その条件で書くべきなのでわ。
どっからどこまでしたいのかなんてわからないよ。
あと、考慮するなら s オプションもつけとけば。
153nobodyさん:05/03/16 16:46:33 ID:???
>>152
ごめん本人のコードは汚いから全く読んでないんだ^^;
日本語だけ読んだ。

ごめんよ〜。
154nobodyさん:05/03/16 17:55:11 ID:???
> 汚いから
ワロタw
まあ>>148は参考にするよろし。
155nobodyさん:05/03/17 06:55:12 ID:???
すみません、質問です。コードを書いて構文チェックしてみたらsyntaxエラーが出て、
色々と絞ってみると下記のコードがエラーの原因だと分かったのですが、どのように治せばいいのでしょうか?
while ( my ($code, $ress) = each(%DATA{'expect'}) ) { }
%DATA{'expect'}はハッシュのハッシュです。これを%DATAに変えてみるとエラーが出なかったので、
ハッシュのハッシュをeachにぶちこんでるのが何か悪いのかな、と思いましたが解決方法が分かりません。。
どなたかご教授して頂けると幸いです。
156nobodyさん:05/03/17 07:36:06 ID:???
%{ $DATA{'expect'} }
15797:05/03/17 11:09:03 ID:???
>>98
はいwhileで1行づつ読み込んで処理しようと思います。ありがとうございます。

>>99
Flash用なのでテキストに書き出すことにしまふ。ありがとうございます。
158125:05/03/17 12:01:21 ID:???
再びの質問で大変恐縮なんですが、もう1つ教えてください。
>>143のスクリプトでgzipの圧縮レベルを設定してみたのですが
Compress::Zlib::deflateInit( -Level => 1 );
という行を追加してCompress::Zlib::memGzip($buffer)の内容をファイルに書き出してみて
ファイルサイズを調べてみたのですが
-Level => 1の場合と-Level => 9の場合とでファイルサイズ変わんないのですが
使い方間違ってますか?
$bufferの中身はいろいろ変えてみましたが、やはり変わりませんでした。
159nobodyさん:05/03/17 13:27:19 ID:+OmKbfyB
質問です。
多数のファイルを生成する際に、ファイル名としてユニークな名前がほしいのですが
Perlの定石としてはどんな方法を用いるのでしょうか?

timeからファイル名を作ろうかと思ったんですが、同じ名前になることもあるだろうし
通し番号を持つのも面倒だし、と思いまして。
160とうかつ:05/03/17 13:38:35 ID:ZeP4drG9
perlのファイルアップロードに関する質問です、よろしくお願いします。
HTMLの<INPUT type="file">フォームで指定したファイルをcgiと同じ場所にアップロードしたいと思っていますが、
どうしても成功しません。、以下に関連ソースを書きます。

●フォームHTMLの中の記述
<FORM>
<INPUT type="file" name="pic_file_name" size="80">
<INPUT type="button" value="写真の追加" onClick=doAddPic()>
</FORM>
※この<FORM>〜</FORM>内に他に多数の<INPUT>あり。

●フォームHTMLのJavaScript記述
<SCRIPT language="JavaScript">
<!--
function doAddPic()
{
  document.Form.action = "./pic_upload.cgi";
  document.Form.method = "post"
  document.Form.enctype= "multipart/form-data";

  document.Form.submit();
}
//-->
161とうかつ(続き):05/03/17 13:39:20 ID:ZeP4drG9
●pic_upload.cgi
use CGI;
my ($buffer);
$CGI::POST_MAX = 1024 * 1000; # max = 1MB

# オブジェクト作成
my $query = new CGI;

my $file_handle = $query->upload('pic_file_name');

# ファイル保存
my $save_name = "UploadFile.xxx";# 名前は仮
open (OUT, ">$save_name") || die "Can't open Savefile!";

binmode (OUT);
while(read($file_handle, $buffer, 1024))
{
  print OUT $buffer;
}

close (OUT);
close ($file_handle);
162とうかつ(続き):05/03/17 13:39:57 ID:ZeP4drG9
・cgiは最後まで正常に走る。
・"UploadFile.xxx"ファイルは作成されるが、中身に書き込まれない。
・途中 print "$file_handle"; としても何も出力されない。
・クエリーname 'pic_file_name' でファイル名は送られている。ほかのINPUTデータについても正常に送られている。
・フォルダの権限は777
・perlのバージョンはv5.8.0

apacheは自分でインストールした物ですので特別な設定が必要だったらかけている可能性も考えられます。
もし可能性がありましたら教えて下さい。
何とか動かしたいと思っていますのでご支援お願いします。
163nobodyさん:05/03/17 13:44:23 ID:???
>>159
定石とか知らんけど

my $file = time();
while (-e $file . '.txt') { $file++; }
$file .= '.txt';

とかじゃね?
164nobodyさん:05/03/17 13:55:35 ID:???
>>163
それだけだと危ないよ。

>>159
1個のプロセスがファイル作成関連処理のをしている間は
他プロセスにはさせないようにしれ。
165nobodyさん:05/03/17 13:57:08 ID:???
>>162
>・"UploadFile.xxx"ファイルは作成されるが、中身に書き込まれない。
>・途中 print "$file_handle"; としても何も出力されない。

もう答えは出てるじゃん。アホ?
166nobodyさん:05/03/17 13:59:10 ID:???
>>164
じゃあ一旦 temporary.txt に書き出した後、
>>163 でチェックして rename するとか。 ダメ?
167nobodyさん:05/03/17 14:01:44 ID:???
>>160
まず不必要でしかも微妙そうなそのJavaScriptをやめてみるとこから始めてみるのはどうだろう?
168とうかつ:05/03/17 14:11:41 ID:ZeP4drG9
>>167
早速やってみました、JavaScriptを抜いた普通のHTMLでやってみましたところ
正常にアップロード出来てしましました、ありがとうございます。

それはそれでまた困ったな…submitボタンの区別が出来ない…
169nobodyさん:05/03/17 14:18:07 ID:???
>>166
誰やねんおまえは。159か?
普通に排他処理使って特定ファイルを開いてる間に本処理をやればいい。

>>168
お前はこのスレ以前の問題なんじゃないか?
170とうかつ:05/03/17 14:29:11 ID:???
>>169 JavaScriptは別の所で質問させていただきますね
171nobodyさん:05/03/17 14:29:18 ID:???
>>159
Perl の定石はしらないけど、漏れはいつも djb 風に、
sprintf("%d.%d.%d", time(), $$, $uid++);
みたいなのを使ってます ($uid はプロセス内で unique になる数字) 。
ファイルシステムをネットワークで共有している場合は、
さらにこれにホスト名も付けます。
172nobodyさん:05/03/17 14:34:28 ID:???
>>168
できたのかw
で、なんで submitボタン〜 とか考える必要があるの?
というか type="button" で submit させる方がいかがなものかと。
とりあえず class と CSS で指定しとけば 「区別」 はつくんじゃないの?

>>169
いやファイルロックの話じゃなくて、ユニークなファイル名をつけたい、って話なのだよ。
173nobodyさん:05/03/17 15:59:43 ID:???
>>172
だからAというファイル名がユニークであるか確認してからAというファイルを新規に作成
するには排他処などで他のプロセスをとめないいけないんだよ。

もしかして新規作成するファイルをロックするとかいう勘違いしているのかな?
17448:05/03/17 16:24:48 ID:???
>>173
>>171みたいにプロセスIDを付け加える方法はどうでしょうか
175nobodyさん:05/03/17 16:56:31 ID:???
>>174
・・・・あなた俺より詳しいじゃない。
個人的には48はこのスレで一番まともな回答者だと認知している。

なのであなたに「どうでしょうか」といわれるととても恐縮だorz

なんか鬱だな・・・
176nobodyさん:05/03/17 17:01:32 ID:Ykle1A6k
現在いるページ(〜.cgiのperlのページ)がhttpsかhttpか否かをしるためには、
どうすればいいのでしょうか?

なお、サーバはApacheです
177nobodyさん:05/03/17 17:29:39 ID:???
>>175
ひとつのプロセスで複数のファイルを作る場合は、
time + ランダムな文字列(a-z..A-Z..0-9)数桁
でやってます。

100%名前が重ならないとは言えないけど、
仮に6桁の文字列を付加したとして、1秒に10個ファイルを作成した場合でも、
各ファイル名の重なる確率は約568億分の1

$time = time
@key = ('a'..'z','A'..'Z','0'..'9');
1 while (length($keys .= $key[rand(@key)]) < 6);
178nobodyさん:05/03/17 17:33:19 ID:???
↑みす途中でおくっちゃった
$name = time;
@key = ('a'..'z','A'..'Z','0'..'9');
1 while (length($name .= $key[rand(@key)]) < 16);
179171:05/03/17 17:47:25 ID:???
あ、そうそう、漏れはちょこっといじったことしかないんだけど、
本格的にやるなら Data::UUID を使うという手もあるかもしれません。
大袈裟過ぎるかもしれませんが。
180nobodyさん:05/03/17 20:30:18 ID:???
2chのスレからデータを取得して、四桁の番号(全角も半角も)があるスレを抜き出すスクリプトを作っているのですが
マッチの誤動作防止のためにEncodeのdecode関数を使っているのですが処理がこれでもかと言うほど遅くなってしまいます。。
どなたかもっと早く処理できる方法をご存じでしたら教えて頂けないでしょうか。
181159:05/03/17 20:47:11 ID:???
うーん、いろいろな方法があるんですね。
一意的な方法があるのかと思っていました。
今回使うファイル名はそのままURLになるので、単純なモノを使いたいと思います。

あと、これは興味本位なんですが2chのスレッド名に使われている方法はどんな方法なんでしょう?
182nobodyさん:05/03/17 20:58:46 ID:???
>>181
time
183nobodyさん:05/03/17 21:08:51 ID:???
>>180
うーん、マシンをもっと速いのに替えるとか
でもそんなに遅くなる? 俺んちの自宅鯖だと1Mbyte decode するのに0.3秒ぐらいだけど

>>181
There's more than one way to do it が perl の哲学だからな

2ちゃんねるのスレッドURLは unix timestamp
だから同一時刻に複数スレッドが立つと同じURLになってしまう
これを避けるために1秒に1スレしか立てられないよう排他処理をしているはず
184nobodyさん:05/03/17 21:35:20 ID:???
>>183
utf8で処理している方は数分掛かり、そうでない物はすぐ処理が終わりますorzなんでだろう、、
もし宜しければソースを見て頂けると幸いです。指定されたスレッドのレス範囲から四桁の数字を抜き出し、
ヤフーファイナンスから取得した各種データと四桁の数字、その四桁の数字を指定したスレッドをeuc-jpで出力するスクリプトです。
http://noiser.info/script/utf8.txt
http://noiser.info/script/shift_jis.txt
185nobodyさん:05/03/17 21:39:04 ID:???
>>158
Compress::Zlibのソース見ると、圧縮レベルを決め打ちしているので、
gzopen(),gzsetparams()を使うしかないと思われ。

>>183
> これを避けるために1秒に1スレしか立てられないよう排他処理をしているはず
仕様が変わっていなければの話だけど、
既に同じ番号のスレがあるときは+1して同じスレがあるかを再度チェック。これを繰り返してる。
186nobodyさん:05/03/17 21:55:45 ID:???
>>185
結局>>163
187nobodyさん:05/03/17 22:01:44 ID:???
>>184
漏れの環境 (Linux + perl 5.8.4) で実行させてみたが、どっちもすぐ終った
CPU時間でsjis版が0.199秒、utf8版が0.258秒
188nobodyさん:05/03/17 22:03:45 ID:???
>>186
そう、排他処理が不完全で、二つのスレが合体するという問題が起きていた。
昔の話だけど。
189nobodyさん:05/03/17 22:20:07 ID:???
まだ意味がわかっていない >>186
190nobodyさん:05/03/17 23:02:05 ID:???
>>184
WindowsXP + perl 5.8.4 + CPU 700 (w で、 utf8 : 0.52 , shiftjis : 0.27 だった。
まー、UTF8 経由する分、ある程度は遅くなって当前なのでは?
191エディタスレの416:05/03/17 23:25:47 ID:???
あの、教えてください。
今、言語覚えようとはじめたんですが、
エディタをテラパッドに決め手
プログラムを打ち込んだのですが
プログラムはどうやって動かして確認するんですか?
winXPです。
192nobodyさん:05/03/17 23:30:31 ID:???
「初めて CGI Perl」とでもしてぐぐれw
193nobodyさん:05/03/17 23:32:40 ID:???
悪意の妨害者(プロセス)がいると仮定した場合の排他制御はどうする?
194nobodyさん:05/03/17 23:46:15 ID:???
えーーと・・・・・・何で排他制御の話になったんだっけ?
195エディタスレの416:05/03/17 23:48:07 ID:???
>>192
一歩踏み出せそうです感謝。
196エディタスレの416:05/03/18 00:08:00 ID:???
自分のPCをサーバーにしないといけないみたいですね。
独学が大変なのはわかりました^^;
197nobodyさん:05/03/18 00:14:39 ID:???
や、ブラウザで見るんじゃなくて、コマンドプロンプトで Perl 使うくらいだったら、サーバ立てなくてもいいんじゃない?
まー 「サーバ立てる」 つっても、Apache (か Httpd とか) インストールするだけだし、実際やってみると思うよりは簡単だと思うけど。
198nobodyさん:05/03/18 00:27:56 ID:???
俺みたいなスクリプト小僧にならないでね
199184:05/03/18 06:37:22 ID:???
>>187>>190
テストして頂いて恐縮です。僕の実行環境に問題があるみたいですね。。
僕の環境だとutfが二分ちょい、shiftjisが数秒です。(Athlon XP 2500+)
Perl入れ直したりしてみます。どうもありがとうございました(_ _)
200nobodyさん:05/03/18 07:56:29 ID:YtF+f69M
perlで自動登録リンクのようなものを作っています。
登録後にメールを送る処理をするのに、次のように書いています。

メールは送られるのですが、なぜか一部の文字が化けてしまいます。
上の例だと「貼」、「構」あたりで化けてしまいます。
文字コードの関係で漢字が化けてしまうのでしょうか?
他の部分は化けていません。

解決策や原因がわかる方がいたら、教えてください、よろしくお願いします。
201200:05/03/18 07:57:55 ID:???
#メール送信部分
sub mail_send{
my $temp=$_[0];
my $mail;
if ($m_sendtome){$temp.=" , $m_mailad";}
$mail = "To: $temp\n";
$mail .="From: $m_mailfrom\n";
$mail .="Subject: $_[1]\n";
$mail .="Errors-To: $m_mailad\n" if $m_sendtome;
$mail .="Content-Transfer-Encoding: 7bit\n";
$mail .="Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n";
$mail .=$_[2];

&jcode::convert(\$mail,'jis');
open (OUT,"| $sendmailpath -t") || die &error("sendmailが使用できませんでした。");
print OUT $mail;
close (OUT);
}

# メール本文
sub mail_ok{
return <<EOD;
登録が完了しました。下記のタグを貼り付けてください。
必要のない方は貼り付けなくても構いません。


署名
EOD
}

#メインの中でmail_sendを実行
&mail_send($mailadd,$honbun,&mail_ok());
202200:05/03/18 07:59:27 ID:???
また、なぜか送信メールの改行が

mail_ok の中の改行と違って1行になってしまいます。

原因・解決策わかる方、よろしくお願いします。
203158:05/03/18 08:03:13 ID:???
>>185
変更できないようにされてたんですか。。残念です。。
調べて頂いて有り難うございました。
204nobodyさん:05/03/18 08:17:16 ID:???
>>159
普通は、
use Fcntl;
...
my $name;
do{
$name = 適当に生成;
} until(sysopen(FH, $name, O_WRONLY|O_CREAT|O_EXCL));
...
close(FH);
みたいな感じ。
O_EXCLを使うことでファイルオープンとファイルの存在確認をアトミックに行えるところがミソ。
sysopenではなく、FileHandleまたはIO::Fileモジュール使うことが多いけど。
クックブックのレシピ「一時ファイルを作成する」を参照のこと。

もうちょっと複雑な処理が混ざったり、sysopen()やモジュールを使いたくないなら、
処理をきっちり排他制御する。
205nobodyさん:05/03/18 08:23:44 ID:???
>>201
貼にx5Cが含まれているからでしょうね
return <<'EOD';
とシングルクォートでエスケープされないようにしたらいいかな
それとメールのヘッダーの改行は\r\nと決められてます。\nでも動作するようですけど。
206200:05/03/18 08:32:51 ID:???
>205

そういう風にしないとだめなんですね。
\nも直しました。
そしたら、文字化けが直りました!!!

なのですが、行数の関係で、実は省略してあったのですが、

sub mail_ok{
return <<EOD;
登録ID : $_[0]

登録が完了しました。下記のタグを貼り付けてください。
必要のない方は貼り付けなくても構いません。

署名
EOD
}

などとして、引数を含めています。
returnで返す前に、普通に変数に入れてから返したほうがよいでしょうか?
それとも、他にこの中でそのまま変数を表示させるよい方法があるのでしょうか?

重ね重ねすみませんが、可能かどうかだけでも教えてください。
よろしくお願いします。
207nobodyさん:05/03/18 08:42:42 ID:???
>>206
じゃあ文字化け文字に\をつける
sub mail_ok{
return <<EOD;
登録ID : $_[0]

登録が完了しました。下記のタグを貼\り付けてください。
必要のない方は貼\り付けなくても構\いません。

署名
EOD
}
208200:05/03/18 08:48:48 ID:???
あぁ、できました!!

漠然と中の文字がおかしいんだろうと思ってたものの、
原因がわからずに他のとこをいじったりして、ずっと悩んでました。
これでうまくいきそうです。

原因がわかったので関係するサイト等をぐぐって勉強してきます。

ほんとにどうもありがとうございました。
209nobodyさん:05/03/18 20:32:06 ID:???
教えてください
webページをhttpダウンロードしてくるプログラムを作りたいのですが、参考に
http://x68000.q-e-d.net/~68user/net/http-2.html
をコピペして実行すると、
print SOCKET "GET /index.html HTTP/1.0\r\n";
で止まって進まなくなります。

winME時代に同じことしたときは動いた覚えがあるので、
winXPのファイアウォールとウィルスセキュリティのファイアウォールを切ったのですが、まだ変わりません。
ほかにチェックする場所はありますか?
winXP sp2+perl 5.005_03+コマンドラインから実行中です。
210209:05/03/18 20:33:20 ID:???
すいません、サーバーにうpすると動くので、サンプルは間違ってないと、多分思います。
211nobodyさん:05/03/18 21:12:40 ID:???

バカか
212nobodyさん:05/03/19 01:17:30 ID:???

  ヽ/⌒ヘ~     ,、            
  ., 't,_,ノ丶   (__,\、   r'~゙i、   ばっかでーす♪
 /  !   '`    / ● ⌒  ヽ,、\,
           (〇'゙ l__/ ● | `〜    〜 △v
        i、_,゙i   し'i ゙〇ノ L,_il        厦
         ゙゙ー|     ii    r'゙\/゙i,~、  ∧∧∧
           |  "  ij   ノ/゙、/    (    )
         ,;、 > ゝ~゙ ゝ ソ         ~ T ~
          、(_/  (,,/        <ヽ | //
213nobodyさん:05/03/19 12:39:33 ID:VZlT0CLh
perlで画像の加工方法について質問です。アップロードした画像(bmp,jpg,gif)のサムネイルを自動作成しようと思っています。
perlは画像加工に弱いとのことで、調べてみた結果imagemagicというものをインストールするという手があるようですが、
しかし恐らくソースコードを置くだけのライブラリならともかく、稼働先でインストールのようなことは出来ない可能性があり
他の手段を探しています、何かメジャーな手はありませんでしょうか?
214nobodyさん:05/03/19 13:26:09 ID:a8Nv17ZI
@saveという配列の中にある変数$textに文字を入力(代入?)してもらって保存

また$textに別の文字を入力、『$textに入力された文字群』というくくりの中で、上のとは別の文字として保存
この保存した二つの文字を取り出して
『$textに入力した文字群から●を抽出し、@save内の変数$plusを付加する』

……というのは可能でしょうか?
『$textに入力された文字群』というくくりの中で、上のとは別の文字として保存
この動作が、どう書いたらいいものか解らなくて…
215nobodyさん:05/03/19 13:51:41 ID:???
>>214
チミはperlの前に日本語を勉強すべきだ。何を聞きたいのかまったくわからん。
216nobodyさん:05/03/19 14:24:33 ID:???
フォーマットを使っているのですが、内部的にUTF8のモードで使うと二バイト文字も@バイト文字も
どちらも同じ大きさ?だと解釈されてしまって結果的にちゃんとフォーマット通りに出力されません。
どなたか解決方法を教えて頂けると嬉しいです。。
217nobodyさん:05/03/19 14:36:51 ID:???
おかしいな徹夜明けだから日本語がうまく理解できないよ
218nobodyさん:05/03/19 15:08:22 ID:a8Nv17ZI
>215
$textっていう変数に文字や数を複数回代入
その文字や数の中から特定の文字を検索する

という作業です
219nobodyさん:05/03/19 15:24:36 ID:???
>>216
「フォーマット」 の意味がわからんw

>>218
@save = ( 'かくかく $text しかじか', 'あれこれ $text どれ●これ');
$text = 'ほげ●はげ';
foreach (@save) { s/\$text/$text/; }
 したあと、
$plus = 'ひげ';
foreach (@save) { s/●/$plus/; }
 ってこと?
 でも 「●」 が $text 内にあったのかどうかは区別できないし、って?
さっぱりわからんw

同じプロセス内でやるなら、テキストに使われない文字でマークアップしとけばいいんじゃない?
220nobodyさん:05/03/19 15:33:07 ID:???
なんかもの凄いアホが来てるな。

もっとわかりやすく言わないとだめだよ。君の質問をイチイチ時間かけて解釈してまで
回答してくれるひとは滅多にいないから。

さぁもう1回頑張ってまとめてみなさい。
221nobodyさん:05/03/19 15:34:20 ID:???
>>216
みんなformatって知らないのか…。俺もつかわんけど。
これ参考になる?
http://search.cpan.org/~dankogai/Encode-2.09/encoding.pm#KNOWN_PROBLEMS
222nobodyさん:05/03/19 15:36:04 ID:???
>>214
$textの中から任意の文字列を取り出したいだけでしょ?

my ($new_text) = $text =~ /任意の文字列正規表現/;
223nobodyさん:05/03/19 15:37:45 ID:???
>>216
my $kanji = "あああ青春の歌";

format STDOUT =
@<<<<<
$kanji
.
write;

これをこのままで実行すると「あああ」という結果が得られて、
use encodingなんかを使うと「あああ青春の」になるという話だとしたら、
フォーマットを書き直した方がいいと思うけど。
224216:05/03/19 16:08:00 ID:???
>>219
Perlのformat機能です。
>>221
ありがとうございます。私も初めて使いました。少し必要になったので。。
なるほど。UTF8を一回shift_jisなどに変換して処理するという手もありますね。
>>223
わかりにくくてすみません。大体そんな話しなんですが、
format STDOUT =
@<<<<<<<@<<<<<<<に
'てすと','てすと2'や'tst,'tst2'をぶち込んだときに、
どちらも二つの要素の間の半角スペースの数が同じになってしまうので
フォーマットに一貫性が無くなってしまうんです。
つまり、'てすと','てすと2'や'tst,'tst2'を先ほどのフォーマットに入れると、"
てすと   てすと2  
tst   tst2  
となってしまうんです。use encodingしてない時みたいに
てすと   てすと2  
tst    tst2    
(半角スペース二個を全角一つに置き換えてます。)となって欲しいんですが。。(等幅フォントじゃないと分かりにくいかもです。)
225nobodyさん:05/03/19 17:09:58 ID:???
>>224
Shift_JISと仮定して書いてみた。

use encoding "shiftjis";
use Encode;

my @str;

format RAW_FORM =
@<<<<<<<@<<<<<<<
map{ encode("shiftjis", $_) } @str
.

open(RAW_FORM, ">&STDOUT") or die $!;
binmode(RAW_FORM=>"raw");

@str = qw(てすと1 てすと2);
write RAW_FORM;
@str = qw(tst tst2);
write RAW_FORM;

close(RAW_FORM);

exit;

かなり強引。
226nobodyさん:05/03/19 18:27:47 ID:???
>>224
カタカナで書くなよ。
227216:05/03/19 18:43:12 ID:???
>>225
出来ました。。随分時間掛かってたので嬉しいです。
ありがとうございました〜(_ _)
228218:05/03/19 18:44:09 ID:???
すみません。うまく書けません。日本語も不自由ですが知識もないせいだと思います…orz
●は便宜上の記号でした。
もう最初書いたのから掛け離れてるんですが、やりたかったのは
@saveの中には$textと$plusと$rimitと$resultがある
$textが設定されたテキストフィールドに『ほげ』と入力すると、
datファイルに『ほげ』が保存される
処理A------------------------------------------------
$rimitが100に達した時、$result = $text . $plusみたいな感じで$textと$plusが連結
$resultがdatに保存される
-----------------------------------------------------

$textに改めて文字『ほげ』が入力される→datに保存される
※最初の『ほげ』とは別物として認識させたい

二度目の『ほげ』が処理A後$resultとしてdatに保存される時、
前回の『ほげ』と見分けがつかなくなるので
$plusは00、01…のようにナンバリング等で別々の値にしたい

$textに二度目以降文字が入力された時、datに保存されている$textの値が
上書きされるのかされないのかがまず判らなくて悩んでいた次第です
ホントすみません…
229nobodyさん:05/03/19 18:57:02 ID:???
エスパーさん、>>228頼むわw・
230nobodyさん:05/03/19 22:05:10 ID:???
>>229
うんこやるよ
つ●
231nobodyさん:05/03/19 22:08:29 ID:???
あれ?昼に徹夜明けで帰って
さっきまでたっぷり寝たのに日本語がわかんない
今度は寝すぎかな?

232nobodyさん:05/03/19 22:14:42 ID:???
>>230
return うんこ . はなくそ
233nobodyさん:05/03/19 22:17:59 ID:???
理解不能 理解不能
>>228 はとりあえず要所要所スクリプトで例書いてごらんw その方わかるかもw
234nobodyさん:05/03/19 22:51:45 ID:???
いや、もういいです
つまんないネタになるだけだと思うので
お邪魔しました
235nobodyさん:05/03/20 00:27:27 ID:???
自分の日本語がおかしくないとでも言いたげだな。
236nobodyさん:05/03/20 00:33:08 ID:???
まあまあ。(*´∀`)ノ
237nobodyさん:05/03/20 02:15:24 ID:???
while (1) {
  print "Hello Unko World!\n";
}
238nobodyさん:05/03/20 03:10:16 ID:???
"unknown world" と "unko world" は若干似ている
239nobodyさん:05/03/20 03:22:48 ID:???
つ●
240nobodyさん:05/03/20 11:54:57 ID:???
>>228
datファイルに書き足していきたいだけだろ?
ファイル操作のあたりを調べてみなさい。

それとテスト環境を作って自分で色々試しなさい。
どうせサーバーで直接試してるんだろうから。

241nobodyさん:05/03/20 13:14:23 ID:RNFnJUaq
perlでCGIを作成しております。手元のWindowsXP+Appache+Perlで開発&
動作確認後、サーバーにアップロード、という手順で開発してるのですが、
perlスクリプトの一行目のperlスクリプトの指定を、

#!c:/Program Files/perl/bin/perl

から、アップロードの時だけいちいちサーバのパス指定に合わせて

#! /usr/local/bin/perl

と書き換えています。結構面倒だし、変更を忘れてエラーになることも
しばしばです。何かスマートな方法があるのではと思ってるのですが、
アドバイスいただければ幸いです。



242nobodyさん:05/03/20 13:30:13 ID:???
C:\usr\ に perl インストールすればいいよ。俺はそうしてる。
243nobodyさん:05/03/20 14:04:16 ID:???
>>241
Apache 1.3.xなら、.cgiの拡張子をPerlに関連付けすると、
シェバングパスを無視して実行してくれる。
私はそうしてる。
244nobodyさん:05/03/20 15:17:59 ID:???
245nobodyさん:05/03/20 16:24:18 ID:???
俺漏れも
246nobodyさん:05/03/20 17:22:51 ID:Z0GAs5yv
Perlで設定ファイルを編集する、という処理をしています
編集画面はしっかり編集されるのですが編集を実行すると
$params{'body'}の値が数字になってしまいます
$params{'body'}の部分にはタグも表示できるようにしてあるのですがそれが関係しているのでしょうか
三日三晩眺めてみてもどうしてもわかりません…
ご教授お願いします。
247nobodyさん:05/03/20 17:26:02 ID:???
sub top {
my $kugiri = "<<>>";
if ($params{'pass'} ne $pass) { &error("パスワードが違います"); }

# 編集
if ($params{'c'} eq "topedit") {
if (!$params{'body'}) { &error('入力がありません'); }

$params{'body'} =~ s/\r\n/\n/g;
$params{'body'} =~ s/\r//g;
$params{'body'} =~ s/\n/<br>/g;
$params{'body'} =~ s/&/&/g;
$params{'body'} =~ s/</</g;
$params{'body'} =~ s/>/>/g;
$params{'body'} = ~s/"/\"/g;
open(OUT,">setup.dat") || &error("setup.datを開くことができません");
print OUT "$params{'body'}$kugiri$params{'title'}$kugiri$params{'text'}$kugiri$params{'bgcolor'}$kugiri$params{'link'}$kugiri$params{'vlink'}$kugiri$params{'alink'}$kugiri";
close(OUT);

# 完了
&head;
print "<b>設定完了</b>\n";
&footer;
exit;
}
248246-247:05/03/20 17:26:57 ID:???
open(IN,"setup.dat") || &error("setup.datを開くことができません");
$file = <IN>;
close(IN);

($body,$title,$text,$bgcolor,$link,$vlink,$alink) = split(/$kugiri/, $file);
$body=~s/<br>/\n/ig;
$body=~s/&/&/g;
$body=~s/</</g;
$body=~s/>/>/g;
$body=~s/\"/"/g;

&header;
print <<"EOM";
編集<br>
<form action="$cgi" method=post>
<input type=hidden name=pass value=$params{'pass'}>
<input type=hidden name=mode value=top>
<input type=hidden name=c value=topedit>
<textarea name="body" rows="10" cols="50" istyle="1">$body</textarea>
<br>
$title,$text,$bgcolor,$link,$vlink,$alinkのinputフォームは割愛<br>
それときったないソースでスマソ
<input type=submit value=送信>
EOM

&foot;
exit;
}

sage忘れスマソ…_| ̄|○
249nobodyさん:05/03/20 17:58:57 ID:???
勘で、この行のイコール直後のスペース
>$params{'body'} = ~s/"/\"/g;
250T女の竹田:05/03/20 18:16:49 ID:???
>>246
せっかくPerlには便利なデバッガが付いてるんだから、使わないと損だよ。
三日三晩眺めてた、って。
CGIならその場で環境変数とか設定したらいいから。
251246-248:05/03/20 19:22:11 ID:???
ありがとう、本当にありがとうございました_| ̄|○<ヤットネラレル…
こういうポカミスって気付かないものですね

>250
Σ(´д`)それがありましたね
今度からはしっかりそれ試してます…
ではありがとうございました
252nobodyさん:05/03/21 00:34:17 ID:???
>>251
Data::Dumperを使うとかさ。
253nobodyさん:2005/03/21(月) 18:10:57 ID:3f95qFz7
配列の要素の値でソートした結果のインデックスが欲しいのですが、
何かよい方法はありますか?
具体的に言いますと、
$aaa[0]='bb';
$aaa[1]='aa';
$aaa[2]='cc';

を各値で昇順ソートし場合、@result=(1,0,2) という結果が欲しいのです。

下記のコードでは、それらしい結果は得られるのですが、確信が持てないのです。

$aaa[0]='bb';
$aaa[1]='aa';
$aaa[2]='cc';

$xxx[0]=0;
$xxx[1]=1;
$xxx[2]=2;

@result=sort {$aaa[$a] cmp $aaa[$b]} @xxx;

よろしくお願いします。
254nobodyさん:2005/03/21(月) 19:48:18 ID:???
>>253
@result = sort{ $xxx[$a] cmp $xxx[$b] } (0..$#xxx);
@result = sort{ $xxx[$a] <=> $xxx[$b] } (0..$#xxx);
255254:2005/03/21(月) 19:50:42 ID:???
頭が回ってなかった。
my @result = sort{ $aaa[$a] cmp $aaa[$b] } (0..$#aaa);
256253:2005/03/21(月) 21:05:55 ID:???
>>255
なるほどねぇ〜。
どうもありがとうございました。
257nobodyさん:2005/03/25(金) 22:58:43 ID:???
停滞警報!? 板移転してますよ、お前ら様!?
258nobodyさん:2005/03/26(土) 00:49:49 ID:???
>>257
どこに行ったか教えてくろ。
259nobodyさん:2005/03/26(土) 09:14:22 ID:???
突然、どうしたのこのスレ?
260nobodyさん:2005/03/26(土) 09:17:47 ID:pZwBUwH2
age
261nobodyさん:2005/03/26(土) 12:04:22 ID:???
春厨大発生のこの時期に荒れてないのは喜ばしいことじゃないか。
262nobodyさん:2005/03/27(日) 02:19:06 ID:eF4YrThJ
aからzまでの文字を、

aaa
aab
aac
aad
........
zzx
zzy
zzz

のように上から舐めていくのってどうすればいいですか?
263nobodyさん:2005/03/27(日) 02:46:04 ID:???
for $x( 'a'..'Z'){
for $y('a'..'z'){
print "$x$y\n";
}
}
264nobodyさん:2005/03/27(日) 05:22:23 ID:???
my $str = "zz";
while (++$str =~ /\A[a-z]{3}\z/) {
print "${str}\n";
}
265nobodyさん:2005/03/27(日) 06:05:15 ID:???
>>262
for ('aaa'..'zzz') {
  print "$_ ";
}
266nobodyさん:2005/03/27(日) 10:11:31 ID:???
>>263-264
ラクダ本読んでないってのは、怖いな。。
267262:2005/03/27(日) 10:17:27 ID:???
別に、たいしたことじゃない。
perlだけに時間さくわけにもいかんしな。
268nobodyさん:2005/03/27(日) 10:18:22 ID:???
 ↑262 => 263ね。
269nobodyさん:2005/03/27(日) 15:26:22 ID:???
おいおまいら、正直に言え。
人にラクダ本すすめといて自分で読んでないやついるだろ!
270nobodyさん:2005/03/27(日) 17:51:21 ID:???
263と264は間違いなの?
271nobodyさん:2005/03/27(日) 17:56:41 ID:???
>>270
perlだけに限らんけど、
there's more than one way to do it.

'aaa'..'zzz' つー記法はperlってこんなこともできるんだよスゲー、て紹介の仕方で良く引用されてるような。
272264:2005/03/27(日) 19:02:20 ID:???
>>266
すみません、読んだつもりだったんですが、「TMTOWTDI」しか頭に残ってませんでした。
273nobodyさん:2005/03/27(日) 19:30:00 ID:???
>>269
読んだんだけどホンダアコードの話しか頭に残っていない
274nobodyさん:2005/03/27(日) 20:04:20 ID:???
俺はボロボロになるまで読んだ。
275nobodyさん:2005/03/27(日) 21:30:34 ID:???
俺は読んでボロボロになった。
276nobodyさん:2005/03/28(月) 00:13:11 ID:???
持ってるけどほとんど読んでないorz
最近はphpばかりでCGIではPerl使わないしなぁ。
'aaa'..'zzz'はちょっと感動。

試しにベンチ取ってみた。
Benchmark: timing 10000 iterations of A, B...
 A: 3 wallclock secs ( 3.24 usr + 0.01 sys = 3.25 CPU) @ 3076.92/s (n=10000)
 B: 2 wallclock secs ( 2.16 usr + 0.00 sys = 2.16 CPU) @ 4638.22/s (n=10000)
A=>>263
B='aa'..'zz'
277nobodyさん:2005/03/28(月) 03:16:21 ID:kLN9+ZWU
perlでHTMLのソースを表示するプログラムを作りたいんですが、
いろいろ調べたけどわかりません。
socketとか使うんすかね?
ちなみにサーバーは@niftyです。
もしやsocketのせい?
278nobodyさん:2005/03/28(月) 03:49:27 ID:???
>>277
@niftyのせいです。あそこはな、(ry
279nobodyさん:2005/03/28(月) 12:03:12 ID:???
>>269
10年以上昔の俺は赤ラクダを真剣に読んだ。当時はまだ読めた。
今青ラクダを2冊とも読み通せと言われるとちょっと辛い。

>>277
他サーバから http で get してきた HTML ファイルを表示したいのか?
ttp://oshiete1.goo.ne.jp/kotaeru.php3?q=1205000 を見る限り道は険しそうだが
280nobodyさん:2005/03/28(月) 13:44:59 ID:???
データ重複チェックについて質問です。
ID(例えばdiaryとかtalkとか)を自由に登録・ID自体の編集もできるスクリプトになっています
実質カテゴリわけとかそんなかんじでしょうか。
open(IN,"$setup") || &error("開けない");
while (<IN>) {
($id,$disp) = split(/,/);
if ($id eq $in{'id'}) { &error('存在するIDです'); }
}
close(IN);
今は上記のようになっていますがこれですと
今編集しようとしている$setup内の行がマッチしてしまうわけで。
何か良い記述方法はないでしょうか?
281nobodyさん:2005/03/28(月) 13:55:54 ID:???
意味ふめ。
open(IN,"$setup") || &error("開けない");
これなら読み込みしかできない。$setupのファイルは編集できない。
while (<IN>) {
($id,$disp) = split(/,/);
if ($id eq $in{'id'}) { $flag=1; &error('存在するIDです'); }
}
close(IN);
if ($flag == 1) {
open(OUT, ">> $setup") or die $!, "\n";
print "$id\t$disp\n";
close OUT;
とか。
282nobodyさん:2005/03/28(月) 13:56:45 ID:???
もち、flock処理なども必要。
283nobodyさん:2005/03/28(月) 15:15:23 ID:???
スマソ、かなり説明不足だった。
・データファイルは
2,説明,
1,説明,
 のようになっていて、複数登録が可能になっている(別サブルーチン)
・ID(変数は$id),説明($disp)をフォームから編集可能にしたい
 例えばID2を1にする場合にはエラー,2を2のまま編集する場合はエラーは出さないようにしたい
・現状だと編集中のIDがマッチするためエラーが出てしまう
・編集中のID以外をマッチさせる方法はないか?と考えたが上手い記述が見つからず
・スクリプトの記述方法は某有名所にかなり依存
・排他処理関係の関数は抜かし、他も簡略化しつつソースを晒してみた

ttp://yu.to/perl/up/id.txt
281氏の書き方だとflag==1の時、つまり同IDがある時編集可能になっちゃいますよね
284nobodyさん:2005/03/28(月) 15:21:44 ID:???
ロックして行数覚えとけば?
285nobodyさん:2005/03/28(月) 15:32:19 ID:???
>>283
つーか何がしたいのかわからんのだが

IDと説明を入力させるんだろ?で、

・ID が存在しなかったら登録
・ID が存在したら説明を上書き

ってことか?しかしそうなると

>・ID(変数は$id),説明($disp)をフォームから編集可能にしたい
> 例えばID2を1にする場合にはエラー,2を2のまま編集する場合はエラーは出さないようにしたい
>・現状だと編集中のIDがマッチするためエラーが出てしまう
>・編集中のID以外をマッチさせる方法はないか?と考えたが上手い記述が見つからず

ここらへんが意味不明なんだが
286nobodyさん:2005/03/28(月) 16:14:33 ID:???
・絶望的に説明が下手
・要求仕様自体がバグってる

のどっちかな気がする。
287nobodyさん:2005/03/28(月) 16:36:20 ID:???
>>279
赤ラクダに相当するのは、青ラクダ+クックブックだ!
つべこべ言わず4冊読破汁!
288nobodyさん:2005/03/28(月) 16:43:13 ID:???
学習コストの高い言語ですね。
289280=283:2005/03/28(月) 18:04:51 ID:???
レスありがとう
>・絶望的に説明が下手
たぶんこれだなorz
こちらのしたいことが明確に伝わらなくて申し訳ないです

>・ID が存在しなかったら登録
はまあ合ってるんだけど
>・ID が存在したら説明を上書き
はちょっと違うかな
ID自体も編集できるようにしたいのです(説明はたんなるオプションでしかないから)


ユーザーアカウントをWEB上で登録・編集・削除したい…みたいな。
イメージとしてはそんなかんじです。
そういうアカウントとかだと登録はもちろん編集する時もIDについては重複させるわけにはいかないので。

>284氏に助言いただいたこともあるのでもう一回組みなおしたりググったりしてみます
290nobodyさん:2005/03/28(月) 18:11:01 ID:???
ID自体を編集、て結局新しい ID を登録してるのと変わんないんじゃないの?
291nobodyさん:2005/03/28(月) 18:29:41 ID:???
>>289
当然といえば当然なんだが、idが変更されたかどうかを知るためには、
以前のid・新規idの2つがスクリプトに渡されなければならない。
292nobodyさん:2005/03/28(月) 18:34:40 ID:???
ID が編集可能という時点で ID が identifier としての役目を果たさないわけで。
データ構造の設計から見直した方が良いんじゃないですかね?
293nobodyさん:2005/03/28(月) 19:55:25 ID:TfqpURTV
ラクダ本まるまるUPしたらやっぱ捕まるの?
294nobodyさん:2005/03/28(月) 20:01:05 ID:???
>>293
釣りか?聞かなくても奥付見りゃわかるだろ。
295nobodyさん:2005/03/28(月) 20:27:21 ID:???
>>292
Larry没後50年まで生きてください。
296nobodyさん:2005/03/28(月) 20:28:05 ID:???
めんご、>>293だた
297nobodyさん:2005/03/28(月) 21:23:02 ID:???
>>280
やっと分かった。
IDは使われていない番号への変更が可能ということなんだ。
すっきり。

データ構造とファイルの扱いが分からないので、簡単に。
編集=新しいIDの登録+古いIDの削除。
または、IDをただのデータとして扱ってIDを書き換える。
298nobodyさん:2005/03/29(火) 17:27:53 ID:???
便所の落書き
ラクダ本とやらを見に行ったらすんごく面白かった。

学生には高すぎるよorz
299nobodyさん:2005/03/29(火) 17:33:36 ID:???
図書館で借りろ。俺はそうした。
300280:2005/03/29(火) 19:10:54 ID:???
うお。こんなにレスが…ありがとうございます本当に。
至らない所が多々ありすみませんでした。
最初からそう説明してればよかったのか。

結局、297氏の案+αで自分のやりたいことができるようになりました。
もちっとスキルアップしてきますorz
それでは、スレ汚し失礼しました。
301nobodyさん:2005/03/29(火) 21:35:34 ID:???
すいません、push(@result{'minus30'}, $name);ということって不可能なのでしょうか?
302301:2005/03/29(火) 21:44:57 ID:???
言葉足りずでした。push(@result{'minus30'}, $name);とするとエラーが出てしまうのですが、
@result{'minus30'}->[]という無名配列にpush出来る方法ってないでしょうか?
303nobodyさん:2005/03/29(火) 21:54:38 ID:???
push @{$result->{minus30}}, $name;
304301:2005/03/29(火) 22:10:40 ID:???
ありがとうございます。なるほどこうやれば良いんですね、出来ました!
ここら辺についての理解が怪しいので、もう一回勉強してきます〜。
305nobodyさん:2005/03/30(水) 18:04:36 ID:???
スカラーのリファレンスのリストを引き数で渡すと
一気にデリファレンスしてくれる関数が欲しいのですが
他にも方法があったら教えてください。

#一括デリファレンス関数の定義
sub list:lvalue{@_?(${$_[0]},list(@_[1..$#_])):@{[]}}

#以下使用例
@a = \($a,$b,$c,$d,$e);

if($case){
(list(@a)) = qw(aa bb cc dd ee);
}else{
(list(@a)) = qw(AA BB CC DD EE);
}

print "$a,$b,$c,$d,$e";
306nobodyさん:2005/03/30(水) 19:45:23 ID:???
>スカラーのリファレンスのリスト

@a = (\$a,\$b,\$c,\$d,\$e);
307nobodyさん:2005/03/30(水) 20:48:59 ID:???
>>305
お前の釣り針に長靴引っ掛けるクマ・・・・・
308nobodyさん:2005/03/30(水) 22:07:20 ID:???
>他にも方法があったら

sub list:lvalue{@_?(${+shift},list(@_)):@{[]}}
309nobodyさん:2005/03/30(水) 22:26:29 ID:???
>>306
何が言いたいのかわからん。
310nobodyさん:2005/03/31(木) 05:57:08 ID:???
長靴だけだった...クマめ...orz
311nobodyさん:2005/03/31(木) 06:09:24 ID:???
>>305
プロトタイプ宣言したほうがいいんかも。
てか、lvalueってPerl5.6以上限定だね。

sub list(@):lvalue{@_?(${+shift},list(@_)):@{[]}}

@a = \($a,$b,$c,$d,$e);

if($case){
(list @a) = qw(aa bb cc dd ee);
}else{
(list @a) = qw(AA BB CC DD EE);
}

print "$a,$b,$c,$d,$e";
312nobodyさん:2005/03/31(木) 08:25:29 ID:???
すいません、PerlでMSNメッセンジャー接続を行うモジュールを探してて
http://www.bot-depot.com/forums/?showforum=12
ここの
http://www.bot-depot.com/forums/index.php?act=Attach&type=post&id=629
これを落としたんですが、上手く動きません…。

とりあえず最新のActivePerl入れてXP SP1上で動かしてるだけなんですが、
他に何か必要なんでしょうか。

落としたファイルの内書き換えた場所は、echobot.plの

my $handle = '自分のhotmailアドレス';
my $password = 'パスワード';
my $admin = '自分のhotmailアドレス';

のみなんですが…。

何かアドバイスなどよろしくお願いします…。
313312:2005/03/31(木) 08:27:17 ID:???
ちなみに動かして表示される内容は次のようなものです。
よろしくお願いします…。

MSN 2.0 (01/21/2005) Rev: 84 - Checksum: 60068-NS18164-SB8878

SERVER ERROR : Authentication Error: No response from Passport server
ERROR : Trying to print 'PNG
' on an undefined socket
Caller trace:
0: MSN::error (MSN/Notification.pm, line 102)
1: MSN::Notification::error (MSN/Notification.pm, line 189)
2: MSN::Notification::_send (MSN/Notification.pm, line 519)
3: MSN::Notification::ping (MSN.pm, line 669)
4: MSN::do_one_loop (echobot.pl, line 44)
314312:2005/03/31(木) 08:30:28 ID:???
あ、あと関係ないかも知れませんがMSNmessengerのバージョンは7.0(BETA)を使用しています。
質問がスレ違いならよろしければ該当スレに誘導して頂ければありがたいです。すいません。
315nobodyさん:2005/03/31(木) 09:40:58 ID:???
ImageMagickを使ったサムネイル作成機能つき画像アップローダを作ってるんですが
軽い画像(5kb程度)なら上手くいくものが重い画像(10kb以上)になると
動作しなくなってしまいます。

・アップロード&保存
  軽い画像→OK、重い画像→OK
・アップロード&保存&ImageMagick処理
  軽い画像→OK、重い画像→×
・ImageMagick処理(別スクリプト)
  軽い画像→OK、重い画像→OK

こんな感じで保存とImageMagick処理を同じスクリプトでやろうとすると
上手くいきません。画像処理の実行に関わらず、スクリプト内で
use Image::Magick;しているとダメポです。保存すらできません…。

どういう原因が考えられるでしょうか?
アドバイスお願いしますorz
316nobodyさん:2005/03/31(木) 11:49:16 ID:???
>>315
情報少なすぎ。スクリプト吊るさんと。
317315:2005/03/31(木) 13:11:59 ID:???
後出しすみませんorz
長くなりますがよろしくお願いします。

#マルチパートデータ解析
local($div,$id,$value,$filename,$minetype,$size);
$div = <STDIN>;
$div =~ s/\s+$//;
$line = '';
until($line =~ /^$div--/){
 $id = '';
 $value = '';
 $filename = '';
 $minetype = '';
 $line = <STDIN>;
 until($line =~ /^\s*$/){
  return if eof(STDIN);
  if($line =~ /\sname="([^"]*)"/i){$id = $1;}
  if($line =~ /\sfilename="([^"]*)"/i){$filename = &trim($1);}
  if($line =~ /^Content-Type:\s+(\s+)/i){$minetype = $1;}
  $line = <STDIN>;
 }
 $size = 0;
 $maxbyte = 1024*500;
 $line = <STDIN>;
 until($line =~ /^$div/){
  return if eof(STDIN);
  $size += length($line);
  $value .= $line if ($size < $maxbyte);
  $line = <STDIN>;
 }
318315:2005/03/31(木) 13:12:59 ID:JNShQA97
 if($size < $maxbyte){
 $param{$id} = $value;
  $paramtype{$id} = $minetype if($minetype ne '');
 }else{
  $param{$id} = '';
  $paramtype{$id} = 'big';
 }
 $paramfile{$id} = $filename if ($filename ne '');
}

#ファイル保存
$oname = &trim($paramfile{"file"});
&jcode'convert(*oname,'euc');
$oname =~ s/\\/\//g;
$oname = substr($oname,rindex($oname,"/")+1);
$type = $paramtype{"file"};
$bindat = $param{"file"};
if($type eq 'big'){&err;}
if($bindat =~ /^\s*$/){ $chk='ok';}
elsif($bindat =~ /^GIF\d\d[a-z]/) { $chk='ok'; }
elsif($bindat =~ /^\xFF\xD8\xFF\xE0\x00/) { $chk='ok'; }
elsif($bindat =~ /^\x89\x50\x4E\x47\x0D\x0A\x1A\x0A/) { $chk='ok'; }
elsif($type =~ /image\/gif/i){ $chk='ok'; }
elsif($type =~ /image\/jpeg/i){ $chk='ok'; }
elsif($type =~ /image\/x-png/i){ $chk='ok'; }
else{ $chk='no'; }
if($chk ne 'ok'){ &err;}
$fullpath = "$imgdir$oname";
if(-f "$fullpath"){&err;}
319315:2005/03/31(木) 13:13:24 ID:???
if($bindat ne '' && $oname ne ''){
 unless(open(FILE, ">$fullpath")){&err;}
 binmode(FILE);
 print FILE $bindat;
 close(FILE);
 chmod (0666,$fullpath);

 use Image::Magick;
 $osize = Image::Magick->new();
 $osize->Read($fullpath);
 ($w,$h) = $osize ->Get('width','height');
##以下略
}

ageてしまったごめんなさい。
320315:2005/03/31(木) 13:17:16 ID:???
しかも文字化けてる……
化け部分はエラー用のサブルーチンに跳ばしてます。
321nobodyさん:2005/03/31(木) 13:28:14 ID:???
サーバのエラーログは何か言ってないの?
322315:2005/03/31(木) 14:02:42 ID:???
>321
レスありがとうございます。
サーバ側では特にエラーは出ていないようです。

use Image::Magick;しなければちゃんと動くんですが、
↑があるとファイル保存以下をスッ飛ばしてスクリプトの
最初の行に戻ってしまうような感じです。
アップロードしたのが軽いファイルなら最後まで正常に動きます。
どこが悪いのか自分ではさっぱり…。
323nobodyさん:2005/03/31(木) 15:52:09 ID:???
>>315
CGI.pm使った方が楽だと思うのだが...

使おうとしたが何か問題があってどうしても使えないとか、
CGIの解釈を自分でやる練習ならしょうがないけど。
324315:2005/03/31(木) 21:35:58 ID:???
こだわりがあるわけじゃないんですが
CGI.pmを使った時、パラメータ名の指定に

for($i=0; $i < $datlist; $i++){
 $hoge = $query->param("file_$i");
}

という感じに変数で指定ってできるんでしょうか?
これやると上手くいかなかったもので…。
325315:2005/03/31(木) 23:39:26 ID:???
ごめんなさい324は勘違いしてました。
CGI.pmだと好感触みたいなのでこれでもう少し頑張ってみます。
ありがとうございました >323
326nobodyさん:2005/03/31(木) 23:56:49 ID:???
ttp://www.melma.com/mag/85/m00014785/a00000008.html
これ見てファクトリパターンかっこええなぁと思ったので、ちょっとやってみるかと思ったんですが、
> return "Message::".$classname->new(%{$arg_ref});
ってことは "Message::".$classname なクラスを事前に読み込ませておかないといけないんですよね?
まさか文頭に「読み込まれる可能性のあるクラスを全部書いておく」なんてことはないんでしょうが、
直前で use "Message::".$classname; とかやっても平気なんでしょうか?
327nobodyさん:2005/04/01(金) 00:04:45 ID:???
>>326
>まさか文頭に「読み込まれる可能性のあるクラスを全部書いておく」なんてことはないんでしょうが、
ん? そうじゃないの? そのときどきにrequireする物なのかな? useはNGだお
328nobodyさん:皇紀2665/04/01(金) 13:45:49 ID:JJhcoQhv
$hoge = "あいうえお-かきくけこ-さしすせそ-たちつてと";
$_ = $hoge;
if((s/-/-/g) > 10){
print "10以上";
}else{
print "10以下";
}
329328:皇紀2665/04/01(金) 13:47:15 ID:???
↑$hogeにあるハイフンを数えて判定する綺麗なやり方を教えてくだされ!
330nobodyさん:皇紀2665/04/01(金) 14:14:26 ID:???
>>329
教えてやろうと思ったが、2レスに渡って書いてるのと、語尾がムカついtr。
331nobodyさん:皇紀2665/04/01(金) 14:44:13 ID:XdlrhN9n
perlで一般的なハンガリー記法ってありますか?
332nobodyさん:皇紀2665/04/01(金) 14:52:50 ID:???
>>331
そんな記法のことはきれいさっぱり忘れてくダサい。
333328:皇紀2665/04/01(金) 15:34:10 ID:???
>>330
途中で書き込んだ為、誤って2スレ分になってしまいました。
語尾によって気分を害されたのであれば申し訳御座いません。
また御機会があれば宜しくお願い致します。
334nobodyさん:皇紀2665/04/01(金) 15:39:55 ID:???
>>333
>>330の語尾をよく見tr
335nobodyさん:皇紀2665/04/01(金) 15:58:02 ID:???
>>329
tr/-//
336nobodyさん:皇紀2665/04/01(金) 18:00:41 ID:???
>>328-329
$_ = $hoge; # ←する理由がわからん
(ふつう $_ に意識的に代入するかなぁ…?)

$count ++ while ($hoge =~ m/-/g);
とかも可能
337nobodyさん:皇紀2665/04/01(金) 19:13:27 ID:???
>>336
おそらく if (($hoge =~ s/-/-/g) > 10) と書けるとは知らなかったと思われ。
338326:皇紀2665/04/01(金) 21:21:39 ID:???
>>327
うお、マジすか。

DBIが似たような仕組みらしいので、ちょいと中をのぞいてみても、
どのへんでこの問題を解決しているのかサッパリです。
ソースのどの辺りで解決しているのかおわかりの方はいませんか?
339nobodyさん:皇紀2665/04/01(金) 22:48:38 ID:ybs/IKbS
>>338
DBIが読み込むドライバのことを言っているのかな。
どうせuseかrequireかdoを使ってるんだろうと
あたりをつけてサーチかませばDBI.pmのサブルーチン
install_driverの中でreqireしてごにょごにょしてる
ところはすぐ見つかると思われる。

ただドライバはDBI::DBDに説明されているような構成
になってることを要求されていて一般的なモジュール
とはちといえないから、参考になるかどうかはびみょー。

340328:皇紀2665/04/01(金) 22:53:02 ID:???
>>335-337
ありがとです。度忘れしてました。
tr/-//採用させていただきます。

use Benchmark;
$hoge = "あいうえお-かきくけこ-さしすせそ-たちつてと-なにぬねの-はひふへほ";
timethese(100000, {
sample1 => sub { if(($hoge =~ tr/-//) > 10){} },
sample2 => sub { if(($hoge =~ s/-/-/g) > 10){} },
});
Benchmark: timing 100000 iterations of sample1, sample2...
sample1: 0 wallclock secs ( 0.05 usr + 0.00 sys = 0.05 CPU) @ 2127659.57/s (n=100000)
sample2: 0 wallclock secs ( 0.22 usr + 0.00 sys = 0.22 CPU) @ 456621.00/s (n=100000)
341nobodyさん:皇紀2665/04/02(土) 00:17:03 ID:m1Urw5SA
■言いたい放題FC東京 310■
http://ex9.2ch.net/test/read.cgi/soccer/1112223516/

瓦斯スレ突破ゲーム
瓦斯サポの突破力をみんなで身につけよう!!
※瓦斯スレにメール欄「小鹿」本文「お疲れ様でーす」と書き込む
※5分間書き込みがなかったら「突破成功」と再書き込みで成立
※なんらしかレスがあったら失敗 
※「フロント」か「朝日」の書き込みがあったら
シーチケ取り上げられるだけで済みます。
342326:皇紀2665/04/02(土) 02:28:50 ID:???
>>339
仰せの通り、該当部を覗いてみると、
requireでドライバを読み込んで、
読み込まれたドライバはDynaloaderをuseして、
bootstrapで自分自身をロードしているらしい
……具体的にはワケワカメなのですが。

詰まるところ、これが動的なインポートというやつなのでしょうか?
まんまパクってやれば、いちいち「読み込まれる可能性のある(以下略」を書かなくても良いのかなぁ。
343nobodyさん:2005/04/02(土) 13:44:50 ID:BYWwUZK5
プロキシでのアクセスを制限したいです。
環境変数の取得の仕方は分かります。
プロキシかどうかを判定すにはどうすれば良いのでしょうか?
344nobodyさん:2005/04/02(土) 14:12:01 ID:???
簡易的な方法でいいの?
345nobodyさん:2005/04/02(土) 14:25:00 ID:BYWwUZK5
レスありがとうございます。
個人的には、できるだけ強力な制限にしたいのですが、
面倒くさいようでしたら、さわりだけでも教えて頂けると助かります。
ぐぐったんですけど、検索の仕方悪いのかサーバがどうのこうのってのばっかりで…。
346328:2005/04/02(土) 14:33:36 ID:???
>>343
ポートの80と8080番空いてるか調べるとか。
347nobodyさん:2005/04/02(土) 14:38:36 ID:???
348nobodyさん:2005/04/02(土) 14:40:29 ID:BYWwUZK5
勉強不足ですみません。ポート開いてるかを見る環境変数もあったんですかぁ…。
つまり、プロキシ鯖は80、8080は大抵空いているものなのですか?
349nobodyさん:2005/04/02(土) 14:46:46 ID:BYWwUZK5
ポート番号: 80 結果:接続できますた。(^o^)

…ルータで弾いてるはずなのに。やばいっすかね?
350nobodyさん:2005/04/02(土) 15:58:19 ID:???
use IO::Socket;

$host = 'www.2ch.net'; #IPとかホスト名
$port = 80; #ポート番号

$socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => 'tcp');

if($socket){ print 'ポート空いてるお^^'; }
else{ print '空いてないお^^'; }
351nobodyさん:2005/04/02(土) 17:11:41 ID:???
>>347にあるけど2chのBBQ使って正引きするのがイイと思う
352343:2005/04/02(土) 17:18:11 ID:jF3LdyJO
御協力感謝です。
でも、初心者の僕には頭が混乱してくる話で…w
皆さんの御厚意を無駄にしないよう、ぐぐりまくって勉強します。
最後に、クレクレで申し訳ないんですが、良い勉強サイトあったら紹介して頂けますでしょうか。

皆さんのように教えられる立場になれるようがんばります。ありがとうございました。
353nobodyさん:2005/04/02(土) 17:46:33 ID:???
それもググりまくってください。
354343:2005/04/02(土) 19:10:20 ID:jF3LdyJO
がんばって、ぐぐるとです。
ところで、
sub checkProxyList
{
my $RADDR = $ENV{'REMOTE_ADDR'};

$RADDR =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;
my $query_addr = "$4.$3.$2.$1.niku.2ch.net";
my $addr = join('.', unpack('C*', gethostbyname($query_addr)));
if ($addr eq '127.0.0.2')
{
DispError("ERROR!","公開PROXYからの投稿は受け付けていません!!(1)");
}
return 0;
}
って、勝手に使って良いんですか?
355nobodyさん:2005/04/02(土) 21:39:07 ID:???
>>354
私的利用なら問題ないでしょ。多分。俺は詳しくないからわからんけど。
でも俺なら

my $req = join(".", reverse(split(/\./, $ADDR))) . ".niku.2ch.net";
my $res = join(".", unpack("C*", gethostbyname($req)));
DispError("ERROR!","公開PROXYからの投稿は受け付けていません!!(1)") if ($res eq '127.0.0.2');

とか、

if(join(".", unpack("C*", gethostbyname(join(".", reverse(split(/\./, $ADDR))) . ".niku.2ch.net"))) eq '127.0.0.2'){
    DispError("ERROR!","公開PROXYからの投稿は受け付けていません!!(1)");
}

みたいに書くよ!
356nobodyさん:2005/04/03(日) 00:25:49 ID:???
確か特定のIPからしかリクエスト利かなかったような覚えが・・・
357nobodyさん:2005/04/03(日) 01:52:06 ID:???
サブルーチンのリファレンスを作るのに、引数も一緒に渡そうとしています。
例えばサブルーチンcodeのリファレンスを作るとき
sub { &code('a','b') }とすると見栄え的にあまりよくないと思うので、
\&code('a','b') や \{&code('a','b')} としてみたらエラーとなりました。
何かうまい方法は無いのでしょうか。例えば次の単純なプログラムを実行したら
Not a CODE referenceと表示されます。

$ref = \&hoho(1,\&huhu('a','b'));
&$ref;
sub hoho {
&{$_[1]};
}
sub huhu {
print $_[0].$_[1];
}
358nobodyさん:2005/04/03(日) 06:33:05 ID:???
>>357
そろそろオブジェクト指向にシフトする頃合かも。
あえてクロージャで書いてみる。
$ref = create_hoho(1, create_huhu('a', 'b'));
$ref->();

sub create_hoho {
my ($dummy_arg, $sub_ref) = @_;
return sub { $sub_ref->(); }
}

sub create_huhu {
my @args = @_;
return sub { print $args[0].$args[1]; }
}
359nobodyさん:2005/04/03(日) 08:50:06 ID:???
>>358
それはうまくいきますね。
オブジェクト指向ですか、勉強してみようと思います。
ありがとうございました。
360nobodyさん:2005/04/03(日) 10:02:18 ID:???
while(readdir(DIR)){
    # 処理
    # のようなのは不可能なのですか?
    # この中でディレクトリの内容を $_ に読み込んで処理したいのですが、
    # 直前に処理されていた $_ の値が入ってしまいます。
}

よろしくお願いします。
361nobodyさん:2005/04/03(日) 10:54:05 ID:???
while($_ = readdir(DIR)){
}
362nobodyさん:2005/04/03(日) 11:17:18 ID:???
for (readdir(DIR)){
}
363343:2005/04/03(日) 12:13:17 ID:2xmdAJbj
>>355
豚クスです
364360:2005/04/03(日) 17:40:14 ID:???
でもファイルをopenして
while(<FH>){
}
ならできるのにどうしてですか?
365nobodyさん:2005/04/03(日) 19:23:25 ID:???
すいません、ウィンドウズのローカル(activeperl)で動いてるperlスクリプトから
掲示板(2chではないです)に書き込みたいんですが、
何か参考になるサイトなどありましたらお教え願えないでしょうか。
該当掲示板のアドレスにパラメーターくっつけて送信したらいいだけってのはわかるんですが、
そこに至るまでの過程がわからなくて…。
何か良いサンプルプログラムとかありましたら何とぞよろしくお願いします。
366nobodyさん:2005/04/03(日) 19:33:25 ID:???
>>364
while(<FH>) のときだけ特別にそう動くようになってるんだよ。
ちゃんとした本を読むのだ。書いてあるから。
367nobodyさん:2005/04/03(日) 20:29:18 ID:???
>>365
age2chで検索汁。
368nobodyさん:2005/04/03(日) 21:57:56 ID:???
369nobodyさん:2005/04/04(月) 17:27:56 ID:soRFZIJA
過 疎 過 ぎ で す よ!
370nobodyさん:2005/04/04(月) 20:50:32 ID:???
荒らされて3日で1000逝くよかマシ
371nobodyさん:2005/04/05(火) 13:02:19 ID:ZNntFGGU
Perlのフォームの入力確認の部分で
フォーム内容A=フォーム内容B
でなければエラー

という簡単な方法があれば教えて頂けないでしょうか?
372nobodyさん:2005/04/05(火) 13:37:44 ID:???
↓ エスパー降臨
373nobodyさん:2005/04/05(火) 13:52:34 ID:???
Perlで画像アップロードCGIを組んでいるのですが、サムネールを自動育成できればと思っているのですが
HTMLで擬似縮小するのではなく本当に画像を指定サイズに縮小する方法はありませんか
374nobodyさん:2005/04/05(火) 13:58:23 ID:???
画像を切り取れ
375nobodyさん:2005/04/05(火) 14:06:31 ID:???
376nobodyさん:2005/04/05(火) 14:13:05 ID:CfOSbO/O
>>373
育成?
377nobodyさん:2005/04/05(火) 14:58:14 ID:???
>>373はエロゲーのやりすぎ
378nobodyさん:2005/04/05(火) 15:19:12 ID:???
373です
出来ました。
ありがとうございました。
379nobodyさん:2005/04/05(火) 15:20:31 ID:???
>>377
反発するつもりじゃないけどエロゲー未経験
むしろ買う勇気が(ry
380nobodyさん:2005/04/05(火) 15:56:03 ID:???
>>379
小心者は黙ってネット通販
381nobodyさん:2005/04/05(火) 16:21:48 ID:ZNntFGGU
ここに誘導されて来たんですけど、

Perlのフォームの入力確認の部分で
フォーム内容A=フォーム内容B
でなければエラー

という簡単な記述があれば教えて頂けないでしょうか?
382nobodyさん:2005/04/05(火) 16:26:07 ID:???
('A`)
383nobodyさん:2005/04/05(火) 16:37:20 ID:???
釣られてみる
%FORMにクエリーが入ってるとして
if($FORM{'formA'} ne $FORM{'formB'}){&error(エラールーチンとか);}


初歩的にも度が過ぎる・・・
384nobodyさん:2005/04/05(火) 18:08:15 ID:ZNntFGGU
>>383
やっぱりうまくいきません。

フォーム1の名前:password1  タイプ:password
フォーム2の名前:password2  タイプ:password
if ($password{'password1'} ne $password{'password2'}) { &error('エラーです。'); }

他に何か加えないといけないでしょうか?
問題点があったら、よろしくお願いします。
385nobodyさん:2005/04/05(火) 18:14:00 ID:???
%passwordに何も入ってないというオチ
386nobodyさん:2005/04/05(火) 18:17:26 ID:ZNntFGGU
%password にクエリーを入れるという意味がわからないのですが・・・
よろしくお願いします。
387nobodyさん:2005/04/05(火) 18:23:15 ID:???
>>383 の想像をはるかに超えた初歩的度。
388nobodyさん:2005/04/05(火) 18:27:50 ID:ZNntFGGU
わからないです。
どこがわるいんでしょうか?
389nobodyさん:2005/04/05(火) 18:31:59 ID:ZNntFGGU
ヤフー検索。
クエリーを入れる→7件

my $q; #クエリーを入れる
my $method; #メソッドを入れる

↑はクエリーですか?
390nobodyさん:2005/04/05(火) 18:34:50 ID:???
>>388
%passwordに渡した内容が自動的に入ると思ってる?
思ってんならそれ間違いだから。中身は空だから。
391nobodyさん:2005/04/05(火) 18:37:46 ID:ZNntFGGU
直して付け加えたのはここの部分だけです。

フォーム1の名前:password1  タイプ:password
フォーム2の名前:password2  タイプ:password
if ($password{'password1'} ne $password{'password2'}) { &error('エラーです。'); }

でやっても、上の入力は無視されて飛ばされてるみたいで、
一緒でなくてもそのまま送信されてしまいます。上級者の方、よろしくお願いします。
392nobodyさん:2005/04/05(火) 18:39:32 ID:ZNntFGGU
>>390
要するにどこをどのように直せばよろしいのでしょうか?
393nobodyさん:2005/04/05(火) 19:07:40 ID:???
>ヒントではなく、
>このように直せば動く、このように付け加えれば動く、
>という指摘がうれしいのですが・・・。
>初心者ではなく言語がわからない人です。

こいつWeb制作板でこんなこと書いとる
394nobodyさん:2005/04/05(火) 19:28:53 ID:ZNntFGGU
$a=newpass;
$b=newpass2;

if (!$namecheck && $name eq '') { &error('名前を入力してね。',''); }
if ($a==$b eq '') { &error('パスワードエラーです。',''); }

このようにifがいろいろ並んでいるのですが、
それに1行加えてみましたが、見事にエラーになりました。
よろしくお願いします。
395nobodyさん:2005/04/05(火) 19:33:04 ID:???
エラーログを読みましょう。
396nobodyさん:2005/04/05(火) 19:59:42 ID:ZNntFGGU
$a="passward1";
$b="passward2";

if (!$namecheck && $name eq '') { &error('名前を入力してね。',''); }
if ($a ne $b) { &error('パスワードエラーです。',''); }

にしたら、「パスワードエラー」が表示されるようになりました。
しかし、A=BでもA=Bでなくても、エラーになってしまいます。

「パスワードエラー」までいくようになったので、あとはAとBの置き換えの問題だと思うのですが、
この記述は上の方に書いたのですが、フォーム上の
name="passward1"

$a="passward1"
と置き換えていいのでしょうか?
397nobodyさん:2005/04/05(火) 20:25:29 ID:???
ま、どうでもいいけど、passward は password って書いたほうがいいと思うけどな。

どうでもいいんだけどな。
398nobodyさん:2005/04/05(火) 20:32:11 ID:???
%form にクエリーを入れて返す関数

sub get_form {
my %form;
seek(STDIN,0,0);
read(STDIN,$_,$ENV{'CONTENT_LENGTH'});
foreach(split(/&/)){
my($name, $value) = split(/=/);
$value =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/eg;
$form{$name} = $value;
}
return %form;
}
399nobodyさん:2005/04/05(火) 20:46:00 ID:???
そろそろ釣りと気づけよ。
400nobodyさん:2005/04/05(火) 20:57:55 ID:???
⊂二二二( ^ω^)二⊃ ブーン
401nobodyさん:2005/04/05(火) 21:22:59 ID:???
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq9.html#How_do_I_decode_a_CGI_form_
> CGIフォームをデコードするには?
> 標準のモジュール、多分CGI.pmを使うとよいでしょう。あなたが手作業で行うことは多分ありません!

使い方はこの辺りとか。
ttp://www.futomi.com/lecture/form/cgi-pm.html
402nobodyさん:2005/04/05(火) 21:57:40 ID:ZNntFGGU
sub get_form {
my %form;
seek(STDIN,0,0);
read(STDIN,$_,$ENV{'CONTENT_LENGTH'});
foreach(split(/&/)){
my($name, $value) = split(/=/);
$value =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/eg;
$form{$name} = $value;
}
return %form;
}

をデコード処理というところに貼ってみましたが、だめでした。
いろいろありがとうございました。
403nobodyさん:2005/04/05(火) 22:31:15 ID:???
すいません、perlでテキストファイルを自分のサイトのアップローダ(php)に上げようとして
http://bird.dip.jp/computing/zive.html
ここを参考にしてみたんですがうまくアップロード出来ません。一応アクセスは出来てるようですが…。
もしかしてperlでアップロードする時は該当ファイルのパスが変わるのかなと思ったり。
以下に「全ソース」を貼らせてもらいます…。
アップロードしたいファイルはC:\Perl\test.txtの位置、このスクリプトを置いてる位置はC:\(直下)にあります。
どなたかアドバイスよろしくお願いします…。

# アップロード用

use constant URI => 'http://hoge.net';
use strict;
use LWP::UserAgent;

# POST parameters
my @param = ('hoge=1',
'MAX_FILE_SIZE=500000',
'uploadfile=C:\Perl\test.txt');

my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(POST => URI);
$req->content_type('application/x-www-form-urlencoded');
$req->content(join('&', @param));
my $res = $ua->request($req);

open(OUT, ">> ./hoge.txt");
binmode(OUT);
print OUT $res->as_string;
close(OUT);
exit 0;

結果はアップロード拒否用のページのソースが出力…。
404nobodyさん:2005/04/05(火) 23:10:32 ID:???
>>403
http://hoge.net はアップローダじゃないようだが?
405403:2005/04/05(火) 23:20:45 ID:???
406nobodyさん:2005/04/05(火) 23:31:49 ID:???
>>405
http://hoge.net/index.php も存在しないようだが?
407nobodyさん:2005/04/06(水) 07:29:51 ID:???
>>403
ファイルアップの場合のcontent-typeは普通multipart/formdata
CGI側でチェックしてないことが多いのでフォームパースはやってくれるかもしれないがPOSTの内容はmultipart/formdataの仕様に合わせないとだめ。
408nobodyさん:2005/04/06(水) 08:36:24 ID:???
multipart/form-dataでした
詳細はrfc2388
409nobodyさん:2005/04/06(水) 18:15:00 ID:cBYix7o3
.htaccessが使えない環境なのですが、
POST以外のデータ受け取りを拒否する方法ってありますか?
410nobodyさん:2005/04/06(水) 18:26:17 ID:???
$ENV{'REQUEST_METHOD'}
411nobodyさん:2005/04/06(水) 18:54:05 ID:cBYix7o3
ありがとうございます。
412nobodyさん:2005/04/06(水) 18:59:03 ID:0ohpKdgA
こまっています。

postgresql8.0
windowsXP
perl5.008
DBD::PgPP
の環境にて、perlからpostgresにデータインサートをおこなっているのですが、
DBIのトランザクションがなかなか理解できません。
使いかた、文法間違っていないかご教授お願いします。

$dbh= DBI->connect($DBname, $DBuser, $DBpass);
$dbh->{AutoCommit} = 0;
$dbh->{RaiseError} = 1;

eval {
#テーブル1にinsert
$SQL= "INSERT 〜";
$sth= $dbh->prepare($SQL);
$sth ->execute();
     #テーブル2にinsert
$SQL= "INSERT 〜";
$sth= $dbh->prepare($SQL);
$sth ->execute();
$dbh->commit;
};
if ($@) {
$dbh->rollback;
}
$sth->finish();
$dbh->disconnect();
413nobodyさん:2005/04/06(水) 21:11:07 ID:cBYix7o3
質問よろしくお願いします。
掲示板を作っているのですが、reverseを使わずに、
ログファイルの先頭に書き加えるにはどうしたらいいでしょうか?
なるべくリソースを使わないようにしたいです。

また、意中のレスを削除するために、
ログファイルから、その行だけを取得する方法はありますでしょうか?

よろしくお願いします。
414nobodyさん:2005/04/06(水) 21:41:05 ID:???
>>407
>>408
色々と探した結果ここのページ参考にして

修正してみたんですが、どうもうまく動きません…。
一応アップロード用のphpファイルと接続出来ているようですが、
やはりフォームデータが正常に送信出来てないようです。
とりあえずアップロード用のモードでサーバーのphpが結果を出力してるので、
全てのフォームデータが送信されてないわけではないと思うんですが。
うーん。

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

my $ua = LWP::UserAgent->new;

my $res = $ua->request(POST 'http://yomogiwakakusa.jog.buttobi.net/index.php',
Content_Type => 'form-data',
Content => [ upload=> '1',
MAX_FILE_SIZE => '500000',
userfile => "test.txt" #アップロード用ファイル、plスクリプトと同階層
]);

print $res->as_string;
open(OUT, ">> ./result.txt");
binmode(OUT);
print OUT $res->as_string;
close(OUT);
exit 0;
415nobodyさん:2005/04/06(水) 22:18:05 ID:???
>>414
phpが期待する入力と合ってないだけでしょ。
416nobodyさん:2005/04/06(水) 22:33:49 ID:???
417nobodyさん:2005/04/06(水) 23:15:15 ID:???
>>415
>>416
ありがとうございます。
アップロード用のphpの方をいじってファイル名がどういう風に送信されてるか表示させてみました。
で、同じようにこのコードで実行してみると、

my $userfile='C:\test.txt';
my $res = $ua->request(POST 'http://hoge.net/index.php',
Content_Type => 'form-data',
Content => [ upload_log => '1',
MAX_FILE_SIZE => '500000',
userfile => $userfile
]);

php側じゃ$userfileの値が「C:\\test.txt」と円マーク二つ返してきてます…。
これじゃアップロード出来ないですよね。

一応こちらのperlの方を「C:\\test.txt」と変更して実行すると、
返り値は同じ「C:\\test.txt」、
ヤケクソになって「C:\\\test.txt」と円マーク三つつけて実行すると、
「C:\\\\test.txt」と四つになって返ってきます。
perlってこんな仕様だったかな…。

すいません、そろそろ大詰めっぽいのでどなたか良きアドバイスを…。
418nobodyさん:2005/04/06(水) 23:20:19 ID:jUkFe3D6
共用鯖で全てのPHP RUBYスクリプトが使えなくなるプログラムを作ってください
419nobodyさん:2005/04/06(水) 23:26:41 ID:???
$userfile='C:/test.txt';
420nobodyさん:2005/04/06(水) 23:43:37 ID:???
>>417
ファイル名だけ来てファイルの内容が来てないということ??
421414:2005/04/06(水) 23:45:15 ID:???
>>419
ああ、そんな簡単なことでよかったのか…、
ということでやってみましたが確かにファイル名はそのまま送信できましたけど、
結局アップロードは出来ず。
なぜだ…。

とりあえず>>416さんに教えてもらったコードでデバグしてみるとこんな感じでした。

LWP::UserAgent::new: ()
LWP::UserAgent::request: ()
LWP::UserAgent::send_request: POST http://hoge.net/index.php
LWP::UserAgent::_need_proxy: Not proxied
LWP::Protocol::http::request: ()
LWP::Protocol::collect: read 860 bytes
LWP::Protocol::collect: read 1852 bytes
LWP::UserAgent::request: Simple response: OK

422nobodyさん:2005/04/06(水) 23:49:36 ID:???
>>420
えと、ご存じかも知れませんがphpじゃアップロードされたファイルはこんな↓感じの形式で
サイズとかいろいろなデータを取得できるんですが、
$_FILES['userfile']['name']
$_FILES['userfile']['tmp_name']

中身がからっぽなのでとりあえず
$userfile= $_REQUEST['userfile'];
とただの変数扱い?にしてperlから送信されてくるファイル名を調べてみたんです。
423414:2005/04/07(木) 00:14:05 ID:???
とりあえず参考にしたページを上げ忘れていたので補足。これの下の方です。
http://homepage3.nifty.com/hippo2000/perltips/HTTP/Request/Common.html

> これはおおむね以下のようなHTTP::Requestオブジェクトを作成します
> (バウンダリと~/.profileは違っていることでしょう):

ここがちょっと意味がわからない…。
424nobodyさん:2005/04/07(木) 01:10:34 ID:???
>>412
普通、テーブル2へのinsertでエラーが発生したらrollbackさせる。

>>414
|Content-Type: multipart/form-data; boundary="6G+f"

| PATH=/local/perl/bin:$PATH
| export PATH
はそのとおりではないだろうという事。
425nobodyさん:2005/04/07(木) 01:32:34 ID:hZmAmpQN
配列を返す関数をダブルクォートの中で展開するにはどうしたら良いのでしょうか?
$, = '+'とした後、keys(%expect)をダブルクォートの中で配列として評価し展開したいんです。。
色々と試してみたのですが、結局やり方が分からなかったのでどなたか教えて頂けると嬉しいです。
426nobodyさん:2005/04/07(木) 01:35:16 ID:???
>>425
意味わかんねえよ。もうちっと具体的に。
427414:2005/04/07(木) 01:42:28 ID:???
>>424
ああ、そういうことですか、なるほど…。

ひとつ気になった点。
普通にブラウザのフォームから「アップロードファイルの参照は空欄のままにして」submitした場合、
送信しようとしたアップロードファイルのデータをphpの側が

[userfile] => Array
(
[name] =>
[type] =>
[tmp_name] =>
[error] => 4
[size] => 0
)

と出力するんですが、
ローカルのperlからデータ送信した場合なぜか
Array
(
)
と、根本的に何もかも空っぽになってしまいます。
これは何か怪しい…かな。
428nobodyさん:2005/04/07(木) 01:43:18 ID:???
>>426
すいません。。返信ありがとうございます。
%expectにはいくつかのデータが入っていて、そのキーだけを取り出し+で繋げて$outに代入したいんです。
なので、
$, = '+';
my @tmp = keys(%expect);
$out = "@tmp";
とすれば出来るんですが、わざわざ@tmpを作るのが汚いので@tmpを作らずにこれが出来る方法を質問させて頂いた次第です。
429nobodyさん:2005/04/07(木) 02:12:32 ID:mpm+fGDU
for(keys %expect){ $out .= $_."+";}
430428:2005/04/07(木) 02:24:45 ID:???
>>429
返信ありがとうございます。それも試したんですが、一番最後に+が付いてしまうので。。
431nobodyさん:2005/04/07(木) 02:29:36 ID:???
join '+', keys(%expect)
432nobodyさん:2005/04/07(木) 02:30:05 ID:???
>>425>>428>>430
特殊変数 $, と $" を勘違いしている。

my %hash = (foo => 2, bar => 3, baz => 4);
{ local $, = '+'; print 1, sort(values %hash), 5, "\n" }
{ local $" = '+'; print "1+@{[ sort values %hash ]}+5" }
433428:2005/04/07(木) 02:35:39 ID:???
>>432
思いっきり勘違いしてました。。$"ですね。ご指摘ありがとうございます。>>429さんすみません。
>>431
なるほどー。全然思いつきませんでした。。それでいきたいと思います。ありがとうございました。
434nobodyさん:2005/04/07(木) 12:06:08 ID:2qkaRxVD
スカラーコンテストを略してスカコンと言ったら
先輩に怒鳴られました。何が悪かったのでしょう?
435nobodyさん:2005/04/07(木) 12:12:29 ID:dowco4wM
>>434
「スカタン」と聞き間違えたんじゃないかな。
436nobodyさん:2005/04/07(木) 12:14:18 ID:???
スカコン -> スカトロコンプレックス
スカラーコンテスト -> スカラーコンテキスト
437nobodyさん:2005/04/07(木) 12:27:59 ID:2qkaRxVD
>>435
なるほど!って、それはないですよ。うち関西じゃなし

>>436
あ、スカラーコンテキストです。へへ
438nobodyさん:2005/04/07(木) 13:32:24 ID:???
>>434
共通の認識の無い略語を使われると意味が通じないということでしょう。
スカコンは一般的に使われている略語とは思えない
439nobodyさん:2005/04/08(金) 00:23:01 ID:???
すいません、質問なんですが、

hoge.pl
lib
└----hoge.pm
     hoge
       └----test.pm

という構造で、test.pmのsub{ }の中から
hoge.plの中のグローバル変数の値を取得するにはどういうコードを書けばいいんでしょうか。
よろしくお願いします。
440nobodyさん:2005/04/08(金) 00:35:08 ID:???
>>439
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlmod.html

但し普通そんな行儀の悪い受け渡し方はしない。
441nobodyさん:2005/04/08(金) 00:47:06 ID:???
>>440
ありがとうございます。
ついでにもう一つ行儀の悪いことかと思うのですが、
同じくtest.pmの中にあるサブメソッドから、
hoge.plの中で定義してあるサブメソッドを呼び出すにはどうしたらよいのでしょうか。

実はお教え頂いたページはgoogle検索で見ていたのですが、
自分ではまだ不勉強な部分が多くほとんど要領を得ませんでした、無念。

よろしければ、簡単なコードを示して頂ければ嬉しいです。
横着を言ってすいません。
442nobodyさん:2005/04/08(金) 02:47:20 ID:???
ああ、$::hoge、あるいは$main::hogeでmainにある変数hogeにアクセス出来るんですね。
やっとわかりました。

しかし、ネストされたモジュールの中のサブルーティンからメインに置いてある
サブルーティンを呼ぶ方法が未だにわかりません。

どなたかよろしくお願いします。
443nobodyさん:2005/04/08(金) 07:50:27 ID:???
>>439
お前はモジュールというものがわかってない
3つに分けないで1つにしておけ
444nobodyさん:2005/04/08(金) 09:48:04 ID:???
>>443
自分でつくったなら一つにするんですけどね…。
445nobodyさん:2005/04/08(金) 12:10:49 ID:???
>>442
スカラー変数のプレフィクスは $
配列のプレフィクスは @
ハッシュのプレフィクスは %
サブルーチンのプレフィクスは &
型グロブのプレフィクスは *

print map "$_ => [$main::{$_}]\n", sort keys %main::;
446nobodyさん:2005/04/08(金) 15:30:24 ID:???
>445
できました!ありがとうございます
447nobodyさん:2005/04/08(金) 20:51:39 ID:RsQcEeNJ
euc-jpには\や@などが含まれていないというのを
読みましたが、同じくタブ文字(\t)も含まれていないのでしょうか?

日本語のデータをeuc-jpで保存していて、そのフィールドの区切りを
タブ文字にしているので、これで絶対に大丈夫なのか、不安に
思いました。
448nobodyさん:2005/04/08(金) 20:55:43 ID:j5c3p0G/
教えてください。
最近のperlではinet_aton()の仕様が変わったのでしょうか?
nslookupが複数のIPアドレスを返すホストを引数に与えると
inet_aton()が失敗します。最初のIPアドレスを返すのが仕様だと
思ったのですが。バージョンは以下のとおりです。

perl --version
This is perl, v5.8.2 built for sun4-solaris
449nobodyさん:2005/04/08(金) 21:02:13 ID:???
450nobodyさん:2005/04/08(金) 22:02:13 ID:???
451448:2005/04/08(金) 22:56:06 ID:???
>>450
ありがとうございます。
OSのライブラリgethostbyname()に依存している可能性が
あるわけですね。
CGIを書いているのですが、CGIに関しては質問を受け付けないと
言っているISPなので困ったなあ。
452nobodyさん:2005/04/08(金) 23:08:49 ID:OhDnlIyM
初歩的な質問なんですが。

opendir(DIR, "./$folder");
@dir = readdir(DIR);
closedir(DIR);
for($i=0;$dir[$i];$i++){
$ts = ($dir[$i] =~ /^\d+\.html/) ?
(stat("./$folder/$dir[$i]"))[9] - 800000000 : ' ';
$dir[$i] = "$ts,$dir[$i]";
}
@dir = sort {$b cmp $a;} @dir;
これってopendir(DIR, "ls-t./$folder");
で済むと言われたのですが
UNIXでのOS環境でのことですよね?
コーディングでOSのコマンドを利用するようなやり方は
あまりよく知らないもので。



453nobodyさん:2005/04/08(金) 23:31:30 ID:???
(;^ω^)?
454nobodyさん:2005/04/08(金) 23:44:12 ID:OhDnlIyM
今いろいろ検索して調べていたのですが
なんか疑問に感じた。
ディレクトリのなかのファイルを新しい日付順に降順で並び換える
プログラムなのですが、、、
そもそもlsって表示コマンドだし、-tオプションは昇順表示だし。
OSのコマンドを使うにしても並び換えのコマンドだと
思うのだが。
よくわからんが負荷が高いからこのほうがいい、と言われた。
455nobodyさん:2005/04/08(金) 23:54:12 ID:OhDnlIyM
opendir(DIR, "ls-t./$folder");
じゃなかった。
opendir(DIR, "ls-t./$folder|");
だった。
そもそもこの場合の|の意味がわからんのですが、、、
456nobodyさん:2005/04/09(土) 00:11:56 ID:gYWC+2uy
パイプ?なのかなあ。にしても続くコマンドないし、、、
sort -rだと思うのだが、、、
457nobodyさん:2005/04/09(土) 00:34:17 ID:gYWC+2uy
ああ、ls-tは日付順の降順だわ。
それなら並び換えはいらんのだが
しかしlsコマンドでいいのかわからん。

458nobodyさん:2005/04/09(土) 00:52:37 ID:???
open(DIR, "ls -t ./$folder |") だと思われる
ls -t の出力をパイプで自分に流し込む話
459nobodyさん:2005/04/09(土) 00:58:37 ID:gYWC+2uy
なるほどディレクトリ自体の性質を変えずに表示形式出力だけを
加工させるスクリプトに持っていくのかな。
しかし初心者ながらこういうやり方まで頭がいかんかった。
つまりファイル操作ならOSのコマンドで代用すればいいじゃない。
ということが。
460nobodyさん:2005/04/09(土) 01:07:49 ID:gYWC+2uy
opendir(DIR, "./$folder");
@dir = readdir(DIR);
closedir(DIR);
for($i=0;$dir[$i];$i++){
#$ts = ($dir[$i] =~ /^\d+\.html/) ?
(stat("./$folder/$dir[$i]"))[9] - 800000000 : ' ';
$dir[$i] = "$ts,$dir[$i]";
}
@dir = sort {$b cmp $a;} @dir;
for($i=$next - 21;$i < $next+100-21 && $dir[$i];$i++){
($ts, $file) = split(/,/, $dir[$i]);
last if $ts eq ' ';
open(R, "./$folder/$file");
$_ = <R>;
close(R);
/<b>([^\<]*)<\/b>/;
$j = $i+1;
print W " $j<a href=\"$file\">$1</a>\n";
}
こういう構造でのスクリプトは古いのだろうか。
open(DIR, "ls -t ./$folder |") で
やればあきらかに負荷軽減になるのだろうか。
461nobodyさん:2005/04/09(土) 01:13:06 ID:???
環境や条件にも依るだろうよ
462nobodyさん:2005/04/09(土) 01:34:53 ID:gYWC+2uy
windows環境でhttpdソフトでテストする場合
open(DIR, "dir -d ./$folder|");
ということになるのだろうか?
そもそもソースにOSコマンド書いたからといって
OSがどう連動してくれてるか
わからないのだが。
463nobodyさん:2005/04/09(土) 01:53:22 ID:gYWC+2uy
間違ったこの場合ならdir /o:-d だわな、、、
464nobodyさん:2005/04/09(土) 02:38:31 ID:???
win環境ではcygwin入れてls使えよ
OSコマンドって言ってる時点で(ry
まずは自分が何を知りたいのか整理しろ。
そして質問は分かりやすく謙虚に書け。
465nobodyさん:2005/04/09(土) 02:45:27 ID:gYWC+2uy
ああ?
謙虚もクソもあるか。
てめえの言い方も横柄だろうが。
わからねえならそれでいいんだよ。
クソが。
466nobodyさん:2005/04/09(土) 02:56:29 ID:???
(;^ω^)ほんと態度の悪い質問者に回答するのは嫌になってくるな
467nobodyさん:2005/04/09(土) 03:02:18 ID:???
>>460
パイプを open するとプロセスが別に生成されて
場合によっては shell まで呼び出されたりして
かえって負荷が高くなる場合も多いと思う

まあ結局はケースバイケースだが
468nobodyさん:2005/04/09(土) 03:35:06 ID:???
どかんと一発、全ファイルリストを取得してからPerlで処理したほうが効率いいっしょ。
ちょこちょこI/O負荷をかけるよりは。
469nobodyさん:2005/04/09(土) 06:49:56 ID:???
使い捨てのスクリプト程度ならOSのコマンド呼び出しで構わないだろうけど、
fork自体のコストが高いから、CGIには向かないかも。

windowsなら、これ入れておけばそこそこunix環境に近くなる。
http://unxutils.sourceforge.net/
470nobodyさん:2005/04/09(土) 11:44:26 ID:???
$aが$bの倍数であるかどうかを調べるには
どうすればいいんですか?
471nobodyさん:2005/04/09(土) 12:16:31 ID:???
$a % $b == 0
472nobodyさん:2005/04/09(土) 12:46:24 ID:???
すべての素数を書きだすスクリプトの書き方を教えてください
473nobodyさん:2005/04/09(土) 13:04:45 ID:???
>471
感謝!助かりました!
474nobodyさん:2005/04/09(土) 13:13:25 ID:???
>>472
無理
475nobodyさん:2005/04/09(土) 13:26:40 ID:???
>>474
じゃ無理なことを証明するスクリプトの書き方を教えてください
476nobodyさん:2005/04/09(土) 13:38:10 ID:???
一生計算終わらないからなぁ
477nobodyさん:2005/04/09(土) 13:41:18 ID:???
素数は有限個ではないというのはスクリプトで証明するもんじゃないな
478nobodyさん:2005/04/09(土) 14:26:27 ID:???
数学でもやってろタコっていう
479nobodyさん:2005/04/09(土) 14:39:34 ID:???
print "無理です\n";
480nobodyさん:2005/04/09(土) 15:29:50 ID:???
>>472
print 'すべての素数'
481nobodyさん:2005/04/09(土) 22:28:37 ID:???
>>480
おまえ頭いいな
482nobodyさん:2005/04/10(日) 00:14:51 ID:???
エラーだけどね
483nobodyさん:2005/04/10(日) 00:30:04 ID:???
きっとサブルーチンの中に書かれてるんだ。
484nobodyさん:2005/04/10(日) 01:41:29 ID:???
>>482-483
$ cat omaera_aho.pl
print 'すべての素数'

$ perl omaera_aho.pl
すべての素数
485nobodyさん:2005/04/10(日) 02:41:51 ID:???
STDINを何度か読み直ししたいときってどうしてる?
二回 read したいんだけど、seek(STDIN, 0, 0) しても先頭に戻らなかった・・・。
一回グローバルな変数に置いておくとか、ファイルに書き出すとかしかないんかな?
うーむ。
486nobodyさん:2005/04/10(日) 03:20:01 ID:???
STDINはFIFOなバッファ。こぼれた水は元に戻らない。
487nobodyさん:2005/04/10(日) 10:33:46 ID:???
マルチコアとか64bitのCPU使ったらperlのスクリプトは
速くなりますか?あるいは速くする書き方はありますか?
488nobodyさん:2005/04/10(日) 16:56:27 ID:???
489nobodyさん:2005/04/10(日) 17:58:57 ID:???
$selという文字列をselected="selected"に置換したいのですが
 ~s/\$se/ selected="selected"/i;
だとうまく行きません。どうすればいいでしょうか。
490nobodyさん:2005/04/10(日) 19:16:45 ID:???
$buf = '$sel';
$buf =~ s/\$sel/selected="selected"/i;
print $buf;

ふつーに出来たけど
491nobodyさん:2005/04/10(日) 19:54:56 ID:???
~s/\$se/ selected="selected"/i;
    ↑
492nobodyさん:2005/04/10(日) 20:04:56 ID:???
多分 g オプション。
493nobodyさん:2005/04/11(月) 08:27:59 ID:???
~s/\$se/ selected="selected"/i;


この頭の~は何のためにつけてるのだろうか?
494nobodyさん:2005/04/11(月) 08:33:02 ID:???
>>493
結果の補数を取る為ですが、おかしいですか…?
495nobodyさん:2005/04/11(月) 13:30:35 ID:???
双子素数が無限に存在することを証明するスクリプトが書けた
496nobodyさん:2005/04/11(月) 15:06:37 ID:???
65536ビットの数値を1ミリ秒で素因数分解するスクリプトがかけた夢を見た。
497nobodyさん:2005/04/11(月) 17:22:12 ID:???
↓ 夢が現実になる瞬間!!
498nobodyさん:2005/04/11(月) 18:48:58 ID:???
(´・ω・`)
499nobodyさん:2005/04/12(火) 03:03:59 ID:qneeBtxS
文字列の中に含まれる<br>の 個数 を取得する簡単な方法ってないですか?
例えば↓なら結果として 3 が欲しいのです。
$str = 'a<br>bb<br>cccccc<br>dd';

現在は、配列を経由させてなんとか取得しています。
$str = 'a<br>bb<br>cccccc<br>dd';
$result = @dummy = $str =~ m/<br>/g;
print $result;
500nobodyさん:2005/04/12(火) 03:25:15 ID:???
>>499
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_can_I_count_the_number_of_oc

$result++ while $str =~ /<br>/g;
$result++ while ($pos = index $str, '<br>', $pos)++ > -1;
$result = @{[ $str =~ /<br>/g ]};
$result = $#{[ split /<br>/, $str ]};
501499:2005/04/12(火) 09:03:28 ID:???
いろいろあるんですね。
1行目の方法でいきたいと思います。
ありがとうございました。
502nobodyさん:2005/04/12(火) 22:17:46 ID:jd+szO9r
if(    )
   ↑の部分に直接サブルーチンを書いて判定させたいのですが、どのようにすればいいですか?
if (&{foreach (keys(%{$CONFIG{'add'}})) { return 1 if $data[$_][0] == $_; } return 0;})
こんな風に書いてみたのですが、returnで返したのが不味かったらしく、エラーが出てしまいました。
どのように書けば良いのか知っている方ご教授して頂けると嬉しいです。
503nobodyさん:2005/04/12(火) 22:56:01 ID:???
>>502
エラーが出たならエラーメッセージを読めばいいじゃない。
「Can't return *outside* a subroutine」と答は出てるだろ?
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlref.html
504501:2005/04/13(水) 00:36:56 ID:???
>>503
すみません。evalで出来ました。ありがとうございました。
505nobodyさん:2005/04/13(水) 16:47:52 ID:3dbRXjnX
質問です。
PerlにはJavaのようなboolean型のような変数宣言はできないのでしょうか。
数値以外は文字列として扱う必要があるのでしょうか。

$isErr = false;
if ($isError) {
 print "Error";
} else {
 print "Not Error";
}

こう書くと実行はできるのですが、-cwで文字列をどうにかしろとのエラーが出てしまいます。
506nobodyさん:2005/04/13(水) 16:49:26 ID:???
変数名が間違えてました、全て$isErrか$isErrorで統一するという条件でです。
修正しても、結果は変わらないのですが・・・
507nobodyさん:2005/04/13(水) 17:04:28 ID:???
sub true () {!0}
sub false () {0}

print("True\n") if true;
print("False\n") unless false;
508nobodyさん:2005/04/13(水) 21:30:45 ID:mF6hKb8m
No.000001 あいうえお No.000002 かきくけこ No.000003 さしすせそ No.000004 たちつてと
これを

No.000001 あいうえお
No.000002 かきくけこ
No.000003 さしすせそ
No.000004 たちつてと

みたいにやるのってどうやるの?

単純に No.[000000-999999] の前に改行入れたらマ白になたヨ
509nobodyさん:2005/04/13(水) 21:38:08 ID:???
No. の前にでも入れればぁ?
510nobodyさん:2005/04/14(木) 03:04:17 ID:???
>>505
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldata.html

Perl では undef か空文字列か 0 が偽、その他は真。false と
いう名の演算子もリテラルも存在しないので、サブルーチン
false を定義していない限り $isErr = false; の false は
bare word (裸の単語) と解釈され、$isErr = 'false'; と同義。
-w オプションは bare word を見つけると警告を出す。

>>508
>>1
511nobodyさん:2005/04/14(木) 11:37:45 ID:us4u4fSx
Apache拡張ガイド上33pのPerlHandlerについての部分で、下から3行目あたりに、
「サーバーを再起動せずに新しいモジュールをインストールする方法は後述する」
と書かれているのですが、何処に書かれているか、わかりませんorz
どなたかわかりませんでしょうか。
まさかApache::Registryの事じゃないですよね・・・
スレ違いかもしれませんが、お願いします。もしくは誘導先でも。
512nobodyさん:2005/04/14(木) 12:21:12 ID:???
DSOが実装されていれば可能だろうね。

なんだかメルヘンな話やね
513nobodyさん:2005/04/14(木) 13:48:31 ID:???
やはりDSOのようにmod_perlは使えませんか。。
Registryの事なんでしょうかね。
DSOみたいな薄いラッパーになるハンドラ書けば動くかなぁ。
他にRegistoryの動作を大幅に簡略化するオプションでもあればいいのですが。

ちょっとズレますが、ModPerl::RegistryBBって使ってる方居られます?
これ使う為に、Registory以上に気をつけることとかあるのでしょうか。
514nobodyさん:2005/04/14(木) 14:41:46 ID:???
>>511
新しいモジュールをインストールってことは、Apache::StatINC では無いよね?
そもそもインストールだけなら再起動なんていらないけど、
再起動せずにハンドラに加えたいってことかな?
Apache->push_handlers するハンドラを Apache::StatINC で見張ってれば
出来そうな気もする。試したこと無いけど。
515nobodyさん:2005/04/14(木) 16:03:05 ID:us4u4fSx
>再起動せずにハンドラに加えたいってことかな?
はいそうです、言葉足らずでしたorz
>Apache->push_handlers するハンドラを Apache::StatINC で見張
なるほど、その方法で出来そうな気が・・・(汗)
けどmod_perlの機能でお手軽に。。ってわけにはいきませんね_| ̄|○
516nobodyさん:2005/04/15(金) 04:54:49 ID:???
Mewのinboxにあるメールを検索するスクリプトを書こうと思います。
文字コードがjisなので、以下のようにしましたが、"put search word: "
の部分が画面に表示されません。

use Encode;
use encoding "jis";
print "put search word: ";
chomp($word = <STDIN>);
$word = decode('jis', $word);
while(<>) {
$line = decode('jis', $_);
if ($line =~ /$word/) {
print "$ARGV\n";
}
}

どうしたらよいでしょうか。また、画面表示の部分に日本語を使うことは
できるでしょうか。当方、windows上でcygwinを使用、rxvtの端末文字コードは
sjisにしてあります。
517nobodyさん:2005/04/15(金) 06:28:27 ID:ftMFD1Fr
"東京(トウキョウ)"
"世田谷(セタガヤ)"
"北海道(ホッカイドウ)"
"宗谷岬(ソウヤミサキ)"

といった文字列それぞれから、「地名」と「よみ」を抽出したいと考えています。

そこで、以下のようにやってみたのですが、

($chimei,$yomi) = $str =~ /([^(]+)((.+)/;

そうすると、

"宗谷岬(ソウヤミサキ)"の場合だけ、
$chimei -> 谷岬
$yomi  -> ソウヤミサキ
となってしまいます。


文字コードはeuc-jpで処理しており、「宗」の2バイト目と「(」の1バイト目が
同じために、意図しているようにマッチしないということまではわかったのですが、
どのような正規表現を使えばよいかがわかりません。

こういった場合、どのように処理すればよいのでしょうか。

ちなみに、文字コードは以下のとおりです。
宗→\xBD\xA1(->\xA1\xCA

よろしくお願いします。
518nobodyさん:2005/04/15(金) 07:31:33 ID:???
>>516
こちらの環境では表示されるので分からんが、出力バッファ絡みなら
print する前に $| = 1; か、print 後に更に print "";

> 画面表示の部分に日本語を使うことはできるでしょうか。
ターミナルが表示できる文字コードで出力すればいいんじゃない。
http://www.kt.rim.or.jp/~kbk/perl-5.8/encoding.html
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html

>>517
http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
519nobodyさん:2005/04/15(金) 08:21:34 ID:ierbYSVR
518さん、ありがとうございました。

以下のようにして解決いたしました。
#!/usr/local/bin/perl

$ascii = '[\x00-\x7F]';
$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';

@str = qw(東京(トウキョウ) 世田谷(セタガヤ) 北海道(ホッカイドウ) 宗谷岬(ソウヤミサキ));

foreach $str (@str){
 (@m) = $str =~ /^((?:$ascii|$twoBytes|$threeBytes)*?)(((?:$ascii|$twoBytes|$threeBytes)+))/;
 print "$str ->".join(",",@m)."\n";
}
520516:2005/04/15(金) 12:42:59 ID:???
>>518さん、どうもです。
文字コードについてお答えありがとうございました。
夜、家に帰ってからやってみます。
521質問:2005/04/15(金) 16:33:41 ID:jvrJ4EBi
タグの中にある改行とタブと二つ以上連続の半角空白を取り除きたいと思います。
例えば
    <BR>市町村 <BR>
  <SELECT
name=pref>
    <OPTION value="" selected>---お選びください---</OPTION>
    <OPTION
    value=川越>川越</OPTION>
    <OPTION value=さいたま>さいたま</OPTION>
    <OPTION
   value=秩父>秩父</OPTION>
    <OPTION value=熊谷>熊谷</OPTION>
  </SELECT>

上のようなHTML文書を
スクリプトによって

    <BR>市町村 <BR>
  <SELECT name=pref>
    <OPTION value="" selected>---お選びください---</OPTION>
    <OPTION value=川越>川越</OPTION>
    <OPTION value=さいたま>さいたま</OPTION>
    <OPTION value=秩父>秩父</OPTION>
    <OPTION value=熊谷>熊谷</OPTION>
  </SELECT>


のように並び替えるにはどうしたらよいでしょうか?

ちなみに
$html = s/((?:\G|>)[^<]*?)\n/$1/g;
のように書いたのですがうまくいきませんでした。
522nobodyさん:2005/04/15(金) 16:38:59 ID:???
523nobodyさん:2005/04/15(金) 18:14:48 ID:???
正規表現ばっか('A`)
524質問:2005/04/15(金) 18:52:11 ID:jvrJ4EBi
>>522
ありがとうございました。ちょっと難しすぎて分かりませんでした・・・orz

再び正規表現ですいません。

<市部:さいたま>
<郡部:吉見>
<市部:秩父>
<市部:川越>

 ↓上のデータを

<市部:さいたま市>
<郡部:吉見>
<市部:秩父市>
<市部:川越市>

のように先頭から「<市部:●●>」とマッチングするものを、
「<市部:●●市>」に置き換えるにはどうしたらよいでしょうか
(ただし、「●●」は流動的なものとする)

$data =~ s/<[市部:]*>/<市部:$_市>/;
上のようにやったところ、$_に何も値が入りません。
525nobodyさん:2005/04/15(金) 18:53:41 ID:???
526nobodyさん:2005/04/16(土) 01:58:57 ID:zFFmYmjw
http://www.kent-web.com/data/postmail.html
で、確認画面で
パスワードを表示されないようにしたい(現在は表示される)んですけど、

やり方、わかり方、教えてください。

よろしくお願いします。
527nobodyさん:2005/04/16(土) 02:03:03 ID:???
>>526
補足事項嫁。
528nobodyさん:2005/04/16(土) 02:09:25 ID:zFFmYmjw
>>528

フォーム画面では表示されないのですが、確認画面では表示されてしまいます。
それを隠す方法はあるのでしょうか?
529nobodyさん:2005/04/16(土) 02:26:40 ID:???
>>528
>>2の下の方へどうぞ。
530516:2005/04/16(土) 18:09:31 ID:???
>>518さんにいいページを紹介してもらいました。
いろいろやったら、結局、入力および出力はそれぞれ同じに
しておかなければだめだということが分かりました。つまり、
<STDIN>からの入力とwhile(<>)で読み込む入力が異なって
いたのでだめだったようです。そこで、以下のようにしたら
OKでした。
----------
use Encode;
use encoding 'shift-jis', STDIN=>'shift-jis', STDOUT=>'shift-jis';
$| = 1;
print "input a search word: ";
# print "";
chomp($search = <STDIN>);
print "$search\n";
# $word = encode('jis', $search);
while(<>) {
$line = decode('jis', $_);
if ($line =~ /$search/) {
print "$ARGV\n";
}
}
--------
ご報告まで。

531nobodyさん:2005/04/16(土) 23:26:54 ID:???
誘導されてきました。
質問は下記にあるものなのですが、なにとぞ教えてください。


PerlでCGIなのですが、
例えば十個の$a1,$a2…$a10があり、
ここに10をランダムに格納していきたいのです。
…うまく説明できない…

例えば、
一回目は $a1=2,$a2=3,…$a10=1 でトータルで10
二回目は $a1=4,$a2=1,…$a10=2 でトータルで10
これを十回繰り返す。

という具合です。
判り難くて申し訳ないのですが、
なにとぞご教授下さいませ。
532nobodyさん:2005/04/16(土) 23:41:29 ID:???
下手すると無限ループになりそうだな
533nobodyさん:2005/04/16(土) 23:44:21 ID:???
つーか意味不明。やりたいことだけ書けよ。
534nobodyさん:2005/04/16(土) 23:46:51 ID:???
10個の変数のトータルが10なら全部1しかありえない気がするが
535nobodyさん:2005/04/16(土) 23:48:26 ID:???
1〜10じゃないの
536nobodyさん:2005/04/16(土) 23:58:37 ID:kx2lH57m
すみません…どうもうまく説明できなくて…

for($i=0;$i<=10;$i++){
?????????????????
}


この?部分で$1~$10に限られた数値をランダムで入れていきたいのですが、
その処理の仕方がわからないのです。
537nobodyさん:2005/04/17(日) 00:01:52 ID:???
配列にすれば?
538nobodyさん:2005/04/17(日) 00:22:26 ID:???
>>531
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_do_I_shuffle_an_array_random
http://boobar.hp.infoseek.co.jp/bench/randlist.txt

sub rand_num {
  my @num = @_;
  for (my $i = @num; --$i;) {
    my $j = int rand($i + 1);
    $j == $i && next;
    @num[$i, $j] = @num[$j, $i];
  }
  @num;
}

for (1..10) {
  print "$_ - ";
  my($a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8, $a9, $a10) = rand_num(1..10);
  print join '/', $a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8, $a9, $a10;
  print "\n";
}
539nobodyさん:2005/04/17(日) 13:12:59 ID:???
10個の似たような変数を使うなら、配列にするのが常識。

その上で、やりたい事がイマイチよく分からん。
10個の数の満たすべき条件は何?
10個の合計が10になる事?
それとも、ひとつひとつの数が0以上10以下の範囲ならいいの?
540nobodyさん:2005/04/17(日) 14:33:17 ID:???
>>538
前々から気になってたんですが、
その perlfaq に載ってる方法のランダム性ってどうなんですかね?

例えば 1,2,3,4,5,6,7,8,9,10 と綺麗に並んだのができる確率って
splice 使う方法だと 1/10! になりますが
速い方のだと明らかにこれより大きくなりますよね?
541nobodyさん:2005/04/17(日) 16:08:52 ID:???
1/11!じゃないの?
542nobodyさん:2005/04/17(日) 16:17:38 ID:???
>>540-541
プログラミングの為の数学と算数 vol.2
http://pc8.2ch.net/test/read.cgi/tech/1094368921/
543T女の竹田:2005/04/17(日) 16:21:33 ID:???
>>531
こんなのはどうかな?

@hash{1..10} = ();
@array = ();
for (1..10) {
$array[$_] = (keys %hash)[int(rand(11-$_))];
delete $hash{$array[$_]};
}
544T女の竹田:2005/04/17(日) 16:27:32 ID:???
考えてみたらハッシュ使う必要なかった…
spliceの方がいいし。忘れてください。
545nobodyさん:2005/04/17(日) 19:06:27 ID:???
>>531
シャッフル?
List::Utilが使えるのなら、List::Utilのshuffleで。

use List::Util qw(shuffle);

for(1..10){
my @a = shuffle(1..10);
print "@a";
}
546nobodyさん:2005/04/18(月) 17:36:57 ID:uIr0c1v3
質問させてください。
ActivePerl-5.8.4.810-MSWin32-x86.msi
OS:XpSp2
を使っています。

$pack = pack("C*", 0x7E, 0x00, 0xFE, 0x40, 0x52, 0x00);
とすれば普通にパックしてくれるのですが

$pack = "0x7E, 0x00, 0xFE, 0x40, 0x52, 0x00";
$pack = pack("C*", $pack);

とした場合、パックしてくれません。
@pack = (0x7E, 0x00, 0xFE, 0x40, 0x52, 0x00);
$pack = pack("C*", @pack);

としてみた場合も同じです。
0x7Eみたいなデータを変数にいれてpackするには
どうしたらよいのでしょうか?
アドバイスいただけるとありがたいです。
547ero 141-190-213.biwa.ne.jp/:2005/04/18(月) 18:39:47 ID:???
え  っしと  のぉハァ   う  w  ww うぇうぇ   w                 
 ぇ          ハ               っ                    
  け                                              
       る      ァ  w おk  w                         
                は            w  w                
     
548nobodyさん:2005/04/18(月) 18:48:21 ID:???
>>546
あとの方でいけると思うが。一応試してみたが大丈夫だぞ?

% perl -e 'print pack("C*", 0x7e,0x00,0xfe,0x40,0x52,0x00)' | hex
0x00000000: 7e 00 fe 40 52 00 - ~@.@R@
% perl -e '@pack=(0x7e,0x00,0xfe,0x40,0x52,0x00); print pack "C*", @pack' | hex
0x00000000: 7e 00 fe 40 52 00 - ~@.@R@

549nobodyさん:2005/04/18(月) 19:20:44 ID:???
perl -M<module_name>
の-Mの意味が分かりません。
ググってもわかりませんでした。
よろしくお願いします。
550nobodyさん:2005/04/18(月) 19:34:27 ID:???
>>549
スレタイ読もうね。
551nobodyさん:2005/04/18(月) 19:34:36 ID:???
module_nameで指定したモジュールがインストールされていれば、それを読み込んでperlを起動する。
例えば、
perl -MJcode hoge.pl
とかすると、hoge.plでJcodeをuse宣言してなくてもJcodeモジュールが使える。

まあ、使いたかったら普通にスクリプト内でuse書いておけばいいわけだし、普通の人間には不要。
552549:2005/04/18(月) 19:40:25 ID:???
ありがとうございました
553nobodyさん:2005/04/18(月) 19:58:14 ID:???
>>551
perl -MJcode -e "print $Jcode::VERSION"
のようなワンライナーは普通の人間にも有用だと思うがな。

利用できるモジュールのヴァージョンをコマンドラインで調べるのは
「普通の人間」のする事ではないと言われればそれまでだがな。(w
554546:2005/04/18(月) 20:16:51 ID:???
getPack();

sub getPack {
my @pack;
my @hex1,@hex2;
my $hex1,$hex2;
open READ, '< C:\hex.txt';
foreach (<READ>) {
chomp;
if (/^#/ || $_ =~ /^\n/ || $_ =~ /^\r/) {
next;
}
push @packet,$_;
}
close READ;
for($i=0;$i < @pack;$i++){
($hex1,$hex2) = split /,/, $pack[$i];
push @{$packed{'hex1'}},pack "C*", packHex($hex1);
push @{$packed{'hex2'}},pack "C*", packHex($hex2);
}
#↓はとりあえず変換できているか確認するために表示させています。
#pack後はバイナリのため直接表示させて確認することができないので
#packされたデータを元のhexデータに変換しています。
#ちゃんと可逆変換ができればきちんと動作しているという確認がとれると考えました。
print"確認 - Hex:".getHex($packed{'hex2'}[0])."\n";
print"確認 - Pack:$packed{'hex2'}[0]\n";
}
555546:2005/04/18(月) 20:17:27 ID:???
sub packHex {
my $hex = shift;
my @hex;
@hex = split / /, $hex;
@hex = map { "0x".$_ } @hex;
return @hex;

}
sub getHex {
my $data = shift;
my $i;
my $return;
for ($i = 0; $i < length($data); $i++) {
$return .= uc(unpack("H2",substr($data, $i, 1)));
if ($i + 1 < length($data)) {
$return .= " ";
}
}
return $return;
}
sleep(999999);
556546:2005/04/18(月) 20:17:53 ID:???
txtに書いてあるhexデータは一行ずつ書かれていて
00 00 00 00 FF FF 01 00 02 00 00 00,C8 FB 6A 0A
こんな感じです。

連書き失礼します。
情報を小出しにするつもりはなかったのですがあまり長々と書いてもいけないと
思って簡略に書いてしまいました。
このようなコードを書いたのですがどうしても
push @{$packed{'hex1'}},pack "C*", packHex($hex1);
この時点でうまくpackしてくれません。
私もpackできるものだと思っていただけに原因がわかりません。
重ねてアドバイスお願いできますでしょうか。
557nobodyさん:2005/04/18(月) 21:18:35 ID:???
>>554-556
> my @hex1,@hex2;
my(@hex1), @hex2; と解釈されるが、それは意図通りか?

> push @packet, $_;
@pack ではなく?

#!/usr/local/bin/perl -w
use strict;
sub packHex { map pack('H2', $_), map split(/ /), @_ }
sub getHex { join ' ', map uc unpack('H2', $_), @_ }

my(@hex1, @hex2);
while (<DATA>) {
  next if /^[\n\r#]/;
  chomp;
  my($hex1, $hex2) = split /,/;
  push @hex1, packHex($hex1);
  push @hex2, packHex($hex2);
}

print getHex(@hex1), "\n";
print getHex(@hex2), "\n";

__DATA__
00 00 00 00 FF FF 01 00 02 00 00 00,C8 FB 6A 0A
558546:2005/04/18(月) 22:33:33 ID:???
>>557
レスありがとうございます。
ご指摘のとおり2箇所間違っていました。
更にはアドバイスどころかこんなコンパクトなコードまで
書いていただいいてありがとうございます。

あともうひとつだけできないことがありまして
print getHex(@hex1), "\n";
をした場合に"C8 FB 6A 0A"このように表示されるようにしたいのですが
(つまりバイナリデータを配列の1要素として格納したい)

557さんのコードを元に
$i=0;
while (<DATA>) {
next if /^[\n\r#]/;
chomp;
my($hex1, $hex2) = split /,/;
$hex1[$i] = packHex($hex1);
$hex2[$i] = packHex($hex2);
$i++;
}
close DATA;
#ためしに一行目のデータだけを表示
print getHex($hex1[0]), "\n";
print getHex($hex2[0]), "\n";
このようにしてみましたがうまくいきません・・・
559nobodyさん:2005/04/18(月) 22:39:16 ID:???
>>556
とりあえず文字列"0x10"は数値として解釈されると0x10(=16)では
なくて0になるってことに気をつけるべきだな。
560nobodyさん:2005/04/19(火) 00:10:27 ID:???
>>558
>>1
> 3: こんなエラーが出て上手く行かなかった。

http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_join_EXPR_LIST
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_map_BLOCK_LIST
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_pack_TEMPLATE_LIST
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_push_ARRAY_LIST
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_split__PATTERN__EXPR_LIMIT
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_unpack_TEMPLATE_EXPR
http://perldoc.jp/docs/perl/5.8.1/strict.pod

sub packHex { join '', map pack('H2', $_), split / /, pop }
sub getHex { join ' ', map uc unpack('H2', $_), split //, pop }

sub packHex { my @chr = split / /, pop; pack 'H2' x @chr, @chr }
sub packHex { local $_ = pop; s/\s+//g; pack 'H*', $_ }
561546:2005/04/19(火) 11:21:09 ID:???
>>560
たびたびありがとうございます。
すいませんでした。
テンプレの基本がなってませんでした。
各関数の詳細解説までつけていただいてありがとうございます。
perldocというのがあるのですね。
これは凄くありがたいです。
packHexにもいろいろなやり方があっておもしろいです。
これから少しずつ噛み砕いて見ていこうとおもいます。
かなりお世話していただいて本当にありがとうございました。
562:2005/04/19(火) 12:56:26 ID:xzzJhUPg
「EUC-JP」で保存したログファイルを持つ掲示板に書き込むと自動的に「SHIFT-JIS」で保存されてしまいます。
「ECU-JP」で保存されるようにするにはどのようにすればよいのでしょうか?
563nobodyさん:2005/04/19(火) 13:31:28 ID:???
>>562
jcode.plとかで文字コードをEUC-JPに変換して保存する。
564:2005/04/19(火) 14:33:26 ID:xzzJhUPg
>>563
お答えありがとうございます。
ところがjcode.plをEUC-JPで保存出来ないんです。
他のファイルは出来るのですけど。。。
565nobodyさん:2005/04/19(火) 14:51:11 ID:???
>>564
jcode.plを使って保存する文字列のコードをEUC-JPに変換する。
&jcode::convert(\$hoge,"euc-jp","sjis");

貴方の文脈では、jcode.pl自体をEUC-JPで保存しようとしてるぞ。
本当にそうだったりしてw
566nobodyさん:2005/04/19(火) 15:30:24 ID:???
perlでテキストファイルの特定の部分を拾い出し、それを配列の中にぶち込みたいと思います。
--start_of_aaa--
あああ  ←
いいい  ←この部分を@aaaに
ううう  ←
--end_of_aaa--
--start_of_bbb--
かかか  ←
ききき  ←この部分を@bbbに
くくく  ←
--end_of_bbb--
--start_of_ccc--
さささ  ←
ししし  ←この部分を@cccに
すすす  ←
--end_of_ccc--

open (TMPL,'./tmpl.dat');
@templates = <TMPL>;
close TMPL;
foreach $line (<@templates>){
 if($line =~ m|--start_of_aaa--|){
  unless($line =~ m|--end_of_aaa|){
   push @aaa,$line;
  }else{
   last;
  }
 }
 if(以後同様の繰り返し)
}
当然@aaaには--start_of_aaa--しか入らないのですが、ここで詰まってしまい、先に進めません。。。
567nobodyさん:2005/04/19(火) 16:02:20 ID:???
>>566
漏れならこうするかなあ。

my %data = ();
my $key = "__GOMI__";

foreach my $line (<@templates>) {
if ($line =~ m/--(start|end)_of_(\w+)--/) {
$key = ($1 eq "start") ? $2 : "__GOMI__";
$data{$key} = [];
} else {
push(@{$data{$key}}, $line);
}
}

my @aaa = @{$data{"aaa"}};
my @bbb = @{$data{"bbb"}};
my @ccc = @{$data{"ccc"}};
568nobodyさん:2005/04/19(火) 16:19:21 ID:n4Wb5OBG
お尋ねしたいのですが、
メールフォームのデータをCSVに保存するCGIの改造です。
吐き出されたデータが"xxxx"という風にダブルコーテーションで囲まれてしまいます。
これを外して登録したいのですが、ご教授お願いします。

$head = "DATE";
$head.= join("\",\"", 'DATE', @KEY);
$out_data = join("\",\"", @output);

if (-f $f2m_file){
open(OUT, ">> $f2m_file") or &openerr();
flock(OUT, 2);
seek(OUT, 0, 2);
}
else{
open(OUT, "> $f2m_file") or &openerr();
flock(OUT, 2);
seek(OUT, 0, 0);

print OUT jcode("\"$head\"")->sjis."\r\n";
}
print OUT jcode("\"$out_data\"")->sjis."\r\n";
close(OUT);
chmod(0644, $f2m_file);
}
569:2005/04/19(火) 16:37:39 ID:xzzJhUPg
>>565
いやあ、お恥ずかしい、その通りでしたw
ソースを書き換えて出来るようになりました。ありがとうございます。
570566:2005/04/19(火) 17:19:41 ID:???
>>567
ありがとー!!
できました。
571nobodyさん:2005/04/20(水) 00:36:08 ID:PF1TJn1K
わからないので質問させてください。
CGIなどによく「***.cgi?mode=find」みたいな感じでリンクになっていたりしますがmode=findの部分はどういう仕組みになっているのでしょうか?
572nobodyさん:2005/04/20(水) 00:37:53 ID:???
>>571
はい、Perlに関係ないです。
しかもコーディングスレです。
573nobodyさん:2005/04/20(水) 05:06:40 ID:2zJFmw5b
       見込 売上確定
3/31 新井  50000
4/1  伊藤 10000
4/10  新井 -50000 50000
4/10  上田 20000
4/15  新井 30000
4/17  伊藤 -10000 10000
4/17  伊藤 40000

こんな感じのテキストデータがあって、
スタッフごと・月ごとに売上確定分や売上見込の集計を出したいんだが…
スタッフは単発もいるので、あくまでこのデータだけから抽出したいけど、
どうすればいいんだろうか。if文使いまくりになりそうで。
574nobodyさん:2005/04/20(水) 05:34:11 ID:???
575nobodyさん:2005/04/20(水) 09:22:01 ID:???
>>573
タブ区切りの場合:
while(<>){
if(/^(\d+)/){$tuki=$1;}
if(defined $sengetu and $sengetu != $tuki) {
print "$sengetu月\n";
foreach $key (keys %mikomi) {
print "$key: 見込=$mikomi{$key} 売上確定=$uriage{$key}\n";
}
undef %mikomi; undef %uriage;
}
if (/^\d/) {
split(/\t/,$_);
$mikomi{$_[1]} += $_[2];
$uriage{$_[1]} += $_[3];
$sengetu=$tuki;
}
}
print "$sengetu月\n";
foreach $key (keys %mikomi) {
print "$key: 見込=$mikomi{$key} 売上確定=$uriage{$key}\n";
}
576nobodyさん:2005/04/20(水) 09:24:41 ID:???
過疎地だから、飛び入りにはやさしいスレです。
577573:2005/04/20(水) 09:47:22 ID:???
うおお!もうレスが!>>574>>575ありがとう。
昨日一人で考え込んで明け方になっちゃったんだけど、
まさか起きたらもうレスがついてるとは思わなかったよ。

>>576の言うとおりだね。厚意をありがたく思います。
つか、>>575をコピペでいけちゃいそうだぞw 申し訳ないっす。
578nobodyさん:2005/04/20(水) 18:30:18 ID:???
>>577
>>575だけどさ、まあいいってことよ。
その代わり、Perlを宣伝しろよな。
Perlに利害関係があるわけじゃないけどさ、このごろrubyが
幅利かせすぎだよね。

579nobodyさん:2005/04/20(水) 18:33:21 ID:???
>>576
>過疎地だから、飛び入りにはやさしいスレです。
1年前or半年前くらいは、すっごいレスの伸び様だったがな。
何かさ、やっぱrubyに食われてる?それともphpか。
580nobodyさん:2005/04/20(水) 20:02:41 ID:???
>>579
rubyやpythonに行くぐらいならjavaがいいや。

phpはApacheとの連携が強力なのでいっそJakarta Projectに
加わってApacheの標準Scriptの地位を固めてくれんかな。
581nobodyさん:2005/04/20(水) 21:49:51 ID:???
>>575を弄ってみた

while(<DATA>){
split/\t/;
$_[0]=~s/\/\d+$//;
$hash{$_[0]}{$_[1]}{miko} += $_[2];
$hash{$_[0]}{$_[1]}{kaku} += $_[3];
}
foreach my $tuki(sort{$a<=>$b} keys %hash){
print "$tuki月\n";
foreach my $name(sort keys %{$hash{$tuki}}){
print "$name:\t見込=$hash{$tuki}{$name}{miko}\t売上確定=$hash{$tuki}{$name}{kaku}\n";
}
}
582nobodyさん:2005/04/20(水) 22:12:44 ID:???
おお…
583nobodyさん:2005/04/21(木) 03:11:08 ID:???
通常CGIに引数を渡して呼び出す場合、
a.cgi?k=1のようにアドレスバーに引数を含むアドレスが表示されますよね
CGIゲームなどをやっているとこの引数が表示されない場合があるのですが
そういう風に引数を見えなくするにはどうしたらいいのでしょうか
584nobodyさん:2005/04/21(木) 03:31:43 ID:???
method="post"
CGIスレとかWeb制作板で聞いてね
585nobodyさん:2005/04/21(木) 09:48:59 ID:u958lKZ/
perlスクリプト内でPAHT,LD_LIBRALY_PATHを設定することは出来ますか?
スクリプトを手動で実行すると動くのですが、cronから実行すると
ライブラリが見つからないと怒られてしまい困ってます。
586nobodyさん:2005/04/21(木) 10:05:27 ID:???
自プロセスの環境変数を設定するだけだったら、問題なく可能
587nobodyさん:2005/04/21(木) 11:02:48 ID:???
掲示板系のCGIでmy変数などって使ったほうがいいのでしょうか。
全部グローバル変数でやってまして最近my変数を覚えたんですけど、
KENTの掲示板などを落として見てみてもmy変数使って無いですし、
そんなに長い処理でもないと思うので、そこまで気を遣う必要ってないのでしょうか。
自作しているのは、サブルーチンの階層も深くて2つまでです。
588nobodyさん:2005/04/21(木) 16:44:18 ID:???
KENTを参考にしている時点でぬるぽだな
589nobodyさん:2005/04/21(木) 17:07:45 ID:???
>>584
ありがとうございます
590nobodyさん:2005/04/21(木) 17:56:10 ID:???
サブルーチンの階層って何だw
myは便利だよ。 もう my のない世界なんて考えられないって程に。
591nobodyさん:2005/04/21(木) 18:24:00 ID:???
俺が勉強したての時に参照したCGIは、モジュール化に物凄い気を遣ってて見やすかった。

直せるうちに直しておいた方が、後で改造するときに分かりやすいと思う。
変数名なんて三日も空けば忘れるからな。
ちょっと手間をかけておく事で、後の面倒を大きく減らせる。

他のプログラム言語なんかも学ぶなら、my変数のような考え方は必須になる。
グローバル関数を無くし関数の独立性を高めるという考えは、カプセル化、そしてオブジェクト指向に繋がっていく。
592nobodyさん:2005/04/21(木) 18:43:42 ID:???
my っていうか ruby -w と use strict は使うクセを付けておいた方が良いと思う。
593nobodyさん:2005/04/21(木) 20:42:56 ID:???
>ruby -w
詳しく。
594nobodyさん:2005/04/21(木) 22:24:07 ID:???
ごめん perl -w だた。
595nobodyさん:2005/04/21(木) 22:54:38 ID:???
今はuse warnings;で代用できるよん。便利です。
596nobodyさん:2005/04/22(金) 07:08:46 ID:0S2C2eid
lzh扱えるモジュールないっすか?
597nobodyさん:2005/04/22(金) 07:26:56 ID:???
>>596
Perlモジュールについて
http://pc8.2ch.net/test/read.cgi/php/997829243/

Win なら
http://homepage3.nifty.com/hippo2000/perltips/perllha.htm
やりたい事によっては system() で lha(1) を使った方が早いかも。
598nobodyさん:2005/04/22(金) 07:41:56 ID:???
thx
そこでで聞いてみるっす
599nobodyさん:2005/04/22(金) 16:04:20 ID:???
¥nと¥の違いがわかりません
ググっても出ないorz
600nobodyさん:2005/04/22(金) 16:07:04 ID:???
ぐああ
すんません
わかりました
601nobodyさん:2005/04/22(金) 16:42:34 ID:???
ワロス
602nobodyさん:2005/04/22(金) 18:59:27 ID:???
$a01+$a02+$a03+$a04+$a05+$a06+$a07+$a08

これをもうちょっとこざっぱりとまとめて書きたいんですが…
どうしたらいいでしょうか?
603nobodyさん:2005/04/22(金) 19:09:20 ID:???
配列を使え
604nobodyさん:2005/04/22(金) 23:09:20 ID:???
$aa=~s/$hensu1/$hensu2/g;

この例で、$hensu1 にどのような文字列が来るか分からない時は、
必ず、
$aa=~s/\Q$hensu1/$hensu2/g;
とすべきなのでしょうか?

また、例えば、
  $aa="ポっポっポ、はとポっポ";
  $aa=~s/ポ/ぽ/g;
  print $aa;
これでは、文字が化け化けで、
  $aa="ポっポっポ、はとポっポ";
  $aa=~s/\Qポ/ぽ/g;
  print $aa;
とすれば正常になりますが、「ポ」と同じように\Qでクォートしなければ
いけない文字は、他に何がありますか?というか、どのような理屈で
クォートしなければいけないのでしょうか?
605nobodyさん:2005/04/22(金) 23:12:33 ID:???
2バイト文字が泣き別れしてるから。
use encodingしる。>>518,>>530
606nobodyさん:2005/04/22(金) 23:15:23 ID:???
変数名を動的に(?)作ることできますか。
perl -e '$a0=1; $a1=2; $a2=3; for(0..9){print "$a$_\n";}'
みたいなんで$a0から$anまでの変数を作りたいんですが、これじゃ
変数名としてつながってくれないんです。
607nobodyさん:2005/04/22(金) 23:39:50 ID:???
% perl -e '$a0=1; $a1=2; $a2=3; for(0..9){print "${'a'.$_}\n";}'

詳しくは「シンボリックリファレンス」をキーワードに調べてくれ。

しかし一応できるこたできるが、よっぽど特殊なことをやろうと
言うんじゃない限りはじめから配列かハッシュ使ったほうがいいと
思われ。
608nobodyさん:2005/04/23(土) 04:13:32 ID:???
>>607
ありがとうございました。なるほど{}ってシンボリック
リファレンス作るにも使うんですね。メモメモっと。
609nobodyさん:2005/04/23(土) 12:37:33 ID:???
シンボリックリファレンスの概念をあっさり理解できるのに、配列は使えないのか?
それとも、配列を使えない事情があるのか?
>607のコードが使える状況で配列が使えない状況ってのが思いつかんのだが…
610nobodyさん:2005/04/23(土) 13:52:44 ID:???
マシン語→C→Perlと歩んできたに違いない。
リファレンスは意外と馴染みやすい。
611nobodyさん:2005/04/23(土) 17:56:38 ID:???
なんつーかeval使った方が・・
612606=608:2005/04/23(土) 18:16:56 ID:???
>>609
ごみんなさい、わては>>602じゃないです。
もち>>602の場合は、配列でしょうが、
コマンドラインでワイルドカードを引数において、たくさんのファイルを
読んでそのファイル名に応じた変数を作りたかったのです。
便乗質問の積もりですた。
613606=608:2005/04/23(土) 18:18:40 ID:???
>>602はどこに消えた〜い。
614nobodyさん:2005/04/23(土) 18:34:26 ID:???
>>612
わるいことはいわないのでファイル名をキーにした
ハッシュにしとけ
615nobodyさん:2005/04/23(土) 21:08:01 ID:???
すみません、質問させてください。

登録されたデータ(ログファイル)から任意の3つくらいを抽出したいのですが、
このとき重複しないような方法がわかりません。

具体的にいうと、タグを何個か1つのログに登録しておいてそのなかの3つくらいを重複しないようにランダムに出したいのです。

randでやったらどうしても重複してしまいます。
616nobodyさん:2005/04/23(土) 21:32:20 ID:???
>>615
以前に抽出したもの(index番号等)を覚えておいて、新しいものを選ぶ度に重複していないかチェック。
617nobodyさん:2005/04/23(土) 21:44:19 ID:???
>>615
んじゃ、>>616さんと違う手法で、
ランダムに並べ替えてから、任意の3つを取る。

@tag = ('big','small','strong','table','input','img');
for(@tag){
$hoge = rand(@tag);
($tag[$_],$tag[$hoge]) = ($tag[$hoge],$tag[$_]);
}
for(0..2){
print "$tag[$_]\n";
}
618nobodyさん:2005/04/23(土) 22:55:20 ID:???
>>616-617
とても参考になりました。ありがとうございます、やってみます。
619nobodyさん:2005/04/23(土) 23:55:32 ID:???
my %aaa = (  'a' => '0',  'b' => '1',  'c' => '2', );
my @bbb = (
 ['ab','ac','ad',],  # 0
 ['be','bf',],     # 1
 ['cg',],      # 2
);         # このようなデータを用意しておき、
my $data = "abc";   # というデータを与えた時に

my @list = (  'abbecg',  'abbfcg',  'acbecg',  'acbfcg',  'adbecg',  'adbfcg', );
# @listのような配列を作り出したいのですがどなたか教えて下さい。

# (1) %aaaのa,b,cの部分は英数字と記号が入ります。
#     %aaaの0,1,2はそれぞれ順番に数字を割り当てています。
# (2) @bbbの一次元目の数値は%aaaの0,1,2と一致します。
#     @bbbの二次元目の要素数は固定ではなく変化します。
# (3) $dataは%aaaに該当するものがあった場合にのみ「a→ab」のように変化し、
#     %aaaに該当するものが無い場合は「z→z」のように変化しません。

# 現在は以下のようにしてランダムに出力しているのですが、
# 今やりたいことは出力される可能性のある文字列全てを取り出したいのです。
# 分かりにくくてすいませんが宜しくお願い致します。
> my $compdata = "";
> for(split//,$data){
>  if ( $#{$bbb[$aaa{$_}]} || $bbb[ $aaa{$_} ][0] ne "" ){
>   $compdata .= $bbb[ $aaa{$_} ][ rand $#{$bbb[$aaa{$_}]} ];
>  }else{
>   $compdata .= $_;
>  }
> }
620nobodyさん:2005/04/24(日) 01:27:40 ID:???
こういうことかな。もっとかっこいいのが出てくると思います。

my @list;
for (split //,$data){
my $comp;
if(defined $aaa{$_}){
$comp=$bbb[0]->[$aaa{$_}];
}else{
$comp=$_;
}
for (@{$bbb[1]}){
my $temp=$comp;
$comp.=$_;
for(@{$bbb[2]}){
my $temp=$comp;
$comp.=$_;
push @list, $comp;
$comp=$temp;
}
$comp=$temp;
}
$comp="";
}
for(@list){
print $_,"\n";
}
621nobodyさん:2005/04/24(日) 01:31:30 ID:???
>>619
#!/usr/local/bin/perl
use strict;
my %order = (a => 0, b => 1, c => 2, d => 3);
my @data = (
  [ 'ab', 'ac', 'ad' ],
  [ 'be', 'bf' ],
  [ 'cg' ],
  [ 'dh', 'di' ],
);

my @result;
my_push(\@result, [ @data[@order{ split //, $ARGV[0] }] ]);
print join "\n", @result;

sub my_push {
  my($result, $data, $i, $pre) = @_;
  if ($i == $#{$data}) {
    push @{$result}, map "$pre$_", @{$data->[$i]};
  }
  else {
    my_push($result, $data, $i + 1, "$pre$_") for @{$data->[$i]};
  }
}
622619:2005/04/24(日) 02:01:01 ID:???
>>620さん
ありがとうございます。
言葉が足りずに申し訳ございません。目的のものとは違ったようです。
$dataの文字数は毎回異なります。

>>621さん
ありがとうございます。
分かりにくい表現で申し訳ございません。
入力される文字列は設定済みの文字列だけではなく、
> %order = (a => 0, b => 1, c => 2, d => 3);
ではa,b,c,dが設定済みですが、e,f,g...x,y,zのような、
未定義の値が入力されることもあり、その場合は変化しないように出来ると嬉しいです。

とはいえ、後は何とかなりそうなの気がするので頑張ってみます。
お二方、本当にありがとうございました。

書き込みしてからも色々と調べていたのですが、
my %CCC = (
  'a' => ['ab','ac','ad',],
  'b' => ['be','bf',],
  'c' => ['cg',],
);
こんな書き方も出来るのですね。

本当にありがとうございました。
引き続き頑張ってみます。
また、分からないことがあったら宜しくお願い致します。
623nobodyさん:2005/04/24(日) 02:16:56 ID:???
ずこー
624nobodyさん:2005/04/25(月) 08:46:28 ID:???
$var =~ m/nantoka/; = $var =~ /nantoka/;
$var =~ m/nantoka/igo; = $var =~ /nantoka/igo;
mって使う必要ないと思うんだけど、みなさん、いつ使ってます?


625nobodyさん:2005/04/25(月) 11:04:05 ID:???
>>624
'/' を正規表現に含める時。

/^([^\/]*)\/([^\/]+)\/(.*)\z/;
/^ ([^\/]*) \/ ([^\/]+) \/ (.*) \z/x;
m|^([^/]*)/([^/]+)/(.*)\z|;
m|^ ([^/]*) / ([^/]+) / (.*) \z|x;
626nobodyさん:2005/04/25(月) 15:14:52 ID:???
>>624
謝りたい気分の時。

$str =~ m(_ _)m;
627nobodyさん:2005/04/25(月) 16:13:33 ID:???
( ´∀`)ワラタ
628nobodyさん:2005/04/25(月) 20:42:14 ID:???
>>625-626
レスありがとうございます。
なるほど、/のエスケープを省略したいときですね。
誤りたいとき使うとまた誤らなきゃですね(w
どもども。
629nobodyさん:2005/04/26(火) 12:58:40 ID:???
JAPUたん降臨希望age
630nobodyさん:2005/04/26(火) 14:53:35 ID:???
ちょっと上でも出てた話題にかぶるかもしれないんですが・・・
@list($h01,$h02,$h03)
$h01〜03に、例えばそれぞれ0,0,1と代入されている時
@listの中のどの変数に1と入っているかを確認するには?indexを使うんでしょうか?

if (@list==1) {・・・(以下続く)
これは間違ってる書き方ですがorz、
こんな風に『@listの中の変数のどれかが1であれば・・・』と
条件文の中に組込みたいのです。
631nobodyさん:2005/04/26(火) 14:53:56 ID:OvccyAYT
あげさせて下さい
632nobodyさん:2005/04/26(火) 15:00:58 ID:???
633nobodyさん:2005/04/26(火) 17:41:53 ID:???
>632
ありがとう!やってみます。
634nobodyさん:2005/04/26(火) 18:10:21 ID:6+zG2+f5
何度もすみません・・・もう1ついいでしょうか。
$aaaが一定以上の値になった時、変動する$aaaをその値以上に固定する
というのはどう書けばいいでしょう?
if ($aaa >= 10) { $aaa != 10 ;}
何か違う・・・orz
635nobodyさん:2005/04/26(火) 18:41:56 ID:???
!消せばいいだけでは。
636nobodyさん:2005/04/26(火) 18:49:53 ID:???
>635
すみません、説明が悪かったです・・・
$aaaは10以下にはならず、10以上の値には変動できる、という書き方です。
!を消すと$aaaは10、になってしまうので。。
637nobodyさん:2005/04/26(火) 20:13:05 ID:???
>>636
10以下ならもう一度変動させれば?

あと「以下」と「以上」の使い方がおかしい。
10はどっちにも含まれるぞ?
638nobodyさん:2005/04/26(火) 20:34:12 ID:???
$aaaがどう動く、どういう性質の変数なのか分からんと、どう変えていいものか迷う。
乱数なのか、ユーザの入力値なのか、1ずつ減るカウンタ用の変数なのか、二次関数みたいな関数の値なのか。
$aaaに10を代入するのは何故いけないの?
$aaaに10を加算するだけでは駄目?
639nobodyさん:2005/04/26(火) 20:37:06 ID:6+zG2+f5
>637
ほ、ほんとだすみません、10未満にはならず、10以上の値には変動できる、です。

>もう一度変動させれば?
言われて気付いたんですが・・・、ここで出た結果のみで判断させたいんですorz

if ($aaa >= 10) { !($aaa <= 10) }
これだと10以上ではない、と言うだけですよねアー
640634:2005/04/26(火) 20:47:57 ID:???
>638
ええと、説明下手なんですが・・・
>ユーザーの入力値
はい、そんな感じです。
$aaaは値が1ずつ加算されて、上限(例えば100)で止まる、といった動きをします。
ゲームなどで得点が1ずつ増えていくような・・・
なので、代入や一気に加算する、といった性質の変数ではないです。
641nobodyさん:2005/04/26(火) 22:12:18 ID:???
>>640
その処理をするには、3つの値(変数)が必要なんですよ。
1. 変動する値 (1ずつ加算される値)
2. 上限値 (100)
3. 保持する値 (上限値に達するまでは1と一致して、それ以降は2と一致)
文章で書くと$aaaと表現するので分かり辛いかも知れないですけど、
1.を比較等の色々の処理をした結果が3.になるわけで、これを1つの変数$aaaで表す事はできません。
642634:2005/04/26(火) 22:41:02 ID:Bt64jE3X
>641
詳説、ありがとうございます。目から鱗です。orz

変動する値の$aaaと、上限値$bbb、保持する為の変数が$ccc

$bbb=100;
#ここで$aaaを1ずつ足していく
#で、もし$aaaが10に達したら・・・
if ($aaa >= 10) {

・・・・この先がわかりません・・・
643nobodyさん:2005/04/27(水) 00:40:25 ID:???
>>634>>641が何を話してるのかさっぱりわからんのは俺だけか…?
644nobodyさん:2005/04/27(水) 02:06:54 ID:???
>>642
if($aaa<10){
$aaa++;
}
645nobodyさん:2005/04/27(水) 02:34:26 ID:???
>>642
$aaaが$bbbに満たっていない間、$cccに$aaaを代入すればいいだけだろ。
646638:2005/04/27(水) 02:39:01 ID:???
>639
比較と代入の理解が滅茶苦茶だな。
<=とか==とか<は比較をするだけで、値を変化させるわけじゃないぞ。

if($aaa > $bbb) $ccc = $bbb;
else $ccc = $aaa;
お前が本当にやりたい処理は
「$aaaが上限値($bbb)より大きいときは、$aaaを上限値にする」じゃないか?
ちょっと落ち着いて、場合分けして考えてみるといい。

個人的には
if($aaa > $bbb) $aaa = $bbb;
でじゅうぶんな予感もする。
上限値に切り揃える前の点数のデータが不要ならば、の話だけど。
647638:2005/04/27(水) 02:40:06 ID:???
>646
>「$aaaが上限値($bbb)より大きいときは、$aaaを上限値にする」
ちょっと誤解を招く表記だな。
「$aaaが上限値($bbb)より大きいときは、$aaaを上限値と等しい値にする」
に訂正。
648nobodyさん:2005/04/27(水) 02:49:37 ID:???
1づつ足していけばこう変動するしかなかろう。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20...

これをどう変動させたいのだ?
649nobodyさん:2005/04/27(水) 09:44:59 ID:???
プログラムの一箇所で「この変数の値は絶対を超えません」と宣言すれば
他のところで何やっても10までしか上がらない
ということを希望してるのか?

それだったら、$aaa 専用のクラスを一つ作って、専用の add() メソッドを実装しろ
$aaa 専用に += や ++ 演算子をオーバーロードするのも吉
650nobodyさん:2005/04/27(水) 11:36:43 ID:???
こんな質問しちゃうやつがクラスやメソッドが理解できると思ってるの?
651634:2005/04/27(水) 12:41:57 ID:???
何度もすみません・・・
>比較と代入の理解が滅茶苦茶
はい、値を変化させるものではないのはわかっているんですが、表現が思いつかず・・・

>プログラムの一箇所で「この変数の値は絶対を超えません」と宣言すれば
>他のところで何やっても10までしか上がらない
はい、そんな感じです。
ただ、10までしか上がらないのではなく、10より下には下がらない、というのを希望しています。

add() メソッドは、調べてみたのですがちょっと難しくてわかりませんでした。
折角紹介してくださったのにすみません。
652634:2005/04/27(水) 12:42:18 ID:???
こちらの知識不足と情報を小出しにしてしまったせいで、
余計何したいのかがわかりにくくなってしまいましたよね・・・・orz

下限0から始まって上限100で止まる
0から始まって、ユーザーの入力にあわせて1ずつ加算・減算されていく
(加算と減算は別のところで処理させるつもりでした)
0 1 2 3 4 5 6 7 8 9 10
10まで達したら、
11 12 13 14 15 16 17 18 19 20...
引き続き加算と減算が行われるが、一旦10以上になったら、
それ以降は減算されても値は10未満にはならず、10〜100の間で上下する

こんな動作をさせたいと思っていました・・・
653nobodyさん:2005/04/27(水) 13:05:03 ID:???
>>652
10を越えた時点でフラグを立てればいいんじゃないの
if ($aaa >= 10) $flag = 1;
if ($flag && $aaa < 10) $aaa = 10;
654nobodyさん:2005/04/27(水) 13:09:00 ID:???
>>646 >>653
一応突っ込んでおくが Perl にぶら下がり if は無い。
Perl のスレなんだから Perl で答えてやれよ。
655nobodyさん:2005/04/27(水) 13:14:08 ID:???
>>654
「ぶら下がり if」って一般的な用語なの?
「dangling else」なら聞くけど。
656nobodyさん:2005/04/27(水) 14:20:48 ID:???
日本語ではぶら下がりifと言うんだよ。
657654:2005/04/27(水) 14:39:18 ID:???
>>655
うーん、あまり一般的な表現ではないようだね。
Perl には if (EXPR) EXPR という構文は無くて、
必ず if (EXPR) BLOCK ないし EXPR if EXPR と
書かなければいけない、って言いたかったんだ。
http://www.nurs.or.jp/~sug/soft/super/macro.htm
での用法のように、if (EXPR) EXPR という構文の
事を「ぶら下がり if」と呼ぶと解釈してたよ。

本題と関係無い話でスレ汚しごめん。>ALL
658652:2005/04/27(水) 15:01:10 ID:FBojevS6
こういうことでしょうか?
$flag=0;
if ($aaa >= 10) {$flag = 1;}
#$aaaが10以上の場合、$flagが立つ
if ($flag= 0 && $aaa < 10) { $aaa = 10; }
#$flagが立っておらず、$aaaが10より小さい場合・・・$aaaは10

?????orz
10より下に行かないようにするって処理を
どう書いてやればいいのかわかりません・・・
659nobodyさん:2005/04/27(水) 15:06:58 ID:4gECGjaS
質問です。
phpの正規表現で
ereg(.*[EGG|EVA].*, $str);
とした場合、マッチするのは*****EGG****か*******EVA*******と言う
$strで良いのでしょうか?
660nobodyさん:2005/04/27(水) 15:09:21 ID:I4dBvpe7
Perlではif にぶら下がり文({}の省略)は許されないということですね。
でelseをぶら下がり文に使った時に起きる問題がdangling else
>>658
おまえにプログラミングは無理だ
661nobodyさん:2005/04/27(水) 15:11:46 ID:4gECGjaS
ごめんなさい。phpスレと間違えました。orz
662nobodyさん:2005/04/27(水) 15:47:03 ID:???
ActivePerl 5.8.6で、
binmode(STDOUT,":encoding(charset)");
を使うと、必ず $! に Bad file descriptor と入ってしまうのですが、
どうにかならないのでしょうか。

調べてみても
「binmodeを使えばすでに開いているファイルハンドルにPerlIOレイヤを設定できる」
としか説明されておらず、このことには触れていないようなので、発生するのはActivePerlだけなのでしょうか…。

binmode(STDOUT,":utf8");
binmode(STDOUT,":bytes");

などの":encoding(charset)"が無いの場合は、エラーは起こりません。
shift_jisで出力したいので困ってしまって…。
663nobodyさん:2005/04/27(水) 16:00:17 ID:???
>>658
基本的に「10より下にいかないようにする」ことはできないと思ってくれ

代わりに「10より下にいくたびに無理矢理10に戻す」処理を行なう
それも、スクリプト中の下にいきそうな可能性のある箇所全てで、ということになる

if ($flag= 0 && $aaa < 10) { $aaa = 10; } というのは
「もしフラグが立っていて、つまり $a が10以上になったことが過去あって、
しかも現在 $a が10を下回っていたら、$aを無理矢理10に戻す」
という意味だ
664nobodyさん:2005/04/27(水) 16:17:40 ID:???
>663
ああー、わかりました・・・!!!!

まずできる事とできない事の切り分けができていなかったんですねorz
今回のやり取り、ホント勉強になりました。皆さんありがとうございます。
665nobodyさん:2005/04/27(水) 16:27:56 ID:???
>>662
つか $! にそのメッセージがセットされても -w 下で警告が出るわけで無し、

#!/usr/local/bin/perl -w
use strict; use Encode qw(from_to);
from_to(my $str = "いーゆーしーじぇーぴー\n", 'euc-jp' => 'utf8');
utf8::decode($str);
binmode STDOUT, ':encoding(shiftjis)';
print $str;

…でちゃんと Shift_JIS で出力されるし、何か困る?

#!/usr/local/bin/perl -w
use strict; use encoding 'euc-jp', STDOUT => 'shiftjis';
print "いーゆーしーじぇーぴー\n";

だと $! はセットされないね。

何にしても
<q cite="http://search.cpan.org/~nwclark/perl-5.8.6/pod/perlvar.pod#$!">
If used numerically, yields the current value of the C errno variable, or in
other words, if a system or library call fails, it sets this variable. This
means that the value of $! is meaningful only immediately after a failure:
</q>
だから、システムコール系の関数でエラーした時にそのエラー内容を
調べる以外の用途で $! の値を見ても意味無いよ。
666nobodyさん:2005/04/27(水) 16:53:30 ID:???
>665
なるほど、システムコールに失敗したとき以外の $! は何の意味も持たないんですね。

binmode(STDOUT,":shift_jis");

みたいな間違いをしたとき、期待した文字エンコーディングにならないだけで、
-wで警告もでなければ、エラーも起きず、$!を見てみると No such file or directory になっていたので、
これもまた表にでないエラーが起きているのかと思ってしまいました。

use encodingは、グローバルなんでちょっと使えませんでした。
他で何カ所かファイルを読み込むときに、それぞれのファイルの文字エンコーディングが統一されていない為です。

スッキリしました。
お返事、どうもありがとうございます。
667nobodyさん:2005/04/27(水) 16:58:33 ID:???
> binmode(STDOUT,":shift_jis");

すいません、警告でてました…。
warningsToBrowserでは表示されないみたいですね。

コマンドラインから実行したらきっちり、Unknown PerlIO layerってでてました。
668nobodyさん:2005/04/27(水) 19:09:04 ID:???
#$bbbに100をセット
$bbb = 100;
#最初の入力プロンプトを出力
print "> ";
while(<STDIN>){
#入力が数値の場合、$aaaから入力分を減算
if(/^\d+$/){$aaa -= $_;$flag = 1}
#入力が空の場合、$aaaに1加算
elsif(/^$/){$aaa++;$flag = 0}
#入力が数値または空以外の場合、終了
else{last}
#入力が減算かつ$cccの値が10以上かつ$aaaが9以下の場合、$aaaに10をセット
if(flag && $ccc>=10 && $aaa<=9){$aaa = 10}
#$aaaが負の場合、$aaaに0をセット
elsif($aaa<0){$aaa = 0}
#$cccの値が$bbbより小さい場合、$cccに$aaaをセット
if($ccc<$bbb){$ccc = $aaa}
#現在の$cccを出力
print "$ccc\n";
#次の入力プロンプトを出力
print "> ";
}
669nobodyさん:2005/04/27(水) 19:11:01 ID:???
>>668>>664
670nobodyさん:2005/04/27(水) 19:24:42 ID:???
>>668は if(flag && の記述が間違っているし
$flagの処理は無くてもいいから下のように書ける。

$bbb = 100;
print "> ";
while(<STDIN>){
if(/^\d+$/){$aaa -= $_}
elsif(/^$/){$aaa++}
else{last}
if($ccc>=10 && $aaa<=9){$aaa = 10}
elsif($aaa<0){$aaa = 0}
if($ccc<$bbb){$ccc = $aaa}
print "$ccc\n";
print "> ";
}
671nobodyさん:2005/04/27(水) 20:24:16 ID:???
# '+' で +1 、'-' で -1 、それ以外で終了
my($m,$n,$i)=(10,100,0); # min, max, start
do{print$i=$2?$i==$n?$n:$i+1:$i==$m?$m:$i==0?0:$i-1,' > '}
while<STDIN>=~/^((\+)|-)$/;
672638:2005/04/27(水) 21:21:37 ID:???
>654
>Perl にぶら下がり if は無い
最近Perl書いてないから忘れてたorz
673nobodyさん:2005/04/27(水) 22:56:09 ID:D9rBVnk5
質問させてください。

ファイルの内容を print してから、
新しい値をそのファイルに追記したいのですが、
以下のようにやっても +>> のモードなのに
ファイルの中身が取れません。

open( DATA, "+>> count" );
print <DATA>;
print DATA qq(test\n);
close( DATA );

追記は出来ているんですが、
このモードでは読み込みができないのでしょうか?
674103:2005/04/27(水) 22:57:19 ID:???
他スレから移動しました(誤爆してしまった。。。恥)

つかぬことをお伺いします。

掲示板への投稿内容を利用者に送信するというスクリプトを
作っている途中で思ったのですが、

sendmailを使って5通同報メールを送信する場合、
1)5回、メール送信動作を繰り返す
2)BCCに5通分のアドレスを記述してメールを送信する
どちらがサーバー負担軽いのでしょうか。
#メールを5通出すということには変わりはないですが。

それ以前にどうやってBCCに複数アドレスを書くかという
問題にぶつかっていたりしますが(爆死
675nobodyさん:2005/04/27(水) 22:58:40 ID:NwHD2MSR
元のスクリプトはMW-manager ver1.24。
DES方式のパスワード認証をMD5に変えようとしました。
はじめのパスワード設定はしっかりできました。
しかしいざ認証になると”パスワードが違う”となってしまいます。
CGIレスキューチャレンジ/www.rescue.ne.jp/cgi/md5/を読むと、
認証の部分はDESとMD5は同じとあったので、同じにしたのですが
考え方まずいんでしょうか(汗)
676675:2005/04/27(水) 22:59:05 ID:NwHD2MSR
$salt = "M1";
#マスターパスワードのセット:動作する
sub pass_set
{
 if($in{'setpass'} != $in{'setpass2'}){ &error("パスワード不適合"); }
 open PASS, ">$passfile" or &error("$passfileが開けませんでした。");
 #ここを変えた↓
$pass = crypt("$in{'setpass'}", "\$1\$$salt");
 print PASS "$pass";
 close PASS;
}
#パスワードのチェック
sub password_check
{
   open(PASS, "$passfile") or &error("$passfileが開けませんでした。");
   $pass = <PASS>;
   close PASS;

 if($in{'mode'} eq "login"){
  #↓ここを変えた
  $in{'pass'} = crypt("$in{'setpass'}", "\$1\$$salt");
  if($in{'pass'} eq $pass){
      print qq(Set-Cookie: USER=1\n);
  }else{&error("パスワードが違います。");}#このエラーが出てる
(以下略)
677nobodyさん:2005/04/27(水) 23:08:56 ID:???
>>673
俺も初心者なんで良くわかんないけど
+>>ってあるの?
678673:2005/04/27(水) 23:11:04 ID:???
>>677

オライリーのラクダ本に書いてあったので使ってみました。
>> との違いは、読み出しがOKなだけみたいです。

そもそも +>> 自体が無い!?
679nobodyさん:2005/04/27(水) 23:14:05 ID:???
>>673
たぶんファイルポインタがopen直後は末尾をさしてるとか
そんなとこじゃない? 読み出す前にseek DATA, 0, 0;してみ。
680nobodyさん:2005/04/28(木) 00:48:30 ID:???
なにこのスレ('A`)
681nobodyさん:2005/04/28(木) 01:39:04 ID:A2bYvrGq
>>673
printではなくpushはだめなの。
682nobodyさん:2005/04/28(木) 03:05:17 ID:???
おまいら最近シリメツレツすぎ(´д`)
683nobodyさん:2005/04/28(木) 05:39:07 ID:???
>>673
http://search.cpan.org/~nwclark/perl-5.8.6/pod/perlopentut.pod#Mixing_Reads_and_Writes
読み書き両用で open した直後のファイルポインタは '+' 無しで
open した際と概ね一致するが、プラットフォームやヴァージョンに
よってそうならない場合もあるので常に seek を入れるが吉。

>>674
2)

>>675-676
★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1077525387/
684nobodyさん:2005/04/28(木) 06:39:34 ID:???
>>673
oepn直後に
print "tell:", tell(DATA), "\n";
でも入れてポインタの位置を確認。

# '+<'で読んだ後、seek(DATA, 0, 2)して追記でもいい気がする。

>>674
ルークよ、カンマを使え。
685nobodyさん:2005/04/28(木) 07:34:02 ID:???
>>676
$1$salt$
686673:2005/04/28(木) 09:25:16 ID:???
>>679,683,684

回答ありがとうございました。
ご指摘の通り、ファイルポインタの位置が原因で
読み込みができていなかったようです。
seek( DATA, 0, 0 );
を追加したところ、正常に読み込めました!

また、追記のときはファイルポインタの位置に
関係なく必ず末尾に挿入されるようです。

seek( DATA, 0, 0 );
の後だったので
seek( DATA, 0, 2 );
が必要かと思いましたが、
無しでも正常に追記できてました。
687675:2005/04/28(木) 10:20:23 ID:???
>>683
ぬ、そっちのスレでよかったんですね(汗
>>685
Σ(@@;;;
あぁ・・・そうか(汗
ありがとうございます。
688nobodyさん:2005/04/28(木) 11:06:32 ID:???
>>686
">>"でopenするとO_APPENDが指定されるので
writeは必ずファイルの末尾に行われる。

逆にいうと末尾以外のところにseekして書きたい
のに ">>"や"+>>"で開くとあれ?とかいうことに
なるので注意。昔やってしばらく悩んだ(笑)

ファイルを読み書き両方で開きたい & なければ
つくって欲しい & 存在すれば中身はそのまま
という条件で開こうとするとつい '+>>' 使い
たくなるんだよね...
689673:2005/04/28(木) 11:44:40 ID:???
>>688

>> だと必ず追記なんですね。なるほど。
色々と勉強になります。

今回も +>> 使ったの初めてだったので…
690nobodyさん:2005/04/28(木) 16:03:43 ID:???
>664です
遅レスですが、>668さん、>670さん、
わざわざ書いて下さって感涙です・・・助かりました。
まだ知識も経験も少ないので、例があると理解しやすいです・・・
お礼もできましたので、これでホントに名無しに戻ります。
ありがとうございました。
691nobodyさん:2005/04/28(木) 17:26:10 ID:tmfF6IZw
#SSL初期化
use Net::SSLeay
qw(get_https post_https sslcat make_headers make_form);

の部分で


Can't locate Net/SSLeay.pm in @INC (@INC contains: /usr/local/lib/perl5/5.8.6/i686-linux /usr/local/lib/perl5/5.8.6 /usr/local/lib/perl5/site_perl/5.8.6/i686-linux /usr/local/lib/perl5/site_perl/5.8.6 /usr/local/lib/perl5/site_perl .) at test.cgi line 7.
BEGIN failed--compilation aborted at test.cgi line 7.

とエラーが出るのですが、なんだかわかりませんでしょうか。
692nobodyさん:2005/04/28(木) 17:44:55 ID:???
パスが通ったところにライブラリがありません
693nobodyさん:2005/04/28(木) 18:33:54 ID:???
わからないエラーメッセージがでたらperldiagひけよ。
日本語訳もあるんだしさー。

ttp://www.att.or.jp/perl/man/perldiag.1.html
694nobodyさん:2005/04/28(木) 23:31:11 ID:xLVfIYcW
突然ですが、質問させて下さい。

テキストファイルを複数のCGIで書き込んだり呼び出したりしている
のですが、最近急にデータがレコード単位で消えたりし始めました。
100レコードあったとすると、20〜30行だけが消えていたりして、
レイアウトがずれてる場合もあります。
ファイルロックは、書き込みをするCGIのみ記述しているのですが、
呼び出しのみのCGIも記述する必要があるのでしょうか?それとも
プログラムミスの可能性の方が大きいでしょうか?

言葉のみの記述でうまく説明できていないかもしれませんが、なにか
ヒントでもいいので教えて下さい。
695nobodyさん:2005/04/28(木) 23:52:07 ID:???
読み込みにもロックしないと、別のプロセスが書き込んでる途中のを読み込んで、
くずれる可能性はあると思う。
696nobodyさん:2005/04/29(金) 03:28:27 ID:???
惜しい。書き込んでる最中のものはロックされているので読み出せない。
読み込んでいる最中のファイルを書き換えられる、が正解。

同じく読み込み側でロックすることを薦める。
697nobodyさん:2005/04/29(金) 11:46:38 ID:???
>>696
だうと。
プロセス A がロックしているファイルをプロセス B が読む場合、
・共有ロックか排他ロックか
・mandatory lock か advisory lock か
・advisory lock なら、B でロック状態をチェックするか否か
で話が変わる。

例えば A が advisory lock で排他ロックをかけていても、B が
自発的にロック状態をチェックし、ロックされていれば読み書きを
"控える" という事をしない限り、ロックとして正しく機能しない。

【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/
698nobodyさん:2005/04/29(金) 15:51:27 ID:???
まあ、ロックしてるって具体的には何を使ってるの?とかOSは何よ?
とかわからないと議論できんな
699nobodyさん:2005/04/29(金) 21:44:09 ID:s7r+/5xE
amezo2000のsock.cgiで
unicodeで書かれたサイトの抜き取りができません
どうすればいいですか
700nobodyさん:2005/04/29(金) 23:10:47 ID:???
作者にメール送れば
701nobodyさん:2005/04/30(土) 00:33:02 ID:???
多分ここに来てる人のほとんどがパソコンでコードを書いて、それをサーバーにアップして
何らかの日本語処理をしていると思うので、ちょっと質問です。

漢字はEUCを使っていますか?
日本語を扱う場合、当然EUCの方がはるかに問題が少ないので、EUCを使うべきでしょうが
パソコンでEUCを使うのって、非常に面倒くさくないですか?
ファイルをイチイチEUCで書き出さなければいけないし、簡単なデバッグするのに
DOS窓で > Perl aaa.cgi としても、printで出力した漢字は化けるし....。
何か、簡単にEUC環境を作る方法ってあるのですか?

702nobodyさん:2005/04/30(土) 00:45:19 ID:???
>>701
サーバにアップってのは、開発をローカルでやるわけ?
サーバがあるのなら、サーバで開発すればいいじゃん。
日本語処理を別個にしたりはしないんじゃない?エディタ使うだけだし、敢えて
別文字コード変換とかあってもエディタに変換機能ぐらいあるだろうし。
703nobodyさん:2005/04/30(土) 00:56:09 ID:???
凄いこという香具師が居るな。
704nobodyさん:2005/04/30(土) 01:15:44 ID:???
Shift-JISかUTF-8でソース書いてるよ。
文字コードを知った上で使う分には特に問題は起きないよ。

問題が少ないからとりあえずEUC使っとけ。って考えは間違っていると思うのだが。EUCにはあまりメリットを感じないし。
705nobodyさん:2005/04/30(土) 02:10:32 ID:???
おもしろい釣りスレですね
706nobodyさん:2005/04/30(土) 04:29:56 ID:???
GW?
707nobodyさん:2005/04/30(土) 04:40:04 ID:???
>701
perl aaa.cgi > out.txt

俺はCGIとしての形をとっとと整えて、ローカルで鯖立ててテストするけど。
文字コードは何も考えずEUC。間違ってても動けばいいや。
708nobodyさん:2005/04/30(土) 07:18:59 ID:???
テストはShift_JIS。
EUCやUTF-8などでリリースするときは
文字コードに依存する部分を変更してる。

文字コードの変換、
依存部分の変更はスクリプトで自動化。
709nobodyさん:2005/04/30(土) 08:55:13 ID:???
>>701
Winではsjisを使う事が多い。

探せばeuc-jpで動くコマンドシェルはあるだろうけど、printの出力だけなら、
open(STDERR,"|nkf -uEs");
open(STDOUT,"|nkf -uEs");
system(join(' ',@ARGV));
とか
use IPC::Open3;
use threads;
use Encode;
$pid=open3(*I,*O,*E,@ARGV) || die "Can't exec @ARGV";
my $o = threads->create(sub {while(<O>) { Encode::from_to($_,'euc-jp','shiftjis');print STDOUT $_}});
my $e = threads->create(sub {while(<E>) { Encode::from_to($_,'euc-jp','shiftjis');print STDERR $_}});
$o->join;$e->join;
程度の手抜きで間に合わせたらどうかな。
710nobodyさん:2005/04/30(土) 11:47:38 ID:???
TeraPadとかXYZZYや秀丸とかの高機能エディタをインスコして拡張子関連づけを設定
711nobodyさん:2005/04/30(土) 11:59:18 ID:???
>>704
シフトJIS使ってたら、例えば、マッチングで検索の対象となる文字列、
検索する文字列に何がくるか分からない時などは、文字コードを知った上でも
対処のしようが無いと思うのだが。
712702:2005/04/30(土) 12:38:41 ID:???
なんか最近しきりにシフトJISだと正しくマッチできないとか言うヤシが多いよな。

某サイトの表現が悪いのか、読み手の読解力がないのか。。
713nobodyさん:2005/04/30(土) 14:37:28 ID:???
\Q \E でくぉーとすればできる → マッチできる
\Q \E でくぉーとしないとできない → マッチできない

ってだけだろ。くだんねーこと書き込むな。
714nobodyさん:2005/04/30(土) 14:50:58 ID:???
ところで >>701 はコーディングと全然関係ない質問だったと思うのは俺だけか
715nobodyさん:2005/04/30(土) 16:38:52 ID:???
HTMLタグを削除するのって

$html =~ s/<.*?>//g;

だけで良いですよね?
716nobodyさん:2005/04/30(土) 17:44:57 ID:???
番号順にソートしたいのですが、うまくできません。
@a=(1,32,6,14);
という配列があります
これを
1,6,14,32という風な順番にしたいです。
@result=sort @a;
という風にしても
結果は1,14,32,6という文字列の順番になってしまいます。
おねがいしますs

717nobodyさん:2005/04/30(土) 17:50:59 ID:???
>>715
$html = '<<aiueo>kakikukeko>';

>>716
<=>
718nobodyさん:2005/04/30(土) 17:58:07 ID:???
>>716
my @result = sort { $a <=> $b } @a;
719702:2005/04/30(土) 18:37:50 ID:???
>>713
おまいもわかってないのかよ。。
720nobodyさん:2005/04/30(土) 18:40:29 ID:???
無知は書き込むな
721nobodyさん:2005/04/30(土) 18:54:13 ID:???
そこでuse encoding 'shiftjis'ですよ。
722716:2005/04/30(土) 18:59:52 ID:???
>>717 >>718 どうもありがとうございました
723nobodyさん:2005/04/30(土) 19:04:24 ID:???
>>715
$html =~ s/<.*?>//sg;
じゃないかな。タグが1行で書かれてるとも限らないし。
724nobodyさん:2005/04/30(土) 20:14:30 ID:???
725nobodyさん:2005/04/30(土) 22:17:11 ID:???
おまいには>>717がHTMLに見えるのか?
まあ<.*?>だけだダメなケースがあるのも確かだが。
726nobodyさん:2005/04/30(土) 22:20:19 ID:???
input が valid な HTML だと誰か定義したか?
727nobodyさん:2005/04/30(土) 23:02:52 ID:???
あほすぎ。うざすぎ。
728nobodyさん:2005/05/01(日) 01:45:23 ID:???
あれは例がイマイチだな。
<a href="〜" title="いれるなら<ここ>だ!">

Shift-JISで検索や置換するときは、タブとかでぶった切ってから処理するという荒業をやってる。もっとマシな手はあるんだろうけど。
$str =~ s/([\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]|[\x20-\x7e\xa0-\xdf])/$1\t/g;
729nobodyさん:2005/05/01(日) 02:11:46 ID:???
>>728
おいおい、おまえもイマイチだぞ。
HTMLならたとえクオーテーション内でも < とか > は &lt; や &gt; って書かなければいけないことくらい知ってるだろう?
正しいHTMLの例で例外を例示しろよ。
730nobodyさん:2005/05/01(日) 02:22:23 ID:???
コメントやCDATAなら<や>はそのまま使えるな。
これらの場合だけ別に処理すればいいでしょう。
731nobodyさん:2005/05/01(日) 12:27:22 ID:???
んじゃこう?
s/<!--.*?-->//sg;
while (s/<[^<>]*>//g) { }
732715:2005/05/01(日) 15:56:33 ID:??? BE:20201832-#
なんかそういうのまとめたサイトがあったと思うんですが
忘れました・・
733715:2005/05/01(日) 15:57:42 ID:??? BE:188547078-#
すみません>>7
[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
ですね・・
734nobodyさん:2005/05/01(日) 18:53:42 ID:???
>>731
[^<>]の'>'に意味あるか?
735nobodyさん:2005/05/02(月) 02:22:08 ID:???
736nobodyさん:2005/05/02(月) 03:24:44 ID:???
すまん、*の後ろに?を勝手に脳内補完してたようだ。
737nobodyさん:2005/05/02(月) 03:30:04 ID:???
マッチング演算子のmオプションで複数行の検索ができるというので
やってみているのですが、ぜんぜんできません。何がおかしいんでしょうか。

use encoding 'shift-jis', STDIN=>'shift-jis', STDOUT=>'shift-jis';
undef $/;
open(FILE,"test.txt");
$text=<FILE>;
close FILE;
if($text =~ /本来/m) {print "OK!\n";}

perlのバージョンは、v5.8.5 built for cygwin-thread-multi-64intで、
スクリプトおよび対象テキストの文字コード-改行コードは、すべてsjis-dos
です。
738737:2005/05/02(月) 03:34:27 ID:???
>>737の訂正です。

×「複数行の検索」→○「複数行にまたがる文字列の検索」

test.txtは、
----
おかしいな。区切り文字($/)未定義にすれば、本
来できるはずだが。
----
です。
739nobodyさん:2005/05/02(月) 03:38:21 ID:???
mは^$の意味をかえるだけ。
sjisなら本の2バイトめが{になってるようだけど?
740737:2005/05/02(月) 03:44:31 ID:???
>>739
どんな文字でもだめです。そもそもuse encodingしてるから
そこら辺のエスケープはしなくていいものと思われ。
741nobodyさん:2005/05/02(月) 03:52:34 ID:???
念のため、
「本\n来」じゃないよね?
742nobodyさん:2005/05/02(月) 04:03:24 ID:???
>>737
違う、違うよお馬鹿さん。
mオプションってのは、イメージ的に
/^本来/m ≒ /(?:^|\n)本来/
/本来$/m ≒ /本来(?:$|\n)/
ってなるだけであって、そういう使い方じゃない。
743nobodyさん:2005/05/02(月) 07:01:48 ID:???
open(FILE,"<:encoding(shift-jis)", "test.dat") or die $!;
でうまくいった。
744737:2005/05/02(月) 08:14:55 ID:???
>>741-742
ども、mオプション使えね。
undef $/;
open(FILE,"test.txt");
$text=<FILE>;
close FILE;
if($text =~ /本\r\n来/m) {print "OK!\n";}
でOK!ですた。
>>743
encoding関係なく行けた。
745737:2005/05/02(月) 08:16:16 ID:???
間違え、
if($text =~ /本\r\n来/) {print "OK!\n";}
が正解。mオプションなんて関係なかたてことですた。
746nobodyさん:2005/05/02(月) 14:21:32 ID:???
モジュールがインストールされて無い場合のエラー処理はどうやれば良いのでしょうか?

とりあえず、これだとダメでした。
eval { use Image::Magick; };
747nobodyさん:2005/05/02(月) 14:50:30 ID:???
>>746
Test::Moreのuse_okを見るとrequireとimportにわけてevalの中でやってますね。

748746:2005/05/02(月) 15:20:42 ID:???
>>747
thx!
そもそもが間違ってますたorz
749nobodyさん:2005/05/02(月) 21:41:42 ID:???
>>746
> eval { use Image::Magick; };
eval q{ use Image::Magick; };?
750746:2005/05/02(月) 22:35:06 ID:???
>>749
ありがとー。すんなり出来ました。
コンパイル時と実行時の違いの勉強になりますた。
751nobodyさん:2005/05/05(木) 11:35:47 ID:???
疑問になったので質問です。
クラス内の変数をさまざまな表現で表示したい時は
「表示させる関数を用意する」と
「表示させるクラスを用意する」、どちらが一般的なのでしょうか。
もし使い分ける、などならメリットとデメリットも教えて頂きたいです。
PHPもオブジェクト指向も初心者なので的外れな質問だったらごめんなさい。
なお環境はPHP4.3.10 AN http WindowsXPです。
//クラス内に表示させる関数を用意する-----------------
$text = new Text;
echo $text->i();
class Text{
var $a="AAA";
function i(){
return "<i>{$this->a}</i><br>";
}
}
//クラス外に表示させるクラスを用意する-----------------
$text = new Text;
$html = new Html;
echo $html->i();
class Text{
var $a="AAA";
}
class Html{
function i(){
global $text;
return "<i>{$text->a}</i><br>";
}
}
752nobodyさん:2005/05/05(木) 11:36:15 ID:???
↑激しくスレ違いゴメンナサイTT
753nobodyさん:2005/05/05(木) 18:56:12 ID:HQz6o/x3
IDが s/DQN//i にだったら次スレから全レスに回答する
754nobodyさん:2005/05/05(木) 20:41:24 ID:XayIK0rw
test
755nobodyさん:2005/05/07(土) 02:12:00 ID:???
同じファイルを同時に違うファイルハンドルで開くことは可能でしょうか?
(Perl的にやってもいいのでしょうか)

具体的には

open(A, 'test.txt');
〜何らかの処理

open(B, 'test.txt');
〜何らかの処理
close(B);

〜何らかの処理
close(A);

のようなことです。
756nobodyさん:2005/05/07(土) 02:13:47 ID:???
BRL04-aを使ってます。
カウントされないようにBRL04-aで取得したWANがわのIPアドレスを取得したいのですが、どうすればよいですか?
とりあえず、DNSで正引きしてみたけどダメでした。
CGIで使うのでPerlで作りたいのです。
757nobodyさん:2005/05/07(土) 02:38:42 ID:???
>>755
全部が読み取りなら可能。そういうことをやるべきかどうかは知らんが。

>>756
ルータの取得したWAN側アドレスはルータに聞くしかない。
SNMPでMIBを叩くのが筋だとは思うが、BRL-04はSNMPをサポートしてないよな。
BRL-04の設定画面をLWPで叩いてHTMLの中からWAN側アドレス表示のとこだけを抜き出す、
というのがたぶん現実的だろう。
758nobodyさん:2005/05/07(土) 03:21:03 ID:???
ファイルハンドルAがマンドクセに見えた
('A`)
759nobodyさん:2005/05/07(土) 15:07:18 ID:???
ここでいいのか判りませんが、、質問です。
習作でサーバーに保存した一次ファイルを偽セッションとして使い、
perlだけでの認証制の掲示板を作ろうとしています。
とりあえずパッケージsession.plはできたんですが、ここで疑問が…

htmlのmetaヘッダで$permission = "<meta name='robots' content='noindex'>\n";の指定は出来るようにしてあるんですが、
これだけでログの外部流出は防げるんでしょうか?
もちろん普通に見た場合はsession見てイレギュラーなアクセスは弾くようにするつもりですが、
googleなどのキャッシュに引っかからないかどうかがわからないんです。
760nobodyさん:2005/05/07(土) 15:24:38 ID:???
防げるわけないだろ
一次ファイル(ってなんだか知らんが)そのものを見られなくしよう
761nobodyさん:2005/05/07(土) 15:45:32 ID:???
すみません、誤字です。
一時ファイルです。
当然ログファイル等はサーバーの権限設定で見られなくするつもりですが、、
そうではなくてログを暗号化するとか、そういう話でしょうか?
762nobodyさん:2005/05/07(土) 15:58:59 ID:???
>>760
うぅすみません、いまいち意味がわからないです。
例えば.htaccessで弾いた場合、googleのキャッシュには絶対に引っかからないんでしょうか。
763nobodyさん:2005/05/07(土) 16:03:27 ID:???
質問です。
ハッシュの中身を別ファイルから読み込ませる方法ってありますか?

例えば

addr.txtの中に、以下の3行だけがあったものとして
aaa,[email protected]
bbb,[email protected]
ccc,[email protected]
(カンマ区切り)

これを
addr.cgiの中で

%addr_list = (
'aaa' => '[email protected]',
'bbb' => '[email protected]',
'ccc' => '[email protected]',
);

っていうふうに。@が入るのでシングルクォーテーションで括りたいです。
764nobodyさん:2005/05/07(土) 16:08:06 ID:???
ベタベタにやるとこう?

my @tmp;
while (<FILE>) {
@tmp = split ',', $_;
$addr_list{$tmp[0]} = $tmp[1];
}
765nobodyさん:2005/05/07(土) 16:20:31 ID:???
>>762
そうなるね
httpdから直接アクセスできないところに置くか、.htaccessでガード
766nobodyさん:2005/05/07(土) 16:39:07 ID:???
>>765
ありがとうございます。
ログではなく、表示するページ(データから動的に生成&偽セッションでアクセス制限)でも
同じ事なのでしょうか。
767763:2005/05/07(土) 16:41:59 ID:???
>>764
ありがとー!!
できました。
768nobodyさん:2005/05/07(土) 17:09:19 ID:4STWB1ko
http://218.231.193.158.eo.eaccess.ne.jp/
wwwwwwwwwwwwおkwwwおkwwwっっっうぇ
っうぇっうぇっうぇwwwwwwwwwうぇwww
おkwwwっうぇうぇwwwうぇwwwwwwっうぇ
769nobodyさん:2005/05/07(土) 17:17:52 ID:???
>>766
未認証だとアクセスできないページはロボットもアクセスできない。
770nobodyさん:2005/05/07(土) 18:07:53 ID:???
>>766
ありがとうございます!
771nobodyさん:2005/05/07(土) 19:14:45 ID:???
>>770
質問に御礼をする不思議ちゃんか?
772nobodyさん:2005/05/08(日) 02:25:33 ID:EhQFLRWQ
最近勉強始めたばかりです。
perlには多次元配列ってありますか?ないのなら代わりになるものってありますか?
773nobodyさん:2005/05/08(日) 02:27:51 ID:???
774nobodyさん:2005/05/08(日) 02:40:55 ID:???
多次元配列あったのか…
俺いっつも↓みたいな感じでやってた

@a = (0,1,2,3,4,5);
@b = (0,1,2,3,4,5);
@c = (0,1,2,3,4,5);
@d = (\@a,\@b,\@c);
foreach(@d){
 foreach $e (@$_){
  print "$e<br>";
 }
}
775nobodyさん:2005/05/08(日) 03:10:27 ID:???
それ、@d が既に多次元配列になってんじゃん。
776nobodyさん:2005/05/08(日) 03:43:11 ID:???
('A`)
777うんこ:2005/05/08(日) 04:23:54 ID:???
my $d;

$d->[0] = [ qw/1 2 3 4 5 6/ ];
$d->[1] = [ qw/1 2 3 4 5 6/ ];
$d->[5] = [ qw/1 2 3 4 5 6/ ];

$" = ', ';

for my $arr_ref (@$d){
print ref $arr_ref || 'undef';
print " [ @$arr_ref ]\n"
}
778nobodyさん:2005/05/08(日) 06:47:54 ID:???
>>763-764
my @tmpはwhile内に書くべきだな。
あと俺的別解。

while (<FILE>) {
 /^(.*?),(.*)$/;
 $addr_list{$1} = $2;
}
779nobodyさん:2005/05/08(日) 06:48:59 ID:???
スマン書き忘れた。
>>764はchompが抜けてる。
780nobodyさん:2005/05/08(日) 19:50:28 ID:WVJV6mZK
ARGVって小文字で書くとダメなの?
781nobodyさん:2005/05/08(日) 20:07:46 ID:???
>>780
Perl言語(および糞Ms以外)が大文字と小文字を区別してるってことくらい知らないの。
782nobodyさん:2005/05/08(日) 20:22:24 ID:???
>>781
糞林檎会社のHFS+もファイルネームの大文字小文字を区別しないな。
783nobodyさん:2005/05/08(日) 20:29:12 ID:uPGwNCs6
http://YahooBB221029171031.bbtec.net/
うぇwwwうぇwwwうぇwwwっうぇおkwwwおkwww
っうぇwww
うはっwwwうぇwwwwww
うぇwwwっうぇwwwwwwwwwwwwっwwwwwwwwwwww
784nobodyさん:2005/05/08(日) 20:43:54 ID:tDynd5YA
http://YahooBB220013144086.bbtec.net/
wwwwwwwwwwwwwおkwwwっうぇ

wwwwww
うぇwwwっうぇうはっwwwうはっwww
www

おkwwwうぇwwwうはっwwwwwwwww
785nobodyさん:2005/05/08(日) 20:57:01 ID:???
>>778
そこら辺がいまいちよくわかってないんです。。
例えば関数で

sub hogege {
 my @arr_return;
 push @arr_return, 'hoge';
 return \@arr_return;
}

$ref = &hogege();
print $$ref[0];

ってやって、関数の外でリファレンス参照して使えると思うんですが、
コレってつまり、myで作ったアドレスが裏で確保し続けられてるって事ですよね?
なので

foreach (@a) { my$aa; $a=1; }
↑とかやっちゃうと、回った数だけmyでアドレスを確保されちゃうような気がして

my $aa;
foreach (@a) { $a=1; }
delete $aa;
↑こういう風にしてるんですが。。

ここら辺って、どうなんでしょう?
786nobodyさん:2005/05/08(日) 21:44:48 ID:???
>>785
本題とは関係ないんですが、 delete って何?
787nobodyさん:2005/05/08(日) 21:51:31 ID:???
>>781
知りませんでした
ありがとうございます
788nobodyさん:2005/05/08(日) 21:58:32 ID:???
>>786
delete EXPR

 指定されたハッシュの、指定されたキーと対応する値を削除します。
 %ENVの要素を削除すると環境変数が削除されます。

です。間違えました。undefでした(汗
789nobodyさん:2005/05/08(日) 22:48:22 ID:???
>>785
for($i=0;$i<16;++$i) {
my $a;
print \$a,"\n";
}
どうなった?
790nobodyさん:2005/05/08(日) 23:09:13 ID:???
>>785
ラクダ本とかだとその辺 (変数が消滅するタイミング) がきちんと解説されていたと記憶

そういや昔、循環参照するデータ構造を FastCGI で動かして
メモリが洩れまくって焦ったことがあったよ
791nobodyさん:2005/05/08(日) 23:28:04 ID:???
perl で DBI で MySQL を使おうと思ってるんだけど、
データの保存先ディレクトリを変えること (たとえば実行スクリプトのあるとこにする) ってできるのかな?
やり方知ってる人いたら、説明書いてる URL でもいいから教えて… orz
792nobodyさん:2005/05/08(日) 23:34:26 ID:???
>>789
全部同じ所を参照しておりました…何故だーw
ありがとうございます。

>>790
ラクダ本…今度立ち読みしてみます。。

一応以下本文及び実行結果です。。

(1) for($i=0;$i<3;++$i) { my $a; print \$a."<br>"; }
→ SCALAR(0xcf7a4), CALAR(0xcf7a4), SCALAR(0xcf7a4)

(2) for($i=0;$i<3;++$i) { print &asd(rand(time))."<br>"; }
→ SCALAR(0xf7178), SCALAR(0xf7340), SCALAR(0xf7178)

(3) for($i=0;$i<3;++$i) { my $a = &asd(rand(time)); print "$a<br>"; }
→ SCALAR(0xf7340), SCALAR(0xf7178), SCALAR(0xc6a98)

sub asd { my ($a) = @_; return \$a; }
793nobodyさん:2005/05/09(月) 00:39:00 ID:???
>>791
それは Perl のコーディングやら DBI ではどうにもならん話で
たぶん MySQL スレあたりに行って聞いた方が良い

「シンボリックリンクで解決しる」とかいうことになるんじゃないかという気はする
794nobodyさん:2005/05/09(月) 00:50:11 ID:???
ムリなのか… (´д`)
シンボリックリンクだと意味ないなあw

ありがd! 早いけど諦めてみる… orz

…あ、自分トコにデータファイルを作るデータベースの、とかはあるのかな?
795nobodyさん:2005/05/09(月) 01:09:17 ID:???
ここはコーディングスレです。
796nobodyさん:2005/05/09(月) 01:57:09 ID:???
またまた古くさいことを…
797nobodyさん:2005/05/09(月) 02:36:28 ID:???
>>792
その程度の話はリャマ本でいい。リャマ本は必読。
798nobodyさん:2005/05/09(月) 03:11:27 ID:???
そんなこと言ってたら、大抵のことは 「本読め」 「ぐぐれ」 「過去スレ読め」 で終わりそうな・・・。
799nobodyさん:2005/05/09(月) 03:55:27 ID:???
人工知能型検索が完成したら、威張って教える人が絶滅しまつ(^^)
800nobodyさん:2005/05/09(月) 03:57:44 ID:???
sqliteなんかいい感かと
801nobodyさん:2005/05/09(月) 14:20:56 ID:???
perlで掲示板を作っています。
タブ無効、改行有効です。

--------
 foreach (@$ref) {
  #デミリタは<>、元々の<>はエスケープ処理
  foreach (@$_) {
   $_ =~ s/¥<¥>/¥¥<¥¥>/g;
  }
  my $tmp = (join '<>', @$_);

  #改行はタブに変換、元々のタブは無効(半角空白)にする
  $tmp =~ s/\t/ /g;
  $tmp =~ s/\r\n|\n/\t/g;
  push @arr, $tmp;
 }
--------

デミリタは<>、改行は\tに置き換えという仕様で、
タブ以外は基本的に入力通りのデータが出力されるようにしました。

ただし一点だけ、元々のデータが\<\>の場合のみ<>に変換されてしまいます。
これをうまく回避する方法ってないでしょうか。。
802801:2005/05/09(月) 14:30:37 ID:???
すみません自己解決しました。
$_ =~ s/\<\>/<>/g;
803801:2005/05/09(月) 14:31:22 ID:???
うう。。
$_ =~ s/\<\>/&lt;&gt;/g;
804nobodyさん:2005/05/10(火) 19:42:37 ID:xKdeSYjs
どなたかお願い致します。
AサーバーにあるファイルをBサーバーへFTPを使用して
送りたいのですがこのような事は可能でしょうか?
805nobodyさん:2005/05/10(火) 19:43:20 ID:???
↑すいません。もちろんperlを使用してです。
806nobodyさん:2005/05/10(火) 19:50:44 ID:???
Net::FTP
807nobodyさん:2005/05/10(火) 20:05:04 ID:???
808nobodyさん:2005/05/10(火) 20:05:45 ID:???
809nobodyさん:2005/05/10(火) 21:12:25 ID:???
>>806
>>808
おぉ、ありがとう御座います。そのものずばりがあるとは・・・
早速試して見ます。
810nobodyさん:2005/05/10(火) 21:32:47 ID:???
Shift-jisで文字列を正しくマッチさせるにはどうすればよいですか?
/sage表示テスト/
↑これは正しくないというのは調べて分かりましたが、具体的にどうするのか分かりませんでした。
811nobodyさん:2005/05/10(火) 21:56:56 ID:???
>>8
812nobodyさん:2005/05/10(火) 23:34:43 ID:???
eucなら
ttp://www.din.or.jp/~ohzaki/perl.htm#JP_Match
だけど…sjisは無理なんでは…?
813nobodyさん:2005/05/10(火) 23:36:42 ID:???
>>810 なら /\Qsage表示テスト\E/ で充分
814nobodyさん:2005/05/11(水) 08:58:09 ID:???
~ohzakiでSJISでも応用できるとあるよ。

$pattern = quotemeta($pattern);
if ($str =~ /^(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])*?(?:$pattern)/) {
print "マッチした\n";
}

SJISならquotemetaの一手間入れれば無問題。
815nobodyさん:2005/05/11(水) 11:32:03 ID:???
てゆーか、Perl 5.8 使えよ...
816nobodyさん:2005/05/11(水) 12:42:00 ID:???
客が運用中のシステムなんじゃないの?
817nobodyさん:2005/05/11(水) 16:11:40 ID:???
5.0006 と 5.8 の互換性ってどんな感じですか?
818nobodyさん:2005/05/11(水) 18:01:37 ID:???
819nobodyさん:2005/05/11(水) 20:29:01 ID:???
ありがと。5.0 と 5.6 の比較もしないとな。
820nobodyさん:2005/05/12(木) 00:56:52 ID:???
my @list=grep($_->{name} eq $hash->{name},@DATA);
これが書いてある行で
Modification of a read-only value attempted
のエラーが出てしまいます
定数値の変更をしようとしているように見えないのですがどういうことなんでしょう?

@DATAは
undef @DATA;
open(IN,GetFilePath("file")) or return;#GetFilePathはファイルパスを返す
my @data=<IN>;
close(IN);
@hashnamelist=qw(no date name);
foreach my $count(0..$#data){
chop $data[$count];
my @buf=split(/,/,$data[$count]); my $i=0;
foreach (@hashnamelist) { $DATA[$count]->{$_}=$buf[$i];$i++;}
}
というような感じでファイルから読んだデータを入れています
821nobodyさん:2005/05/12(木) 01:30:40 ID:???
あれ?
いきなり $DATA[$count]->{$_} ←こんなことやっていいっけ?
$DATA[$count] がちゃんとハッシュリファレンスになる?
822nobodyさん:2005/05/12(木) 02:27:49 ID:???
823nobodyさん:2005/05/12(木) 02:32:51 ID:???
grepって
@一致した行 = grep(/正規表現/, @検索対象);
じゃないの?
824nobodyさん:2005/05/12(木) 03:02:54 ID:???
grep(評価式, 配列) だよ。
825nobodyさん:2005/05/12(木) 08:39:16 ID:???
> $DATA[$count]->...
そもそもここは何をしたいんだ?
826nobodyさん:2005/05/12(木) 10:38:53 ID:???
$_は@DATAの各要素のaliasだからread-onlyではないと思うので、
むしろ$hashがあやしいような気がする。


827nobodyさん:2005/05/12(木) 12:31:48 ID:???
同じ結果になるであろう別の記述を試してみたら?
my @list;
{
 local $_;
 my @temp;
 foreach $_ (@DATA) {
  if($_->{name} eq $hash->{name}) {
   push @temp,$_;
  }
 }
 @list = @temp;
}
とか。
828nobodyさん:2005/05/12(木) 13:33:43 ID:???
俺も>>826と同じく$hashが怪しい気がするが、値を変化させる式があるわけでもないしread-onlyは関係ない気もする。
>>821と同じような動作をするだろうものを書いてみたが、普通に動いたぞ。

my $hash = { Name => 'nobodyさん' };
my @list;
{
my @DATA;
my @data = <DATA>;
my @hashnamelist = qw(No Date Name);
foreach my $count (0..$#data){
chomp $data[$count];
my @buf = split /,/, $data[$count];
%{$DATA[$count]} = map { $hashnamelist[$_] => $buf[$_] } 0..$#buf;
}
@list = grep $_->{Name} eq $hash->{Name}, @DATA;
}
foreach (@list) { print $_->{No}, " " }

__DATA__
820,2005-05-12,nobodyさん
123,2005-01-23,名無しさん
821,2005-05-12,nobodyさん
829nobodyさん:2005/05/12(木) 13:36:27 ID:???
全角スペース入れたつもりだったんだが…どうやら半角だったようだ。
あと10行目の 0..$buf は 0..$#hashnamelist の間違い。
830nobodyさん:2005/05/12(木) 14:02:54 ID:???
>>828
>値を変化させる式があるわけでもないしread-onlyは関係ない気もする。

$hashの値がハッシュのリファレンスでなければ「$hash->{name}」を
参照しただけで新しい無名ハッシュが作られてそのリファレンスが
$hashに代入されます。

my $hash;
print "1:$hash\n";
my $x = $hash->{name};
print "2:$hash\n";
831nobodyさん:2005/05/12(木) 14:22:14 ID:???
もともとの質問からズレてしまってスマソなのだけど

$hash = 1;
$hash->{name} = 10;
print "1: " . $hash . "\n";
print "2: " . $hash->{name} . "\n";
$hash++;
print "3: " . $hash . "\n";
print "4: " . $hash->{name} . "\n";

を実行した結果が

1: 1
2: 10
3: 2
4:

となる原理をいまいちよく理解できてない俺ガイル
832nobodyさん:2005/05/12(木) 15:24:33 ID:???
>>831
$hashの値がundefなら値の参照による暗黙の生成のときに無名ハッシュが
できてそのハードリファレンスが$hashに入るが、この場合は既にスカラー値が
入っているのでその辺は関係なくて、ただのシンボリックリファレンス。

すなわち、$hash = 1のときに

$hash->{name} = 10;

とするとそれは%{1}というハッシュ変数をいじっていることになる。
矢印演算子が出来る前の書き方

${$hash}{name} = 10;

と同じ。


従って、上の4つのprintが表示しているものは、

1: $hashの値'1'
2: ${1}{name}の値'10'
3: $hashの値'2'
4: ${2}{name}の値(入ってないので空文字列'')

833nobodyさん:2005/05/12(木) 19:54:59 ID:1WfKcKYp
お気に入りのサイトの掲示板のスクリプトがどーしても見たいんですが、そのスクリプトが生成するページではなく、スクリプトそのものをブラウザから覗くにはどうすればいいのでしょうか?
834nobodyさん:2005/05/12(木) 20:35:55 ID:???
>>833
まずは>>1読んでから質問してね。
835833:2005/05/12(木) 21:02:30 ID:???
>>834
助言サンクス。

1: 自分はこういう事がしたい。
→お気に入りのサイトの掲示板のスクリプトがどーしても見たい

2: それでこんな風にやってみたが・・・
→URLの上で右クリックして「対象をファイルに保存」ってやってみた

3: こんなエラーが出て上手く行かなかった。
→そのスクリプトが生成するページがダウンロードされるだけで、肝心のスクリプトは見れなかった

スクリプトもHTMLと同じテキストファイルなので、ブラウザから見る方法があるに違いないと思って質問してみました。
Perlの勉強には、好きなサイトのスクリプトのまねをするのが一番だと思って。
836833:2005/05/12(木) 21:05:05 ID:???
あ、すれ違いってことか、よそへ逝ってきます・・・orz
よそのスレで見かけてもマルチって怒らないでくださいね。
837nobodyさん:2005/05/12(木) 21:08:48 ID:???
見たいページの画面が切り替わる瞬間に、
PC本体を少し斜めに傾けるとうまくいく事があるよ。
838nobodyさん:2005/05/12(木) 22:54:49 ID:???
Perlでユーザ名の登録をするのですが、
入力された文字列から、記号や日本語を削除して
アルファベットと数字のみに変換する方法を教えてください。
[a-zA-Z0-9]をなんとかすればいいのかなと思うのですが・・・。
839nobodyさん:2005/05/12(木) 23:27:37 ID:???
>>838
tr/0-9A-Za-z//cd;
840nobodyさん:2005/05/12(木) 23:44:44 ID:???
>>839
すみません。それでは日本語が化けてしまいます。
 [1い2-45ab,D*Eあ]->[1BB245abDEBB]
本当は[1245abde]になってほしいんです
841nobodyさん:2005/05/12(木) 23:54:13 ID:???
>>840
君は SJIS 使いだな?
842nobodyさん:2005/05/12(木) 23:57:36 ID:???
>>841
君は神だな?
なぜ分かるんだー
843nobodyさん:2005/05/13(金) 01:03:10 ID:???
>>840
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
http://www.din.or.jp/~ohzaki/perl.htm#Character

君の書いてる例だと更に tr/A-Z/a-z/ が必要そうだが。
844843:2005/05/13(金) 01:07:10 ID:???
もしくは

#!/usr/local/bin/perl -w
use strict;
use encoding 'shiftjis';
my $str = '1い2-45ab,D*Eあ';
$str =~ tr/0-9A-Za-z//cd;
$str =~ tr/A-Z/a-z/;
print $str;
__END__
845nobodyさん:2005/05/13(金) 01:33:06 ID:???
もー。EUCかUTF8にしろ。
846nobodyさん:2005/05/13(金) 02:11:13 ID:???
Perl5.8からuse encodingでSJISが扱えるようになったらしいですが
use encoding 'shiftjis';
これを入れるだけでOKですか?他に何かいりますか?
847nobodyさん:2005/05/13(金) 02:11:40 ID:???
SJISかいな。あいよ。
$str =~ s/[\x81-\x9F\xE0-\xFC].|[^0-9A-Za-z]//g;
848nobodyさん:2005/05/13(金) 02:18:33 ID:???
もー。EUCかUTF8にしろ。
849nobodyさん:2005/05/13(金) 04:30:51 ID:???
関係ないけどUTF8って処理重くない?
850nobodyさん:2005/05/13(金) 09:04:10 ID:???
>>849
処理は重くないがデータ量は多い。メモリの少ないマシンだと重くなることもあるかもな。
851nobodyさん:2005/05/13(金) 15:35:11 ID:oLTDJ3fd
すいません。質問があります。
----------------config.pl
package config;
my $DATA_DIR="hoge";
1;
----------------
とある時
「test.cgi」で上記ファイルを利用したいのですが
----------------
require 'config.pl';

my $writedir=&config::DATA_DIR;

----------------
としても
Undefined subroutine &config::DATA_DIR called at test.cgi line 9.
とエラーが出てしまいます。

どの様に表記するのが良いのでしょうか?
不躾で申し訳ございませんが
お教え頂けますとありがたいです。
852nobodyさん:2005/05/13(金) 15:46:54 ID:???
my $writedir=$config::DATA_DIR;
853851:2005/05/13(金) 16:00:36 ID:???
>>852さん
RESありがとうございます。

私何か勘違いしていました、、
>&config::DATA_DIR
って関数呼ぶときに使うやつじゃん、、、

どうも ありがとうございます。
854nobodyさん:2005/05/13(金) 16:35:07 ID:???
他に見せるつもりの変数をmyにしてるのは誰も突っ込まないのか?(笑)
855nobodyさん:2005/05/13(金) 18:24:20 ID:???
>>850 なるほどthx
856nobodyさん:2005/05/14(土) 10:32:29 ID:???
>>838>>840
漢字コードはシフトJISということで

my $input_string = '1い2-45ab,D*Eあ';

(my $output_string = join '',
grep{
/^[^\x81-\x9F\xE0-\xFC]/
} $input_string =~ /(
(?:
[\x81-\x9F\xE0-\xFC]
[\x40-\x7E\x80-\xFC]
)+
|
[^\x81-\x9F\xE0-\xFC]+
)/gx
) =~ s/[^\da-zA-Z]//g;

$output_string =~ tr/A-Z/a-z/;

print "$output_string\n";
857nobodyさん:2005/05/14(土) 10:38:34 ID:???
>>856をもうちょい短く

my $input_string = '1い2-45ab,D*Eあ';

(my $output_string = lc join '',
grep{
/^[^\x81-\x9F\xE0-\xFC]/
} $input_string =~ /(
(?:
[\x81-\x9F\xE0-\xFC]
[\x40-\x7E\x80-\xFC]
)+
|
[^\x81-\x9F\xE0-\xFC]+
)/gx
) =~ s/[^\da-zA-Z]//g;

print "$output_string\n";
858nobodyさん:2005/05/14(土) 11:06:06 ID:???
>>856-857
grepはいらないだろ。

my $input_string = '1い2-45ab,D*Eあ';

(my $output_string = lc join '', $input_string =~ /
(?: [\x81-\x9F\xE0-\xFC] [\x40-\x7E\x80-\xFC] )+
| ( [^\x81-\x9F\xE0-\xFC]+ )
/gx) =~ tr/[0-9a-z]//cd;

print "$output_string\n";
859nobodyさん:2005/05/14(土) 12:37:57 ID:??? BE:118591373-###
>>858
tr/[0-9a-z]//cd これはまずいよ。文字に [ や ] があれば入り込んでしまう。


print lc join('', $input_string=~/[\x81-\x9F\xE0-\xFC].|([a-zA-Z\d])/g),"\n"
860nobodyさん:2005/05/14(土) 13:19:43 ID:???
use Jcode;
my $str = '1い2-45ab,D*E';
($str = new Jcode($str)->euc) =~ tr/1-9A-Za-z//dc;
print $str;
861nobodyさん:2005/05/16(月) 00:56:01 ID:???
プログラムの質問とはちょっとずれてしまうのですが
投票のCGIを作りたいのですが、重複を防ぐにはどうしたらいいんでしょうか?
IPをチェックしても固定でなければ接続し直せば変わるし
クッキーも消せばまた投票できてしまいますよね?

完全に重複を防ぐというのは無理ですか?
862nobodyさん:2005/05/16(月) 01:09:10 ID:???
>>861
完全には無理。
863nobodyさん:2005/05/16(月) 09:58:04 ID:???
>>861
メールでパスワード発行てのはよくある手だね。
864nobodyさん:2005/05/16(月) 16:13:22 ID:???
メールでも同じ事やん
865nobodyさん:2005/05/16(月) 16:16:16 ID:???
そやったねぇ。用途が違ってた罠。スマソ。
866nobodyさん:2005/05/17(火) 18:42:49 ID:???
大変申し訳ございません。 質問があります。
----------------
my %TEST_HASH = (
'test' => 'jya'
);
foreach $key (keys %TEST_HASH){
print "$key<br>";
}
----------------
ではちゃんと表示されたのですが

----------------[config.pl]
package config;
my %TEST_HASH = (
'test' => 'jya'
);
1;
----------------

----------------
require 'config.pl';

foreach $key (keys %config::TEST_HASH){
print "$key<br>";
}
----------------
とすると表示されません。

表記方法が悪いのでしょうか?
ご助力いただけますと幸いです。
867nobodyさん:2005/05/17(火) 18:57:56 ID:???
my のスコープが問題かと。
868nobodyさん:2005/05/17(火) 19:11:47 ID:???
もはや my は機械的につけるだけかと
869866 :2005/05/17(火) 19:22:40 ID:???
うっ、、、
ありがとうございます。
myを消したらうまく表示できました。

本当にどうもありがとうございます。
870nobodyさん:2005/05/17(火) 23:02:44 ID:hBcfSLHc
エラーを表示するのは、dieでやるか、subルーチンで&error("○○がおかしい")って表示させるかどっちがモテますか?
871nobodyさん:2005/05/17(火) 23:52:44 ID:???
エラーの種類による。
872nobodyさん:2005/05/18(水) 00:14:10 ID:tzJs81c1
>>871
と、いいますと?
873nobodyさん:2005/05/18(水) 00:27:27 ID:???
そこで終わっちゃまずいときとか
874nobodyさん:2005/05/18(水) 00:33:14 ID:???
sub呼び出しに&使う奴は糞。
875nobodyさん:2005/05/18(水) 01:11:07 ID:tzJs81c1

初心者の僕には彼>>874の言っていることが全く理解できません
876nobodyさん:2005/05/18(水) 02:17:09 ID:???
今どきの初心者で sub 呼び出しに & 使おうと発想する香具師ってのは、
一体何を読んで Perl を勉強してるの?
877nobodyさん:2005/05/18(水) 03:07:06 ID:???
#!/usr/bin/perl
$_=$ENV{QUERY_STRING};s/\+/ /g;s/%([\da-fA-F]{2})/chr hex$1/eg;eval;

このプログラムはどんなことがでるのでしょう?
とりあえず実行してみたら500エラーがでてしまいました。
878nobodyさん:2005/05/18(水) 03:17:20 ID:3k0gZS+p
>>876
KENT。。
879nobodyさん:2005/05/18(水) 05:02:33 ID:???
なんで サブルーチンの呼び出しに & 使っちゃまずいのですか?
どっちでもいいならつけた方がわかりやすいと思うのですが・・・
880nobodyさん:2005/05/18(水) 05:05:14 ID:???
>>877
ちょっとオモロカッタ
881nobodyさん:2005/05/18(水) 05:54:30 ID:???
>>879
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsub.html

別に使っちゃまずいわけではないが、& の有無で生じる細かい
挙動の差を理解しているなら、多くの場合 & 無しの挙動の方が
より「望ましい」という結論に達しないか?

Perl を matt's や KENT で覚えたから付いてる方がしっくりくる
という理由だけで & を付け続けている子は、さっさと Perl4 の
呪縛から抜け出してほしいな。
882nobodyさん:2005/05/18(水) 09:57:10 ID:???
>>881
知らなかった…
メモリの節約ってことになるんでしょうか?
883nobodyさん:2005/05/18(水) 10:37:57 ID:???
常に戻り値と引数を明示するような書き方をしてりゃ

($a,$b,$c) = &sub($x,$y,$z);

より

($a,$b,$c) = sub($x,$y,$z);

のほうがいいってこと?
でもKENTと「すぐわかるPerl」で学んだからなぁ・・・
なかなかクセが抜けねぇ。
884nobodyさん:2005/05/18(水) 11:20:28 ID:???
関数のやってることをわかってない人は&をつけないほうがいいだけのこと。

初めから完璧なプログラム組める人はいないし、Perlは比較的安全なつくりに
なってるから&つけるつけないにこだわる人は向いてないと思う。
885nobodyさん:2005/05/18(水) 11:50:46 ID:???
&派の逆襲です。
886nobodyさん:2005/05/18(水) 12:16:54 ID:???
結局たいして変わらないでFAなの?
887nobodyさん:2005/05/18(水) 12:40:03 ID:???
&があると質問があって掲示板に書き込むとき注意しなきゃいけないからつけないとかでいいよ。
888nobodyさん:2005/05/18(水) 12:49:24 ID:???
カッコ無しで引数省略したつもりが @_ のせいで意図しない挙動になったり、
プロトタイプが効かなかったり、と、何度も痛い目に遭ったことがあるので、
& 付けるの止めました。
889nobodyさん:2005/05/18(水) 16:16:41 ID:???
なるほど。。今まで分かりやすいとか思って付けてたorz
これからやめよ。
890nobodyさん:2005/05/18(水) 16:33:35 ID:???
すいません。質問があります。

文字列
AAA/BBB/CCC

AAA/BBB/
に。
文字列
DD/EEEEEE/FF

DD/EEEEEE/
にするような良い方法はないのでしょうか?

indexで'/'の場所を2回計測しないとやはり駄目でしょうか?
891nobodyさん:2005/05/18(水) 16:38:26 ID:???
>>890
何したいのかわからんけど
$str =~ s/[^\/]+$//;
892nobodyさん:2005/05/18(水) 16:49:05 ID:???
>>890
んー、前ベンチとったときがあるけど、

my $dir = 'aaa/bbb/ccc';
1: $dir =~ s/[^\/]*$//;
2: $dir = substr ($dir, 0 , rindex ($dir, '/') + 1);
3: substr ($dir, rindex ($dir, '/') + 1) = '';

try 100,000
1: 0.98 [s]
2: 0.47 [s]
3: 0.86 [s]

ってことで 2 が早いかも
893890:2005/05/18(水) 16:53:44 ID:???
RESありがとうございます。
rindexというのがあったのですね、、、

解決しました。どうもです。
894nobodyさん:2005/05/18(水) 20:12:52 ID:l3LfkbbV
1: 自分はこういう事がしたい。
別々のdatファイルに入ってる変数の$aと$b
この2つに同じ数字が代入されているかどうかを確認したい。

2: それでこんな風にやってみたが・・・

if ($a == $b) {
print "true\n";
}
else {
print "false\n";
}

3: こんなエラーが出て上手く行かなかった。
$aと$bに同じ数字が入っていても、スルーされて、すぐelseの方に入ってしまいます。
同じdatファイルにある変数同士ならスルーされないんですが
別々のdatファイルに格納されてる物を確認するにはどうしたら良いでしょうか。
895894:2005/05/18(水) 20:37:04 ID:???
すみません、自己解決しました!
if (!($a == $b)) {
としたらできました。
でも、これってどうしてなんでしょうか…???
if ($a != $b) {
これだと、できなかったんですが…??
896nobodyさん:2005/05/18(水) 21:22:59 ID:???
>>894
改行コードは?
897894:2005/05/18(水) 21:47:19 ID:???
>896
CR+LFです。
つか、できたと思ったんですが勘違いでした…(;´Д`)やはりスルーされました
898nobodyさん:2005/05/18(水) 21:59:10 ID:???
if (int($a) == int($b)) {

もしくは

if ($a eq $b) {

じゃだめ?
899nobodyさん:2005/05/18(水) 22:02:44 ID:1rjH09kt
サブルーチンやモジュールへの引数の引渡しで
受け取り側で
sub aaa
{
my $bbb = shift;
my @ccc = shift;
#以下処理
}

見たいな感じで受け取り側でスカラーとアレイを受け取れますか?
なんかうまくいかないのです。
配列を受け取ろうとすると。。
900nobodyさん:2005/05/18(水) 22:11:11 ID:???
>>899
きみ、shift が何をする関数か知らず、ただ引数を受け取るためのおまじないだと思ってるぢゃろ

my ($bbb,@ccc) = @_ とすれば受け取れるけど、なぜそれで受け取れるのか、
なぜ shift ではダメなのか、自分で調べてみそ
901nobodyさん:2005/05/18(水) 22:37:10 ID:???
aaa("skipper",\@skipper);

sub aaa{
my $who = shift;
my $items = shift;
以下略・・・
}
902894:2005/05/18(水) 22:52:46 ID:???
>898
ネ申
ありがとうございました……マジで
903nobodyさん:2005/05/19(木) 11:30:49 ID:???
>>897
>>896が言いたいことは変数に改行コードがくっついたままじゃないかって事だと思う
$a = chomp($a);
$b = chomp($b);
904nobodyさん:2005/05/19(木) 11:32:49 ID:???
Perlは代入しなくて良かったんだっけ
chomp($a);
だけでおk
905nobodyさん:2005/05/19(木) 14:11:39 ID:???
perlで音を出すモジュールなんかある?windowsなんだけど。
予定時間設定しといて、アラーム音出したいんだけど。
906nobodyさん:2005/05/19(木) 14:26:36 ID:???
\aじゃだめか?
907nobodyさん:2005/05/19(木) 15:01:14 ID:???
Win32::Sound とかか
908nobodyさん:2005/05/19(木) 15:38:09 ID:???
あう、、、
cgiとかの引数ってどうやって取得するのでしょうか?
(hoge.cgi?day=20050519)
          ↑ここを取得したい。

基本的なことで申し訳ございませんが
手元の本には載っていないので
お教えいただけないでしょうか?

909nobodyさん:2005/05/19(木) 15:52:58 ID:???
このコードでC/C++言語のコメント /* 〜 */ が消えないのはなぜですか?

$data = <<EOF;
/*++
comment
--*/
int i = 0;
EOF
$data =~ s{/\*.*?\*/}{}gm;
print "$data\n";
910nobodyさん:2005/05/19(木) 16:13:37 ID:???
>>908
CGI.pm やら cgi-lib.plでググれ

>>909
mじゃなくgオプション
911nobodyさん:2005/05/19(木) 16:14:11 ID:???
間違えた。mじゃなくs
912nobodyさん:2005/05/19(木) 17:46:17 ID:???
>>908 >手元の本
マジかよ。 KENTですら書いてるぞ? そんな本捨てた方g(ry
913908:2005/05/19(木) 18:29:29 ID:???
まじです、、、
えーっと
use CGI;
my $cgi = new CGI;
my $day = $cgi->param('day');
で出来ました。ありがとうございます。
914nobodyさん:2005/05/19(木) 19:29:40 ID:???
自分でやれ自分で!
915nobodyさん:2005/05/19(木) 19:56:25 ID:???
QUERY_STRINGの運命は…
916nobodyさん:2005/05/19(木) 20:58:34 ID:???
>>QUERY_STRING
>>どんなことがでるのでしょう?
なんもでねぇ
917nobodyさん:2005/05/20(金) 05:32:13 ID:???
こう

package hoge;
use strict;
sub new {
    my $foo = {};
    $foo->{bar};
    $foo->{baz};
    〜略〜
}
とあったときに、
  $foo->{bar} = 'nil';
と入れたら
  $foo->{baz}
の値も、自動で 'nil' になってほしいんだけど、こういうのってどうすればできるのかな?

ハッシュじゃなきゃ型グロブとグローバル変数使ってできたけど、
これは自分じゃできなかったので、知ってる人いたらお願いw
918nobodyさん:2005/05/20(金) 07:22:35 ID:???
tie とか?
919nobodyさん:2005/05/20(金) 13:55:15 ID:SeWWShul
ちょっとしたPerlのスクリプトを、自分のホームページで公開しようと思うのですが、
設定ファイルはともかく、
メインのPerlスクリプトは稚拙すぎるので(汗)、
(まぁ、セキュリティ的な面では一通り対応したつもりですが)
あまりソースを見られたくありません。

そこで、Perlスクリプトを(あるいは、スクリプトの一部でもかまいません)
CGIの動作はそのままで、
「(暗号化により?)解読不可能にする(※1)」あるいは
「できるだけ解読に時間がかかるor解読する気が失せるように書き換える(※2)」
にはどうすればいいでしょうか?

※2の場合、
●削っても支障のない改行を消す
●変数名や関数名を、どんな使い方をしてるか推測困難なものにする
●同じ変数を使い場所によって全く異なる使い方をする
 (例:ある箇所ではfor文の「i」の代わりに使うが、
    ある箇所では現在日時を格納して使う、とか)
●スクリプトを膨大なファイルに分割してrequireしまくる
●関数をやたらと小分けにして、関数の数を多くする
●ラベルを使いまくる
くらいしか思いつかないのですが・・・

(全体をコピーされれば、どうしようもないですが、それは除外してあきらめます)

どうぞよろしくお願いいたします。
920nobodyさん:2005/05/20(金) 14:12:31 ID:???
そもそも、ソースを公開する意味がわからんというか、
そんなグダグダにしたソースを使いたい香具師いんの?
921919:2005/05/20(金) 14:15:39 ID:???
>>920

まぁ、自己満足ですからw
922919:2005/05/20(金) 14:40:55 ID:???
>>920
あ、あと、純粋に「知的好奇心」ってやつでしょうか?
このほうが大きいかも。

最近、JavaScriptで、鍵を使って暗号化・複合化ができるということを知ったものでして。

↓例(ここで知りました)
http://www.hcn.zaq.ne.jp/___/JavaScrypt/javascrypt.html
923nobodyさん:2005/05/20(金) 14:47:50 ID:???
糞野郎はさっさと〜消えろ〜
924nobodyさん:2005/05/20(金) 16:49:29 ID:???
そんなことする方が大恥晒し
Cでもやってろ
925nobodyさん:2005/05/20(金) 18:14:42 ID:???
自己満足に他人の手を借りるなんて最高のアフォ。
926919:2005/05/20(金) 18:35:46 ID:???
みんなつめてーなぁ
まぁ、見つけたけど
http://www.uspharmd.com/perl/lib/Pod/perlfilter.html
927nobodyさん:2005/05/20(金) 19:16:34 ID:???
知的好奇心があるなら、
その 「稚拙すぎるメインのPerlスクリプト」 を、
他の人が見ても見れる綺麗な書きかたを勉強しよう、となぜ思わないんだwww
928919:2005/05/20(金) 19:22:05 ID:???
>>927
いやいや、一応、キレイな書き方を取得するために、
「はじめてのPerl」的本とかオライリー本とかで勉強してます・・・
まだまだひよっこですけど(汗
929nobodyさん:2005/05/20(金) 19:41:02 ID:???
Perlでコーディングスタイルを決めるのは難しい
930nobodyさん:2005/05/20(金) 20:03:05 ID:???
配列の要素数を数える方法ですが、
現在はこうやってカウントしてるのですが、

my $count = @array;

もっと簡潔な方法ってないですか?
なんかこれ以外にもありそうな気が・・・

931nobodyさん:2005/05/20(金) 20:07:50 ID:???
print scalar(@array);


こーゆー事?
932nobodyさん:2005/05/20(金) 20:20:38 ID:???
なんか
my $count = @array;
じゃなくて
my $count = scalar @array;
とかやっちゃうよなあ。
あとは
my $count = $#array + 1;
とかか?
933nobodyさん:2005/05/20(金) 20:38:52 ID:???
print '配列arrayの要素数は、',0+@array,'です。';
934nobodyさん:2005/05/20(金) 20:48:02 ID:???
my $count = $#array + 1;

すみません、この$の横の#の意味教えて下さい
935930:2005/05/20(金) 20:53:23 ID:8UQXVsgd
931さん、932さん、933さん

ありがとうございました!これです!
勉強になりました。
936チャーリーブラウン ◆ZnBI2EKkq. :2005/05/20(金) 22:56:10 ID:cacgi0rq
見てくれ!
俺のIDが「CGI」だ!!
937nobodyさん:2005/05/20(金) 22:57:40 ID:???
>>936
オメ
938nobodyさん:2005/05/20(金) 23:55:08 ID:???
CGIでGETで来たパラメータの%uxxxxって形式(unicode?)をSJISに変換したいんだけど、
どうやったら良いのか教えて下さい。
uri_unescape(...)では%uxxxx形式は駄目みたいで...
939nobodyさん:2005/05/21(土) 04:34:22 ID:???
>>934
> すみません、この$の横の#の意味教えて下さい
#以降はコメントアウトです。
940nobodyさん:2005/05/21(土) 06:26:07 ID:???
>>939
朝っぱらからツボにはまったw
941nobodyさん:2005/05/21(土) 09:57:49 ID:???
@hoge = qw/あ か さ た/;
print $#hoge;
さて何だろう
942nobodyさん:2005/05/21(土) 16:03:03 ID:???
3

(・∀・)
943nobodyさん:2005/05/21(土) 16:19:13 ID:???
@hoge = qw/あ か さ た/;
undef $hoge[1];
print $#hoge;

これはー?
944nobodyさん:2005/05/21(土) 18:11:12 ID:???
3

(・∀・)
945nobodyさん:2005/05/21(土) 18:13:42 ID:???
2 !

(^゜(∀)゜^)ノ
946nobodyさん:2005/05/21(土) 18:18:18 ID:???
5行目 syntax error...
947nobodyさん
>>946
Unrecognized character \x82 at - line 5.