トップページ⇒php
1001コメント371KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/08/12(金) 01:26:47ID:mHnZWvqz
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0002nobodyさん2005/08/12(金) 01:28:01ID:4W8j9IZT
関連スレ
ウンコがくさい
http://ex11.2ch.net/test/read.cgi/news4vip/1123777673/
0003nobodyさん2005/08/12(金) 01:28:57ID:4W8j9IZT
前スレ
僕のあそこ
http://ex11.2ch.net/test/read.cgi/news4vip/1123777720/
0004nobodyさん2005/08/12(金) 01:29:10ID:4W8j9IZT
4様
0005nobodyさん2005/08/12(金) 01:29:40ID:4W8j9IZT
5
0006nobodyさん2005/08/12(金) 01:30:39ID:???
関連スレ
CGIだけど、なんか質問ある? Part 12
http://pc8.2ch.net/test/read.cgi/php/1097334246/

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

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

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

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

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

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

【 スクリプト改造依頼スレ 】(丸投げ) part3
http://pc8.2ch.net/test/read.cgi/php/1105046286/
0007nobodyさん2005/08/12(金) 01:31:45ID:???
[過去ログ] 1 of 4

Part1 http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980 参照不能
 DAT: http://tako.2ch.net/perl/dat/957208980.dat
Part2 http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087 参照不能
 DAT: http://tako.2ch.net/perl/dat/971817087.dat
Part3 http://tako.2ch.net/test/read.cgi?bbs=perl&key=979894521 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part4 http://tako.2ch.net/test/read.cgi?bbs=perl&key=984430156 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part5 http://pc.2ch.net/php/kako/988/988728069.html
Part6 http://pc.2ch.net/php/kako/996/996075607.html
Part7 http://pc.2ch.net/php/kako/1000/10002/1000267444.html
Part8 http://pc.2ch.net/php/kako/1003/10039/1003900311.html
Part9 http://pc.2ch.net/php/kako/1009/10095/1009549309.html
Part10 http://pc.2ch.net/php/kako/1014/10145/1014556702.html
0008nobodyさん2005/08/12(金) 01:32:15ID:???
[過去ログ] 2 of 4

Part11 http://pc.2ch.net/php/kako/1017/10172/1017201229.html
Part12 http://pc.2ch.net/php/kako/1019/10199/1019917048.html
Part13 http://pc.2ch.net/php/kako/1022/10227/1022731565.html
Part14 http://pc.2ch.net/php/kako/1026/10269/1026977659.html
Part15 http://pc.2ch.net/php/kako/1028/10288/1028816385.html
Part16 http://pc.2ch.net/php/kako/1032/10320/1032070299.html
part17 http://pc.2ch.net/php/kako/1034/10345/1034583844.html
part18 http://pc.2ch.net/php/kako/1037/10377/1037797479.html
part19 http://pc.2ch.net/php/kako/1042/10422/1042260745.html
part20 http://pc2.2ch.net/php/kako/1044/10447/1044717887.html (タイトルに19と誤記)
0009nobodyさん2005/08/12(金) 01:32:45ID:???
[過去ログ] 3 of 4

part21 http://pc2.2ch.net/php/kako/1047/10479/1047980851.html
part22 http://pc2.2ch.net/php/kako/1050/10503/1050369328.html
part23 http://pc2.2ch.net/php/kako/1053/10530/1053051519.html
part24 http://pc2.2ch.net/php/kako/1054/10549/1054992610.html
part25 http://pc2.2ch.net/php/kako/1056/10567/1056730690.html
part26 http://pc5.2ch.net/php/kako/1059/10590/1059043704.html
part27 http://pc5.2ch.net/php/kako/1060/10608/1060808783.html
part28 http://pc5.2ch.net/php/kako/1063/10635/1063562491.html
part29 http://pc5.2ch.net/php/kako/1066/10662/1066286828.html
part30 http://pc5.2ch.net/test/read.cgi/php/1069846177/
0010nobodyさん2005/08/12(金) 01:33:35ID:???
part31 http://pc5.2ch.net/test/read.cgi/php/1072896288/
part32 http://pc5.2ch.net/test/read.cgi/php/1075545279/ (タイトルに31と誤記)
part33 http://pc5.2ch.net/test/read.cgi/php/1078076768/
part34 http://pc5.2ch.net/test/read.cgi/php/1081148490/
part35 http://pc5.2ch.net/test/read.cgi/php/1085557731/
part36 http://pc5.2ch.net/test/read.cgi/php/1089779036/
part37 http://pc5.2ch.net/test/read.cgi/php/1093106507/
part38 http://pc5.2ch.net/test/read.cgi/php/1097158988/
part39 http://pc5.2ch.net/test/read.cgi/php/1101522903/
part40 http://pc5.2ch.net/test/read.cgi/php/1106816922/

part41 http://pc8.2ch.net/test/read.cgi/php/1110383236/
part42 http://pc8.2ch.net/test/read.cgi/php/1116970588/(前スレ)
0011nobodyさん2005/08/12(金) 01:35:19ID:???
ム板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/


関連スレ

正規表現道場@2ch Part4
http://pc8.2ch.net/test/read.cgi/php/1105930285/
0012nobodyさん2005/08/12(金) 03:15:49ID:???
>>2-5
の慌てぶりにワラタ
0013nobodyさん2005/08/12(金) 03:36:54ID:???
>>11
ム板 Perl スレより。

[プログラミング自体の経験が無い奴はまずココを読め] (移転)
Perlプログラミング講座: http://www.site-cooler.com/kwl/perl/

[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.7/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
日本語ドキュメント検索: http://search.cpan.jp/

[Perl5.8Unicodeメモ]
ttp://www.pure.ne.jp/~learner/program/Perl_unicode.html
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0014nobodyさんNGNG
「危険だ!」と頭ごなしにしないで、あえて聞いてもらいたい。指摘してもらいたい。

PerlでCGIスクリプト群を作ってるんだけど、新しいバージョンを作る度にユーザー
にインストールしてもらうのが煩雑。そこで、ネットワークアップデート機能はできない
ものか? と思ってるんだけど。

----------------------------
・SuEXEC環境を前提で
・アップデート用CGIを動かすと、現在インストールされているCGIスクリプト群のversion
 を、公式配布サイトの最新版と比較。
・古ければダウンロードしてアップデート。

・アップデートCGI自体のアップデート・・・はとりあえずおいておいて。
・ネットワークごしに持ってきた最新版が、そのWebサーバ環境で動くか?そこらへん
 の設定はうまく別ファイルに隔離したりして対処するとして。
----------------------------

危険ですか? だとしたら理由を教えて欲しい。

もうすでにそういう仕組みある? あったら教えて欲しい・・・。

よろしくお願いします。
0015nobodyさん2005/08/12(金) 04:06:17ID:4W8j9IZT
>>12
そうだよ
急いで糞スレたてるの大変だったよー
0016nobodyさん2005/08/12(金) 04:52:46ID:???
>>14
その"公式配布サイト"が、最初はまともなスクリプトだったけど、
後で (アップするとき) 悪質なスクリプトを埋め込んだとしたら、君、潰れるよ?
0017nobodyさんNGNG
>>17 そうですね。そうだと思います。ただそれは「信用」のレイヤーの話になるかと。

0018nobodyさんNGNG
間違えたー! >>16 だった!
0019nobodyさん2005/08/12(金) 05:43:34ID:???
>>14
漏れフリーでスクリプト配布しているけど
何かしらの改変をして運用してる場合が多いのでかえって迷惑鴨。
商用だとアップデートで動かなかった場合に責任問題で訴えられる鴨。
0020nobodyさん2005/08/12(金) 06:01:01ID:???
せめて バージョンアップしました のメッセージが流れる程度にしてもらいたい。
0021nobodyさんNGNG
自動的にアップデートしてしまう っていう所までは考えていないんですけどね。
ユーザーが望めばクリック一発で最新版にアップデート!っていう感じなんですけどねえ。
0022nobodyさん2005/08/12(金) 12:38:41ID:???
重度自己陶酔型論破厨房警報
0023nobodyさん2005/08/12(金) 13:30:02ID:???
LPWかなんか必要になるけどレンタルサーバーでは悪用を恐れてそれ自体インストール不可だったりする。
配布元でRSS付けて配布BBS内にそのリンクを貼る、じゃだめかい?
で、そのためにXML::RSSを使うと。
0024nobodyさん2005/08/12(金) 14:25:48ID:???
質問させてください。

Perlを用いてメールを送信するCGIを作成したいのですが、
使っているサーバがSMTP-Authと呼ばれる認証を使っているらしく、
ググって見つけたサンプルソースを利用しても接続できません。
何か特別な方法をしないと無理なんでしょうか。
よろしければご教授願います。

ソースは下にあります。
$send_dataにはメールヘッダ情報を記載しています。
0025nobodyさん2005/08/12(金) 14:26:42ID:???
/*-----ソース-----*/
#!/usr/bin/perl
use Socket;
$server="***.**.**.**";
$to="***@***.**.**";
$from="***@***.**.**";
$subject="test mail";
$data="test";

$port = getservbyname('smtp','tcp');
$struct = pack_sockaddr_in($port,inet_aton($server));
socket(SH, PF_INET, SOCK_STREAM, 0) || die("ソケットの生成失敗 $!") ;
connect(SH, $struct ) || die("接続失敗 $!") ;
select(SH); $| = 1; select(STDOUT);
$respons = <SH> ;
unless($respons =~ /^220/) { close(SH); die("接続失敗 $!") ; }

$command = "HELO $server\n";
print SH $command ;
$respons = <SH> ;
&decode(\$respons) ;
unless($respons =~ /^250/){ close(SH); die("HELOコマンド失敗 $!") ; }

$command = "MAIL FROM:$from\n";
print SH $command ;
$respons = <SH> ;
&decode(\$respons) ;
unless($respons =~ /^250/){ print SH "RSET\n"; close(SH); die("MAILコマンド失敗 $!") ; }
0026nobodyさん2005/08/12(金) 14:27:18ID:???
/*-----続き-----*/
$command = "RCPT TO:$to\n";
print SH $command ;
$respons = <SH> ;
&decode(\$respons) ;
unless($respons =~ /^25[0|1]/){ print SH "RSET\n"; close(SH); die("RCPTコマンド失敗 $!") ; }

$command = "DATA\n";
print SH $command ;
$respons = <SH> ;
&decode(\$respons) ;
unless($respons =~ /^354/){ print SH "RSET\n"; close(SH); die("DATAコマンド失敗 $!") ; }

$command = "$send_data\n";
print SH $command ;
print SH ".\n";
$respons = <SH> ;
&decode(\$respons) ;
unless($respons =~ /^250/){ print SH "RSET\n"; close(SH); die("本文、ヘッダ部送信失敗 $!") ; }

$command = "QUIT\n";
print SH $command ;
close(SH); select(STDOUT);
print "MAILは正常に送信されました。\n";
0027nobodyさん2005/08/12(金) 18:15:23ID:???
>>24
頭悪すぎ、SMTP-Authが必要といってるサーバにSMTPでメール投げても駄目に決まってるだろ。
0028nobodyさん2005/08/12(金) 18:50:28ID:???
>>14
危険という話はおいておくとその機能は便利だね。
ファイルもってくる事自体はLWPもuse Socketも必要とせず出来る。bindする事を制限されていないのであれば。
スクリプト実行中に実行元のスクリプトファイルを書き換えても問題無いです。
上書きなら所有者、パーミッションは引き継がれる。
そもそもsuexecならファイル作成、chmodは問題なく行えます。
一番問題なのは折れない心
0029nobodyさん2005/08/12(金) 18:56:39ID:???
>>24
http://www.puni.net/~mimori/rfc/rfc2554.txt
http://search.cpan.org/~apleiner/Net-SMTP_auth-0.07/
http://search.cpan.org/~gbarr/libnet-1.19/
0030nobodyさん2005/08/12(金) 20:30:29ID:???
>>28
鯖管やるなら一度は書いてるようなたわいも無いツールだと思うけど‥
0031nobodyさん2005/08/12(金) 21:04:08ID:???
チラシの裏にでも書いてろ
0032nobodyさん2005/08/12(金) 21:25:21ID:qS3bR1/B
配布元がクラックされる可能性を考えると、バージョンアップ告知くらいに止めておくのが無難だな。
0033nobodyさん2005/08/12(金) 22:01:46ID:???
水島広子みたいな例もあるしな。
0034nobodyさん2005/08/13(土) 02:44:52ID:???
あれはクラックじゃないでしょ
0035nobodyさん2005/08/13(土) 03:06:52ID:???
んなこた分かってるだろ
0036nobodyさん2005/08/13(土) 07:51:10ID:???
2ちゃんで自演してる厨のソフトなんか信用できねー
0037nobodyさん2005/08/13(土) 18:42:30ID:Sjgh6/vt
Cookieって名前=値の部分は複数保存できないんですか?
0038nobodyさん2005/08/13(土) 19:39:09ID:???
>>37
ここはperlスレだと、何度言ったらわかるんだ?
0039nobodyさん2005/08/13(土) 21:22:32ID:???
テキストファイルに書かれた文章をある変数で受け取って、
その文章にある変数を展開することって可能ですか?

んーと、つまりはこういうこと。

$a = 10; $b = 20;
open(FILE , "data.dat") or die("Error : $!");
foreach (<FILE>){ $result .= $_; }
print $result; exit;

[data.dat]
a = $a
b = $b

a + b = $a + $b
[EOF]

[出力結果]
a = 10
b = 20

a + b = 30
0040nobodyさん2005/08/13(土) 21:39:57ID:???
>>39
eval
0041nobodyさん2005/08/13(土) 21:50:52ID:???
>>39


$a = 10; $b = 20;
open(FILE , "data.dat") or die("Error : $!");
while (<FILE>){
s/\$.+$/eval($&)/e;


$result .= $_; }


print $result; exit;
0042nobodyさん2005/08/13(土) 22:09:28ID:AxZeVTkQ
かなり初歩的なこと(文法関連のこと)かもしれませんが質問させてください。
環境:OS=FedoraCore3(自宅サーバ) perl=v5.8.5

以下の基本コードを実行しました。
#!/usr/bin/perl

print "content-type: text/html\n";
print "\n";
print "<Html>\n";
print "Test Message";
print "</Html>\n";
正常にTest Messageと表示されました。
次に#!/usr/bin/perl

print "content-type: text/html\n";
#print "\n";
print "<Html>\n";
print "Test Message";
print "</Html>\n";
としたところ「Internal Server Error」となってしまいました。
参考資料には
最初に#のある行はコメント行である。
また、コメント行にしたところはただの改行である。
とありました。
上記より文法として間違ってはいないと思いますが、
なにか誤っているところがあるのでしょうか?
0043nobodyさん2005/08/13(土) 22:23:16ID:???
>>42
content-typeなどのHTTPヘッダーの区切りは改行2つ。
0044nobodyさん2005/08/13(土) 22:23:36ID:IY1oZ0HZ
>>42
>>38
0045nobodyさん2005/08/13(土) 22:23:51ID:???
>>42
その参考資料は捨てなさい。嘘が書いてあります。

最初の行は、コメント行ではありません。
コメントアウトした所は、ヘッダに必要な改行です。
0046nobodyさん2005/08/13(土) 22:25:49ID:???
>>42
回答は出たようなので補足だけ。
検索キーワードは「レスポンスヘッダ」とか。
あとhttpdのエラーログも見よう。
0047422005/08/13(土) 22:30:43ID:???
>>43>>45
そうなんですか!
確かにそう考えるとコメントアウトしてエラーとなる原因がよく分かりました。

>>44
すみません。perlを用いたwebプログラミングの文法に関するものということで
ここで質問してしまいました。
スレ違いということであればどこが妥当でしょうか?
「CGIだけど、なんか質問ある? Part 12」は微妙に違うような気がしますし...
0048nobodyさん2005/08/13(土) 22:58:25ID:???
>>41
う、うまく動かない・・・orz
data.datの最後にある「$b」だけ展開されました・・・orz
0049nobodyさん2005/08/13(土) 23:05:20ID:???
と思ったら、\$.+$になってませんでした・・・orz
お騒がせしましたー・・・
0050nobodyさん2005/08/13(土) 23:06:41ID:???
>>48
だろうね。
最初に書いた自分のやつ、>>39 で素直に
$result を eval したら?
0051nobodyさん2005/08/13(土) 23:13:47ID:???
あ、ついでに質問なんですが、
もしdata.datの内容が以下のような場合でも、
きちんと展開されるには、どんな正規表現にすればいいでしょうか。

[data.dat]
a + b = $a + $b です。
0052nobodyさん2005/08/13(土) 23:19:05ID:???
>>51
そのままで良いのでは…。

つか、>>50 で書いてたこと、勘違いしてました。逝ってきます…。
0053392005/08/13(土) 23:26:04ID:???
>>52
\$.+$のままだと、「$a + $b です。」にマッチして、そのままevalかけるらしく、
正確な「30 です。」という結果にならないのです(´・ω・)
変数名のみ(演算子があればそれも)ってのは、やっぱり無理なんでしょうかね・・・

一応、例に出しているのはあくまでも例で、
実際は$data{name}といった内容がかかれているのです・・・。
0054nobodyさん2005/08/13(土) 23:26:59ID:???
>>47
正確に言えばそこだけど、
違いが分からないんだから初心者向けのこっちのスレが融通利かせてもいいと個人的には思う。

>>51
どの範囲を式として見るか不明瞭。
とりあえず変数と変数に挟まれた+を認識させるなら
s/(\$\w+([ +]+\$\w)*)/eval($1)/ge;
ただし $a + + $b なんてあっても無視。
式として見る範囲に記号付ける方が無難かもね。
「a + b = <$a + $b> です」
s/<([^>]*)>/eval($1)/ge;
0055392005/08/13(土) 23:34:06ID:???
>>54
なるほど、変数を記号で囲むという手法もありましたか。
ありがとうございます。
0056nobodyさん2005/08/14(日) 00:18:03ID:???
んじゃ、別解
$a=10; $b=20;
open(D, "<data.dat");

$data = join("\n", '$result=<<EOS', <D>, "EOS\n");
eval $data;
print $result;
0057nobodyさん2005/08/14(日) 00:57:57ID:gpI3KnsY
掲示板CGIで、掲示板タイトルをこういう書き方をしています。
$BBS_TITLE="Fighter's BBS 戦士たちの会議室";
これを投稿フォームの上部に表示させているのですが、(投稿フォームのところに$BBS_TITLEと)
投稿すると$BBS_TITLEの部分だけ文字化けします。
"を'に変えてみたり、漢字をエスケープさせてみたりしましたが
直りません。
どこをどうしたら表示できるようになるでしょうか。
スクリプトはS_JISです。
0058nobodyさん2005/08/14(日) 01:13:13ID:???
>>57
>>1
0059nobodyさん2005/08/14(日) 01:55:41ID:???
>>57
HTMLソースから文字化けしている部分をさらすよろし。
よくあるShift-JISうんぬんの話じゃなさそうだから。
0060nobodyさん2005/08/14(日) 02:30:51ID:RsCEyCku
use encoding 'Shift-jis'
話はそれから。
0061nobodyさん2005/08/14(日) 03:16:43ID:???
どうでもいい話だが、

IANA 的には "Shift_JIS"
http://www.iana.org/assignments/character-sets

Encode 的には "shiftjis"
http://search.cpan.org/~dankogai/Encode-2.11/JP/JP.pm

Encode だとエイリアスしてくれているので通るとは言え、
ハイフン区切りで書く癖があるなら直した方がいいよ。
0062掲示板タイトルの文字化けの件2005/08/15(月) 02:34:48ID:B8RuptAe
人大杉で14日PM11時ごろから「大杉」で見られないので代理投稿お願いしました。
名前やレスを下さった方のお名前がわかりませんがお許しください。

>(化けたソースを)UP
・・・しろとのことでしたのでUPします。
Fighter's BBS 戦士達の会議室 となるべきところが↓
Fighter's BBS $B@o;NC#$N2q5D<<(B
このようになっております。
文字列内の'を消しても変化ありません。
投稿したときだけこのように表示され、掲示板へアクセスしただけの時は
正常に表示されます。
0063nobodyさん2005/08/15(月) 02:48:09ID:???
文字化けってーか JIS になってんじゃね。
0064nobodyさん2005/08/15(月) 08:24:12ID:I9dGlG0t
>>61
あんがと。
shiftjis /\bshift.*jis$/i Shift JIS (aka MS Kanji)
適当に打っても通るから適当に打って投稿しますた。
0065nobodyさん2005/08/15(月) 08:36:29ID:???
>>62
文字コードの指定がないか、ばらばらなんでしょ。
自作掲示板ならソースのコードを統一する。
レンタルなら借りた先に文句を言う。
無料DLして設置したのなら作者のページで質問する。
0066nobodyさん2005/08/15(月) 09:04:11ID:???
>>2
ソースファイルの保存コードがおかしいのかも。
外部ファイルrequireして読み込んでね?

use encoding '****';してその文字コードにソースを統一しる
0067nobodyさん2005/08/15(月) 17:51:57ID:???
うむ、作者に問うのが一番だな。
0068nobodyさん2005/08/15(月) 18:54:55ID:VKc1C+7u
教えて下さい。
cookieのセットを以下のように行い、\cookiesフォルダにもファイルが出来ている
のに、$ENV{'HTTP_COOKIE'}にデータが返ってきません。どうしてでしょうか?
ちなみにIEのプライバシー設定は”自動cookie処理を上書きする”にして
います。

print "set-cookie: ", "DI=$FORM{'id'}; ";
print "expires=", "Sat, 31-Dec-2006 23:59:59 GMT; ";
print "domain=", "abcd.jp; ";
print "secure", "\n";

スレ違いだったらすいません。
0069nobodyさん2005/08/15(月) 19:37:06ID:???
secureとdomainを外してみるよろし。
この2つ。ちゃんと理解してる?

0070nobodyさん2005/08/15(月) 22:44:30ID:VKc1C+7u
>>69
68です。
ありがとうございます。
みようみまねでやっていたので、理解してませんでした。
おっしゃる通りにやったらうまく行きました。
0071nobodyさん2005/08/16(火) 02:21:29ID:CqLOGoiC
perl初心者のプログラミング経験者です。
require は if 文の中にもかけますか?

PCと携帯に対応したBBSのソースをダウンロードしたのだけど
1ファイルで if 文でなんとかしようとしてる感じの代物でした。

それよりPC、携帯ごとに同名の関数を別ファイルで定義して
メインのCGIは最初に端末を判断してrequireでファイルを読み込んだ方が
OOP的で保守性もいいと思ったのですが、可能なんでしょうか。

アイディアがどうかも含めてご意見お願いします。
0072nobodyさん2005/08/16(火) 02:30:11ID:???
お前は試すと言うことを知らんのか。
0073nobodyさん2005/08/16(火) 03:14:09ID:???
ほんとに経験者なのか全体的に疑問が沸いてくる話し振りアル。
0074nobodyさん2005/08/16(火) 10:26:34ID:???
自分ではどうにもならなかったので質問します。
cat index.html | nkf -Se -Lu | sed 's/<\/.*>//g; s/<.*>//g; s/^$//; s/ \;/ /g;'
↑このスクリプトを詳しく教えてほしいです。
0075nobodyさん2005/08/16(火) 13:09:30ID:???
質問です
以下のスクリプトで %temphash を使わずに
無名ハッシュにスライスで代入してそのリファレンスを配列に追加するにはどうしたらいいでしょうか?

my @examplenames = qw/Server Board Key/;

my %temphash;
@temphash{ @examplenames } = ("pc8.2ch.net", "php", "1123777607");
push @favorites, \%temphash;
0076752005/08/16(火) 13:33:31ID:???
ちょっと冗長な感じがしますが、自己解決しました。すみません。
@{$favorites[++$#favorites]}{ @examplenames } = ("pc8.2ch.net", "php", "1123777607");
0077nobodyさん2005/08/16(火) 14:04:58ID:9v1kpORv
>>74
それはシェルスクリプトだから、マニュアル引くならman。
それほど難しい所は無いから、cat,nkf,sedをググってみては。

>>75
こういうのを知りたかったのかなと思ったのだけど、
スライス使ってないから悩んだ。

push @favorites, {Server=>"pc8.2ch.net", Board =>"php", Key=>"1123777607"};
0078nobodyさん2005/08/16(火) 14:08:50ID:???
sage忘れスマソ。
0079nobodyさん2005/08/19(金) 14:41:46ID:E8nv73TY
質問です。
HTML::Templateの使い方です。

プログラム側で、@tmpには
[email protected]
[email protected]
[email protected]
[email protected]
と4つ入っています。

これを
<p>Addr:<select name="userid">
<option value="[email protected]">[email protected]</option>
<option value="[email protected]">[email protected]</option>
<option value="[email protected]">[email protected]</option>
<option value="[email protected]">[email protected]</option>
</select></p>

いう風にしたくて、テンプレート側で以下のようにループを掛けています。

<p>Addr:
:<select name="userid"><TMPL_IF NAME=USERID>
<option value="<TMPL_VAR NAME=ADDR>"><TMPL_VAR NAME=ADDR></option></TMPL_IF>
</select></p>


プログラム側で
$template->param(USERID => @tmp);

で、当然のことながらうまくいかないのですが、HTML::Templateの日本語訳を読んでも
このような使い方の例がありません。
どのようにすればいいのか、教えていただければと思います・・・。
0080nobodyさん2005/08/19(金) 14:47:40ID:???
わからなかったら使わなければいいと思うんだが。
普通にforeachでまわせば?
0081792005/08/19(金) 15:00:33ID:???
>>80

「HTML::Templateを使え」とは言われていないのですが、

H T M L 部 分 は 必 ず 外 部 フ ァ イ ル に し ろ

というお達しがあるので、CGI側で丸ごと<option>〜</option>を吐き出すことができません。
これができれば簡単なのですが・・・。


・デザインはデザイナーがやる
・デザイナーにはCGIの部分は「一切」触らせない
・だからCGIからHTMLを丸ごと吐き出すような作りにはできない

で、HTML::Templateに行き着いたわけでして。

0082nobodyさん2005/08/19(金) 15:10:03ID:???
>>79
ループをかけているといっているがどこにもループないし、例がないといっているが
HTML::TemplateのTMPL_LOOPのところの例はそのものズバリだと思うのだが。
なんか違う世界が見えてる人?
0083792005/08/19(金) 15:13:01ID:???
自己解決しました。
ありがとうございました。
0084792005/08/19(金) 15:17:04ID:???
>>82

ごめん。

<p>Addr:
:<select name="userid"><TMPL_LOOP NAME=USERID>
<option value="<TMPL_VAR NAME=ADDR>"><TMPL_VAR NAME=ADDR></option></TMPL_LOOP>
</select></p>

でした。
あんまりできないもんだから、IF使って値がある間にぶち込むことを考えてて
そのまま貼り付けちまった。

LOOPの例は読んでんだけど、ハッシュの例しかなく。
0085792005/08/19(金) 15:56:39ID:???
>>83は私じゃないけど、自己解決できました。

<TMPL_VAR NAME=ADDR>

だけ書いておいて、CGIの側で

my $tmp2
foreach my $tmp(@addr){
$tmp2 .= "<option value=\"$tmp\">$tmp</option>\n";
}
my $tmp3 = "<p><select>$tmp2</select></p>\n";
$template->param(ADDR => $tmp3);

でできました。ありがとうございました・・・。
0086nobodyさん2005/08/19(金) 17:15:00ID:???
>>85
それはHTMLがプログラム側に染み出してるので、テンプレ使う意義を
考えるとイマイチだな。

私ならプログラム側は

$template->param(ADDR => [map {{A => $_}} @addr]);

としといてテンプレの方で

<TMPL_LOOP NAME=ADDR>
<option value="<TMPL_VAR NAME=A>"><TMPL_VAR NAME=A></option>
</TMPL_LOOP>

とします。
0087nobodyさん2005/08/20(土) 23:50:12ID:???
未定義値undefについて質問です。
$ret = open (FILE, "hoge.txt");
ファイルオープンに失敗した場合、undefが返ってくるらしいのですが、
オープンに失敗したかどうかの判定をする際に
if ($ret == undef) {
と記述するべきなのか
if ($ret eq undef) {
とするべきなのか悩んでいます。
どちらも正常に判定はされているらしいのですが。

open (FILE, "hoge.txt") || &error("File open failed.");
などと書くのもありなのは知っていますが、
オープンに失敗して&errorを呼ぶ前にいくつかの処理を実行させたいので、
if文での判定を行いたいのです。
0088872005/08/20(土) 23:52:58ID:???
すみません、よく考えたら
if(!open (FILE, "hoge.txt")) {
  処理1;
  処理2;
  &error("failed.");
}
と記述すれば問題なさそうですね・・・
0089nobodyさん2005/08/21(日) 00:00:39ID:???
>>88
open FILE, "hoge.txt"
   or do{ 処理1; 処理2; error("failed.") };
とかどう?
0090nobodyさん2005/08/21(日) 00:29:16ID:???
>>87
解決してるみたいなので、ちょっとした補足です。
undefは未定義値ではなく、未定義値を返す関数undef()です(無引数の場合)。
未定義値との比較は、==, eq ではなく defined() を使うと良いでしょう。
0091792005/08/22(月) 10:52:01ID:???
>>86
mapを使うのか・・・
全然思いつきませんでした。ありがとう。
0092nobodyさん2005/08/22(月) 18:49:38ID:IX9Ccu2Q
質問です。

foreach $a (@hourlist){ ($mons1,$mons2,$mons3,$mons4,$mons5,$mons6,$mons7,$mons8,$mons9,$mons10,$mons11,$mons12,$mons13,$mons14,$mons15,$mons16) = split(/<>/,$a);
}

# 時間代入
if ( $in{'mons'} == '城内2時間キングアッピー' ) {
$mons1 = $in{'timeh'}
} elsif ( $in{'mons'} == '城内10時間キングアッピー' ) {
$mons2 = $in{'timeh'}
} elsif ( $in{'mons'} == '城内ドラゴン' ) {
$mons3 = $in{'timeh'}
} elsif ( $in{'mons'} == '城内朱雀' ) {
$mons4 = $in{'timeh'}
} elsif ( $in{'mons'} == '2時間カイザー' ) {
$mons5 = $in{'timeh'}
} elsif ( $in{'mons'} == '7時間カイザー' ) {
$mons6 = $in{'timeh'}
} elsif ( $in{'mons'} == '10時間カイザー' ) {
$mons7 = $in{'timeh'}
} elsif ( $in{'mons'} == '7時間カース' ) {
$mons8 = $in{'timeh'}
} elsif ( $in{'mons'} == '7時間ブレス' ) {
$mons9 = $in{'timeh'}
} elsif ( $in{'mons'} == '7時間ルーン' ) {
$mons10 = $in{'timeh'}
} elsif ( $in{'mons'} == '10時間カース' ) {
$mons11 = $in{'timeh'}
} elsif ( $in{'mons'} == '10時間ブレス' ) {
$mons12 = $in{'timeh'}
} elsif ( $in{'mons'} == '10時間ルーン' ) {
0093922005/08/22(月) 18:52:53ID:IX9Ccu2Q
$mons13 = $in{'timeh'}
} elsif ( $in{'mons'} == '城外キングアッピー' ) {
$mons14 = $in{'timeh'}
} elsif ( $in{'mons'} == '9時間リグレット' ) {
$mons15 = $in{'timeh'}
} else {
$mons16 = $in{'timeh'}
}

$_ = "$mons1<>$mons2<>$mons3<>$mons4<>$mons5<>$mons6<>$mons7<>$mons8<>$mons9<>$mons10<>$mons11<>$mons12<>$mons13<>$mons14<>$mons15<>$mons16<>\n";
push (@newhour,$_);

こうやったのですが、1〜4番目に入れたいデータが1番目に、6・8〜10番目に入れたいデータが6番目に、7・11〜14番目に入れたいデータが7番目に入ってしまいます。
どこが原因か教えていただけないでしょうか?
0094nobodyさん2005/08/22(月) 19:43:40ID:???
>>92
文字列の比較は eq を使う。
0095nobodyさん2005/08/22(月) 19:54:26ID:???
>>94
出来ました。ありがとうございました<(_ _)>
0096nobodyさん2005/08/22(月) 22:43:42ID:???
>92ではないのですが、>92を簡潔に書くならどんな感じでしょう?

my @tempmons = qw/dummy 城内2時間キングアッピー 城内10時間キングアッピー ... /;
my %mons_to_index = map { $tempmons[$_] => $_ } 0..$#tempmons;

foreach(@hourlist){
    chomp;
    my @mons = split /<>/;
    $mons[ ($mons_to_index{ $in{'mons'} } || @mons)-1 ] = $in{'timeh'};
    $_ = join '<>', @mons,"\n";
}

ループを1個減らそうとハッシュを使ってみたのですが、
indexが0の時の対処が強引になってしまいました
0097nobodyさん2005/08/22(月) 23:01:26ID:???
>>96
全然追ってないけど、とりあえず $in{'mons'} と $in{'timeh'} は
ループの外へ出して別変数に入れようよ。
0098nobodyさん2005/08/22(月) 23:19:39ID:???
変数の記述方法について質問です。
$sizeという数値が入る変数があり、これをヒアドキュメントで出力したいのですが、
print <<"EOF";
log file size $sizeKB
EOF
などと書くと、$sizeとKBではなく$sizeKBという変数として認識されてしまうのですが、
ヒアドキュメンド内で変数の直後に半角英数字を続けて書く方法はないでしょうか。
0099nobodyさん2005/08/22(月) 23:23:42ID:???
>>98
log file size ${size}KB
0100nobodyさん2005/08/22(月) 23:24:09ID:???
>>99
即レス感謝です!
0101nobodyさん2005/08/23(火) 00:16:13ID:???
>>96
いいんじゃない?
私は頭の部分をこう書くかな。

my @tempmons = qw{dummy 城内2時間キングアッピー 城内10時間キングアッピー ...};
my %mons_to_index;
@mons_to_index{@tempmons} = 0..$#tempmons;
0102nobodyさん2005/08/23(火) 00:49:00ID:???
>>101
んじゃ、その %mons_to_indexがもう出来てるとして俺は空間効率でも上げてみるか。
頭の中で考えただけだから、間違ってたらごめん。

my $tm = $in{'timeh'};
my $mons_id = $mons_to_index{$in{'mons'}};
foreach my $hour (@hourlist) {
my $i = 0;
while ($hour =~ m/<>/go) {
next if $i++ != $mons_id;
$hour =~ s/[^<>]+<>\G/$tm<>/o;
last;
}
}

ところで、なんで @hourlist が配列なのか不明。
もとのコード >>92 でも foreach で回してるけど、$mons* が上書きされちゃうし。
0103nobodyさん2005/08/23(火) 01:26:51ID:???
ゲームプログラマならリファレンス学べ

sub data_load {
open DATA, "<data.txt" or die "Can't open : $@";
my @lines = <DATA>;
close DATA;
return [ undef, map{ split '<>' } @lines ];
}

sub data_save {
my @data = join '<>' => map{ $$_ } @_;
local $" = "\n";
open DATA, ">>data.txt" or die "Can't open : $@";
print DATA "@data";
close DATA;
}
とすれば

@::ref_hours = data_load();
$::ref_hours->[ $in{mons} ] = $in{timeh};
data_save( @::ref_hours );

応用方法もいくらでもあるだろう。
0104nobodyさん2005/08/23(火) 01:32:14ID:???
ごめ、脳内コーディング
return map{ [ undef, split/<>/,$_ ] } @lines;

だな。
my @tempmons = qw{ 城内2時間キングアッピー 城内10時間キングアッピー ...};
my %mons_to_index;
@mons_to_index{@tempmons} = 0..$#tempmons;
にして
return map{ split/<>/ } @lines;
とかしたいが元スクリプト読む気ないので間違ってるかも。
0105nobodyさん2005/08/23(火) 01:35:17ID:???
またw
X return map{ split/<>/ } @lines;
O return map{ [split/<>/] } @lines;
0106nobodyさん2005/08/23(火) 02:18:30ID:???
ゲームプログラマじゃなくてもリファレンスは必要だろ
0107nobodyさん2005/08/23(火) 02:21:03ID:???
どっかの入門書鵜呑みにしたんだろ。
0108nobodyさん2005/08/23(火) 02:22:58ID:???
>>102
うは、正規表現を使いますか。
(foreachは遅いとかの突っ込みは無しの方向で)

my $tm = $in{timeh};
my $mons_id = $mons_to_index{$in{mons}} || @tempmons;

foreach my $hour (@hourlist){
foreach(1..$mons_id){
$hour =~ m/<>/g;
}
$hour =~ s/\G[^<>]+/$tm/;
}
0109nobodyさん2005/08/23(火) 09:47:32ID:???
>>108
>>102 です。
どうも元のコード読む限り、置換は一ヶ所だけなんだよね。elsif で繋いであるし。
正規表現の作製コストと、splitかけてjoinするコスト
どっちが良いかは、この場合かなり微妙…。もしかしたらsplit, joinのが安いかも。
0110nobodyさん2005/08/23(火) 12:04:31ID:???
>>109
最近見かけた名言を贈ろう。

 「推測するな。計測しろ」

http://search.cpan.org/~nwclark/perl-5.8.7/lib/Benchmark.pm
0111nobodyさん2005/08/23(火) 12:40:05ID:???
説教するな、説得しろ。
0112nobodyさん2005/08/23(火) 13:46:44ID:???
my @hoge = ('a', 'b', 'c');
my @moge = (1, 2, 3, 4);
my @foo = (\@hoge, \@moge);

@fooを使って、$hoge[2]の値を取得するにはどうすればよいですか?
\@hogeは必ず$foo[0]にあります。
0113nobodyさん2005/08/23(火) 13:57:40ID:???
>>112
http://perldoc.jp/docs/perl/5.6.1/perllol.pod
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlreftut.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlref.html
01141082005/08/23(火) 14:42:04ID:???
>>109
一回だったら微妙かもですね。

>>110
ベンチなら正規表現の方が2倍速かった。(@hourlist=10で計測)
ただ、ベンチは繰り返し実行するから、
正規表現のコンパイルコストなど測れない部分がある。
大抵は無視できるけど、一回こっきりの話だと無視できない可能性も。
細かい話だけどね。
01151022005/08/23(火) 17:55:10ID:???
>>110
ありがとう。その通りです。
ベンチ鬼のようにやってたから、目測でコスト見積るようになった。
「スカラ変数宣言で◯バイト消費。数値入力でヘッダ部分にビットが立つ。ボディーが追加されて数値設定。文字列として使っちゃったから、ヘッダ部のビット変更。ボディーの数値構造体切り離して、両用の構造体に変更。」
とか、気にしてた頃はスクリプト見ながらここまで考えてた(あほです)。

>>114
わざわざベンチありがとう。やっぱり1回だと微妙ですよね…。m/<>/go がリニアサーチだし。
0116nobodyさん2005/08/23(火) 21:09:27ID:???
IE限定だけどJavaScriptでクリップボードの内容をコピーできるので、
そこら中のサイトで「セキュリティーホールだ!クリップボードの内容が盗見られる!」
と騒ぎ立ててんだけど、もちろんsubmit送信を使えば値を渡すことができるだろうけど、
1回の閲覧のみでJavaScriptで取った値をCGIに渡すことは不可能だよね?
0117nobodyさん2005/08/23(火) 21:14:43ID:???
カンマ区切りのデータから、必要な要素を取り出す方法を教えていただきたいです。

太郎,男,20才
花子,女,21才
健太,男,22才
 ・
 ・
というデータがname.datというファイルでcgiと同じディレクトリにあり、
パラメータとして'健太'を与えてやると、'22才'と返ってくるようなスクリプトは、どう書けばいいのでしょうか。
よろしくお願いします。
0118nobodyさん2005/08/23(火) 21:22:48ID:???
open IN, 'name.dat';
while (<IN>) {
 chomp;
 my @tmp = split /,/;
 $name2age{$tmp[0]} = $tmp[2];
}
close IN;
print $name2age{'健太'};
ハッシュのキーに漢字ってキモいな
0119nobodyさん2005/08/23(火) 21:28:56ID:???
kenta -> '健太'
みたいなハッシュを別に作って解決

(゚∀。)アリャ?
0120nobodyさん2005/08/23(火) 21:49:40ID:???
>>118
>>119
ありがとうございます。試してみます。
0121nobodyさん2005/08/24(水) 01:00:02ID:???
>>116
できるよ。
でもそれがセキュリティホールになるのかどうかは知らない。
0122nobodyさん2005/08/24(水) 01:04:27ID:???
>>116
面白そうだね。やってみようかな。
0123nobodyさん2005/08/24(水) 01:11:31ID:???
クリップボード覗いて何が楽しいんだ?
0124nobodyさん2005/08/24(水) 01:11:32ID:???
onLoadでページ開いた瞬間に別窓へsubmitして即閉じるとか?
いずれにせよバレバレっぽいなぁ
0125nobodyさん2005/08/24(水) 01:12:47ID:???
>>124
XMLHttpReq略 ならバレバレではないけど。
できるけど、何? って感じ。
0126nobodyさん2005/08/24(水) 01:16:54ID:???
今流行りのajaxだにゃん。
0127nobodyさん2005/08/24(水) 04:39:31ID:???
>>116
板違い。
http://pc8.2ch.net/test/read.cgi/sec/1005185421/
0128nobodyさん2005/08/24(水) 05:33:37ID:???
質問です。
PCからは書き込みができるのですが携帯(�@モード)からは書き込みはおろか管理画面へすら入れません。
CGI本体のソースはこちらになります。
http://namihei.zone.ne.jp/upup/up/44694.txt
他にはlogファイルとjcode.plを使います。
enctype="multipart/form-data"あたりに問題があるように思うのですが行き詰まってしまいました。
どこをどのようにすれば携帯から書き込めるようになるでしょうか?
01291282005/08/24(水) 05:37:30ID:???
すいません。直接リンクだと403になってしまうようです。
ttp://namihei.zone.ne.jp/upup/up/44694.txt
0130nobodyさん2005/08/24(水) 06:19:55ID:???
>>128
原因わかってるならenctype="multipart/form-data"を消せばいいやん
それはファイル添付するときのenctypeだし
どうしてもenctype書きたいならenctype="x-www-form-urlencoded"で
0131nobodyさん2005/08/24(水) 07:33:16ID:???
>>128
マルチかよ答えるんじゃなかった
氏ね市ね詩ね氏ね市ね詩ね氏ね市ね詩ね氏ね市ね詩ね氏ね市ね詩ね氏ね市ね詩ね
01321282005/08/24(水) 07:58:30ID:???
>>130
サンクスコ
0133nobodyさん2005/08/24(水) 08:47:43ID:???
$res[131] = new m9('a')->pugyaaa();
0134nobodyさん2005/08/24(水) 09:45:36ID:???
cat unko*.txt > unkofile.txt と同じことをperlでどういう風に書いたらいいでしょうか?
ファイルを開いて読んで配列に入れてから書き込むを永遠と繰り返すしかないんでしょうか。
0135nobodyさん2005/08/24(水) 11:03:29ID:???
>>134
#!/usr/bin/perl
`cat unko*.txt > unkofile.txt`;
0136nobodyさん2005/08/24(水) 11:04:23ID:ephPxiIZ
unko.txt
0137nobodyさん2005/08/24(水) 11:15:53ID:???
外部プログラムは一切使えない(インストールされていない)ので
他の方法お願いします。
0138nobodyさん2005/08/24(水) 11:24:30ID:???
>>134
ファイルを開いて書き込むのを繰り返すのが普通。ただし
配列に入れるのは無駄なので読んだらどんどん書き出せ。
.
0139nobodyさん2005/08/24(水) 11:44:21ID:???
>>138
ありが�d できますたっ
0140nobodyさん2005/08/24(水) 13:14:34ID:???
>>134 >>139
解決したみたいだが

perl -pe "" unko*.txt > unkofile.txt
0141nobodyさん2005/08/24(水) 15:15:16ID:???
投票システムを作ろうとしているのですが、アドバイスお願いします。
パラメータ$goodsnumに入れた商品番号$tmp[0]に対する得票数$tmp[1]を
カウントアップさせたいのですが、ログファイルがうまく更新されません。
コードは以下の通りです。

open(LOG, "+<$file");
flock(LOG,2);
print "Content-type: text/html\n\n";
while ($line = <LOG>) {
 @tmp = split /,/,"$line";
 if ("$tmp[0]" eq "$goodsnum"){
   seek(IN,0,0);
   $tmp[1] ++;
   print LOG "$tmp[0],$tmp[1]\n";
   truncate(IN,tell());
   print "商品番号$tmp[0]の得票数は$tmp[1]";
 }
}
flock(LOG,8);
close(LOG);

期待する結果(ログファイルの内容)
実行前 syohin555,0 → 実行後 syohin555,1

実際の結果(ログファイルの内容)
実行前 syohin555,0 → 実行後 syohin555,0[改行]syohin555.1

ログファイルには他にも商品の投票データがあり、パラメータで渡した商品のみ、カウントアップさせる企てです。
ごちゃごちゃして申し訳ありません。どうぞよろしくお願いします。
0142nobodyさん2005/08/24(水) 15:23:02ID:???
>>141
> seek(IN,0,0);
> truncate(IN,tell());
INって何。
0143nobodyさん2005/08/24(水) 15:28:01ID:???
>>142
あ!すみません。そこも'LOG'です。
もうしわけございませんでした。
0144nobodyさん2005/08/24(水) 15:56:30ID:???
>>141
一行の長さが不定なテキストデータを、読み出しながら書き出すのは無茶。
得票数が 9 => 10 になったらまずいよね。
全部読み込んでから全部書き出すのが無難じゃないかな。
0145nobodyさん2005/08/24(水) 16:05:56ID:???
>>141
>ログファイルには他にも商品の投票データがあり
おいおい、だめじゃん
0146nobodyさん2005/08/24(水) 16:10:26ID:???
seekもtruncateもwhileの外でやらないとね。
chomp;がないのに¥nつけると改行だけ増える罠。
根本的に流れがおかしい希ガス。
01471412005/08/24(水) 16:15:29ID:???
どうも無茶なことをしてるようですんません。
なんとか頑張ってみます(; ;)
01481412005/08/24(水) 17:33:40ID:???
駄目ですorz
大まかな構想を練っているのですが、アドバイス頂けますでしょうか。

1.ログファイルを開く
2.改行で切り分けて@ary1にいれる
3.$ary1[0],[1],[2]...をそれぞれカンマで切り分けて@ary2に入れる
4.whileを使って$ary2[0]がパラメータに合致するノードを探す
5.見つかったら$ary2[1]をカウントアップ。
6.@ary1をログファイルに上書きする

こんな感じでしょうか?
頭が爆発しそうなのでよろしくお願いします。
0149nobodyさん2005/08/24(水) 17:43:24ID:???
>>148
大まかな流れはそんな感じで良いと思う。
あと、得票数のデータは配列にするんじゃなくてハッシュにするとやりやすいと思う。
01501412005/08/24(水) 17:51:17ID:???
>>149
ハッシュですか。調べてやってみます。
ありがとうございました。
0151nobodyさん2005/08/24(水) 18:00:22ID:???
・ログファイル開く
・foreachかwhileで一行ずつ読み込む
・カンマで区切り、それぞれを変数で区切る
・最初の要素とパラメタが一致すれば、最後の要素をインクリメント
・3つの変数をカンマ区切りで配列に
・処理終了後、配列をログファイルに上書き

じゃだめなのか
0152nobodyさん2005/08/24(水) 18:02:50ID:???
適当で動くかわからないけど、流れを理解するため重視で。

open(LOG, "+<$file");
print "Content-type: text/html\n\n";
while (<LOG>) {
chomp;
@tmp = split /,/;
if ($tmp[0] eq $goodsnum){ $tmp[1] ++; }
push(@txt, "$tmp[0],$tmp[1]\n");
print "商品番号$tmp[0]の得票数は$tmp[1]";
}
seek(LOG, 0, 0);
print LOG @txt;
truncate (LOG, tell(LOG));
close(LOG);

ファイルの内容を丸まる配列に入れちゃうのは初心者の処理だけど、まぁ後は理解して改造してくれ。
01531412005/08/24(水) 18:13:54ID:???
ででで、でキタ━━━━(゚∀゚)━━━━ッ!!と思う。
もう丸一日かまってるから混乱してきた。
最終的なコードはこうなりました。
みんなありがとう!

@ary = ();
open(LOG, "+<$file");
flock(LOG,2);
print "Content-type: text/html\n\n";
while ($line = <LOG>) {
 chomp($line);
 @tmp = split /,/,"$line";
 if ("$tmp[0]" eq "$goodsnum"){
  $tmp[1] ++;
  push(@ary,"$tmp[0],$tmp[1]\n");
 }else{
  push(@ary,"$tmp[0],$tmp[1]\n");
 }
}
seek(LOG, 0, 0);
print LOG @ary;
truncate (LOG, tell(LOG));
flock(LOG,8);
close(LOG);

>>151
>>152
ありがとうございます。
今から確認してみます。
0154nobodyさん2005/08/24(水) 19:59:02ID:???
変数に入った条件式を使ってif文って作れませんか?

例えば、こんな感じで。

$opt = "or";
print "OR : OK" if(1 == 1 $opt 2 == 1);

$opt = "and";
print "AND : OK" if(1 == 1 $opt 2 == 1);

[表示結果]
OR : OK
0155nobodyさん2005/08/24(水) 20:02:21ID:???
eval
01561542005/08/24(水) 20:09:36ID:???
>>155
$opt = "or";
print "OR : OK" if(1 == 1 eval($opt) 2 == 1);
としても、

$opt = "or";
print "OR : OK" eval(if(1 == 1 $opt 2 == 1));
としても、正常に動かないのですが・・・

evalつけるところ間違えてます・・・?
0157nobodyさん2005/08/24(水) 20:23:46ID:???
>>156
$opt = "or";
eval "print 'OR: OK' if 1 == 1 $opt 2 == 1";
0158nobodyさん2005/08/24(水) 20:31:32ID:???
>>154-157
if eval "1 == 1 $opt 2 == 1";
01591542005/08/24(水) 20:59:12ID:???
>>158
サンクス
うまくいきました。
01601542005/08/24(水) 21:58:28ID:???
すいません、もひとついいですか?

evalを使うことで、演算子の変数を展開して条件分岐してくれるようにはなったんですが、
演算子以外の変数が合った場合、なぜか上手く動作しません。

$data1 = "hogehoge";
$data2 = "foofoo";
$ptn1 = "hoge";
$ptn2 = "boo";
$opt = "or";

print "OK" if( eval"($data1 =~ m/$ptn1/) $opt ($data2 =~ m/$ptn2/)" );

欲しい結果は当然、OKです。
0161nobodyさん2005/08/24(水) 22:02:14ID:???
>>154
ダブルクオテーション囲んでるから、evalが解釈するのは
hogehoge =~ m/hoge/ or ...
になってる。
0162nobodyさん2005/08/24(水) 22:04:18ID:???
>>160
$data1, $data2 の頭にバックスラッシュ入れて変数展開抑制
0163nobodyさん2005/08/24(水) 22:06:32ID:???
試しにeval()にしてみたんですが、やっぱり動きませんorz
0164nobodyさん2005/08/24(水) 22:09:12ID:???
>>162
ありがとう!
0165nobodyさん2005/08/24(水) 22:16:54ID:???
>>164
eval じゃなくて printした時にどういう文字列になってるか
考えるなり確認した方が良いよ。
0166nobodyさん2005/08/24(水) 23:13:17ID:PXiCgge7
質問させて下さい。

csvを読み込んで、表示するというプログラムを
書いていますが、データはShift_JISなので
Shift_JisをUTF-8に変換したいです。

ネットで調べるとJcode.pmが必要と書いてありました。
早速使ってみたところ、私が使っているサーバは
標準モジュールすら入っていないサーバなので
Jcode.pmだけいれてもダメでした。

そこで、友人のサーバでやろうと思っていますが
友人のサーバはperl5.0なんとかで
結構古いです。標準的なモジュールは入っています。

そこで質問です。

�@この環境にJcode.pmファイルだけ置けばうごくように
なりますか?
�AJcode.pmを置く事で他のperlプログラムが動かなくなったりしますか?
�BJcode.pmを置いてうごいたとして、shift_jisのまま表示するのと
  UTF8に変換してから表示するのでは、処理のスピードに大きな
  違いがでますか?

自己解決不可能だったため。。おねがいします。。orz

0167nobodyさん2005/08/24(水) 23:23:23ID:???
Jcodeは5.4以上必要だった気がする。

にしても5.0はねぇだろ。ちゃんと調べろ
0168nobodyさん2005/08/24(水) 23:52:46ID:???
お前もうjcode.plでいいよ
0169nobodyさん2005/08/24(水) 23:55:26ID:???
もしくは nkf -w
0170nobodyさん2005/08/25(木) 00:08:57ID:PZEhiYYs
>>168
jcode.plはUTF-8未対応

分かってて書いてると思うがw
0171nobodyさん2005/08/25(木) 01:32:53ID:???
Perl5.6以上にするのが一番の早道
0172nobodyさん2005/08/25(木) 08:22:01ID:???
>>166
1. コピーで突っ込んだことが無いので、よく分からないけど、
最低でもJcode::*の辺りも必要だと思う。
2. それは無い。
3. UTF-8変換すると、かなり遅くなるはず。

telnet/sshが使える環境なら、そっちからきちんとインストールしたほうがいい。

>>167
5.004から動くはず。
5.005_03で動作してるよ。
0173nobodyさん2005/08/25(木) 15:17:31ID:???
>>166
そもそも166が使ってるサーバのPerlのバージョンがわからんと話にならん。
さらにサーバ会社も晒せば同じ環境に居る人が答えてくれるかもしれん。
0174nobodyさん2005/08/25(木) 16:09:06ID:???
>>167
>にしても5.0はねぇだろ。
「5.4」も酷いぞ。

>>171
5.8.1 以上の間違いだろう。

>>173
「標準モジュールすら入っていないサーバ」は @nifty (@homepage) の
別名と考えていいかと。そうなら 5.004 だか 5.005 だかその辺だったと思う。

>>166
他にもこういう選択肢もある。
http://search.cpan.org/~hio/Unicode-Japanese-0.27/
0175nobodyさん2005/08/25(木) 17:18:03ID:???
すみません、Activeperlの5.8.7で、WindowsXPの日本語フォルダを扱いたいのですが、
Encodeでいろいろやってみたもののうまくいきませんでした。

例えば、
while(<c:/bin/jane/Logs/2ch/ネット関係/WebProg/*.dat>) { }
みたいに、あるフォルダの下の全ファイルをさらうとかしたいのですが、
日本語が含まれているとうまくいきません。

どうすればよいのか、お願いします。
0176nobodyさん2005/08/25(木) 18:01:49ID:???
175追記
シフトJISでスクリプトを書くと、
use encoding "shiftjis";
を入れるとうまくいかず、入れないとうまくいきます。
(ただし、それを入れないと今度は他の日本語を扱う部分がおかしくなってしまいます)
0177nobodyさん2005/08/25(木) 18:14:31ID:???
>>175
>>13
0178nobodyさん2005/08/25(木) 18:28:37ID:???
>>177
そこを読んでいろいろ試してみたのですが…
0179nobodyさん2005/08/25(木) 19:02:49ID:ZmEBADhu
長文だった場合、ある長さに区切るようなことをしたいんだけど
↓こんな感じ

こんにちは、Perlスクリプトについて質問があり・・・[長文のため省略しました。続きはこちら]

↑こんな感じで文章を省略したいんですけど、
区切ったバイトが2byte文字か判定する方法ってありませんか?現状文字化けしてます。。。
0180nobodyさん2005/08/25(木) 19:47:47ID:???
>>179
>>11 のテクニックの項とか >>13 とか。
0181nobodyさん2005/08/25(木) 19:57:49ID:???
>>179
$str= = Jcode->new($str)->jfold($width);
で\n区切り。ただし途中の\nは無視する。
0182nobodyさん2005/08/25(木) 20:00:24ID:???
use Jcode;
$st = Jcode->new($str)->jfold($width);

な。
0183nobodyさん2005/08/25(木) 20:24:33ID:???
超メンドくさいやり方

$char_count = 10;
$body = "こんにちは、Perlスクリプトについて質問があります。";
$ascii = '[\x00-\x7F]';
$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';
@chars = $body =~ /($ascii|$twoBytes|$threeBytes)/og;
for ($count = 0; $count < $char_count; $count++) {
 $str .= $chars[$count];
}

$strは「こんにちわ、Perl」となる
メンドくせ
0184nobodyさん2005/08/25(木) 20:47:01ID:ZmEBADhu
>>181,>>182
レスありがとうございます。自分はjcode使ってないのですが、それでうまくいくのなら試してみたいと思います。

>>183
この手のやり方を求めていました。
実際にやってみたのですが、うまくいきませんでした。
Shift-JIS限定のプログラムなのですが、Shift-JISではどのようにして日本語のフラグを立てているのでしょうか?
色々と検索しているのですが見つかりません。
0185nobodyさん2005/08/25(木) 20:48:56ID:???
eucで
0186nobodyさん2005/08/25(木) 20:49:51ID:???
>>184
文字列はEUC前提。
この場合なら、一回jcodeで$bodyをEUCに変換してから。
で、$strが完成したら、それをSJISに戻せば解決
0187nobodyさん2005/08/25(木) 20:57:13ID:???
$str =~ /^([\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])*$/ or chop $str;
0188nobodyさん2005/08/25(木) 20:57:34ID:???
use encoding 'Shift-jis';
でsjisでも正規表現がうまく動くと聞いているが俺は試してない。
だとしても>>183並にめんどくさいルーチンを通さなきゃいけない。
出力する文字コードがsjis固定でよいのなら

use Jcode;
$str = Jcode->new($str)->jfold($width)->sjis();

だ。
0189nobodyさん2005/08/25(木) 20:59:29ID:???
ちなみに<br>の場合、

$str = Jcode->new($str)->jfold( $width, "<br>" )->sjis();

だ。
0190nobodyさん2005/08/25(木) 21:47:57ID:ZmEBADhu
うーん・・・eucですかぁ・・・
ところで、jcode通すと、半角カタカナが文字化けしますよね?
0191nobodyさん2005/08/25(木) 22:06:41ID:???
&jcode::convert (\$str, "euc");
とかだけだと文字化けするケースがある
&jcode::convert (\$str, "euc", "sjis");
のように、変換前の文字コードを渡すことで解決できる場合もある
0192nobodyさん2005/08/25(木) 22:37:57ID:ZmEBADhu
>>191
なるほど!
0193nobodyさん2005/08/25(木) 22:47:27ID:???
>>187が無視されている件について
0194nobodyさん2005/08/25(木) 22:49:28ID:???
>>175
スクリプトの文字コードをShift_JISにするか、
そのフォルダを示す文字列の文字コードをShift_JISに変換する。
01951932005/08/25(木) 22:58:37ID:???
あ、自作自演に突っ込みいれちゃってたらごめん。
01961872005/08/25(木) 23:29:04ID:???
わざわざ名乗り出るのも何だが俺は別人な。
01971972005/08/25(木) 23:39:21ID:???
俺は ROM ってた
01981932005/08/26(金) 00:10:46ID:???
>>196
うん、ごめん、了解してる。

どうでもいいけど、質問者は回答に何らかのリアクション取って欲しい。
「ワケワカラン(AA略」とかでもいいからさ、
と思う初秋の夜。


回答者たち、お疲れさま。

>>197もおつ。
01991752005/08/26(金) 01:24:12ID:???
>>194
ありがとうございます。
とりあえず下のような感じでうまくいきました。
スクリプトはシフトJISで書いています。


use encoding "shiftjis";
use Encode qw/ encode decode /;

$dir = "c:/bin/jane/Logs/2ch/ネット関係/WebProg";

opendir(DIR, encode("shiftjis", $dir));
@a = readdir(DIR);
closedir(DIR);
foreach(@a) {
  $file = $dir . "/" . $_;
  if($file =~ /dat$/) {
    open(FILE, encode("shiftjis", $file));
    while(<FILE>) {
      $line = decode("shiftjis", $_);
      if($line =~ /回答/) {
        print $line;
      }
    }
    close(FILE);
  }
}

もっとスマートな書き方があればいいんですが…。
0200nobodyさん2005/08/26(金) 04:12:47ID:0igOMeuL
>>193
?>>187は何に使うんでしょうか?
0201nobodyさん2005/08/26(金) 04:16:07ID:0igOMeuL
>>191
ところで、jcodeを通すと半角カタカナが文字化けする件ですが、”場合もある”ということは、やっぱり完全解決は無理っぽいですね。
商用のサイトではどのようにやってるんでしょう?半角カタカナを使いつつ、日本語を省略しているサイトをよく見ます。
0202nobodyさん2005/08/26(金) 04:25:58ID:???
なんでeucで書かないのかなぁ〜
0203nobodyさん2005/08/26(金) 07:19:22ID:???
>>199
Shift_JISで書くなら、直接
while(glob('c:/bin/jane/Logs/2ch/ネット関係/WebProg/*.dat')) {}
でいけない?

>>200
$count = 45;
$body = "こんにちは、Perlスクリプトについて質問があります。";
$attention = "…[長文のため省略しました。続きはこちら] ";
if (length($body) > $count){
$body = substr($body, 0, $count);
$body =~ /^([\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])*$/ or chop $body;
$body .= $attention;
}
print $body;
0204nobodyさん2005/08/26(金) 07:20:33ID:???
>>201
みんながjcode.pl使ってるわけじゃないし。

use String::Multibyte;

$mbcs = String::Multibyte->new('ShiftJIS');
$count = 22;
$body = "こんにちは、Perlスクリプトについて質問があります。";
$attention = "…[長文のため省略しました。続きはこちら] ";
if ($mbcs->length($body) > $count){
$body = $mbcs->substr($body, 0, $count). $attention;
}
print $body;

--
use encoding qw(shiftjis);

$count = 22;
$body = "こんにちは、Perlスクリプトについて質問があります。";
$attention = "…[長文のため省略しました。続きはこちら] ";

if (length($body) > $count){
$body = substr($body, 0, $count). $attention;
}
print $body;
0205nobodyさん2005/08/26(金) 07:35:48ID:???
それと、jcode.plが自動判別で文字化けする主な原因は、
jcode.plがShift_JISの定義を厳密に行っている(半角カナを含めない)からで、
入力側の文字コードを指定してやれば問題ないはず。
0206nobodyさん2005/08/26(金) 09:10:00ID:???
質問です。

JavaScript の escape 関数でエンコードされた文字列
(%uXXXX形式)を Perl でデコードしようとしています。
次のようにやると全てマルチバイト文字の場合はうまくいくのですが、
半角文字が入っているとうまくデコードできないようでした。

use Jcode;

$a = '%u3042%u3044%u3046%u3048%u304A'; # あいうえお
$b = '%u3042a%u3044b'; # あaいb

$a =~ s/%u([a-fA-F0-9]{4})/pack('H4', $1)/ge;
$b =~ s/%u([a-fA-F0-9]{4})/pack('H4', $1)/ge;

print Jcode::convert($a, 'euc', 'ucs2'), "\n";
# あいうえお と表示されOK
print Jcode::convert($b, 'euc', 'ucs2'), "\n";
# あ豹? と表示される。a以降文字化け

環境は、Linux, Perl 5.8.4, Jcode.pm 0.88 です。
Windows, ActivePerl 5.8.6, Jcode.pm 0.86 の環境で出力を sjis に
変えても同じでした。

Jcode.pm で変換できる方法はありますでしょうか?
Encode等、他の方法でもありましたらよろしくお願いします。
0207nobodyさん2005/08/26(金) 10:23:29ID:???
>>206
$bが正しいucs2じゃないからじゃないだろうか。

$b = '%u3042%u0061%u3044%u0062'; # あaいb

となるはずだと思うのだが。
0208nobodyさん2005/08/26(金) 10:57:46ID:???
207のように%u0061等と書く以外に、%u〜以外の1バイト文字に
\x00を補う方法も考えられる。ブラウザなどからその形で送られて
くるので手出しできないとするとこの方法の方がいいかもしれん。

$b =~ s/(?:%u([a-fA-F0-9]{4})|(.))/($1 ne '')? pack('H4', $1): "\x00$2"/ge;
02092062005/08/26(金) 11:46:38ID:???
>>207 >>208
ありがとうございました。うまくいきました。

正しいucs2ではなかったのですね。
アドバイス通り修正することで、Jcodeによる文字コードの
自動判別も使えるようになりました!

print jcode($b)->euc, "\n"; # OK!
0210nobodyさん2005/08/26(金) 13:56:08ID:0igOMeuL
>>203
ありがとうございます!
$body =~ /^([\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])*$/ or chop $body;
↑こっちのやりかたで完璧でした。ShiftJISのままできました。

>>202
うーん。まぁ今となっては確かにeucでやった方がいいのかなぁ?
サイト上でテキスト(HTML)がSJISでCGIだけEUCだとチグハグ感がありますので。
02111832005/08/26(金) 21:24:32ID:???
>>210
SJIS好きでもEUCに慣れた方がいいぞ
俺みたいにならんようにな('A`)
0212nobodyさん2005/08/26(金) 22:01:27ID:???
>>210
出力だけShift_JISにすれば?
0213nobodyさん2005/08/27(土) 11:09:24ID:???
>>211
うーん。そうですよねぇ。真摯に受け止めます。

>>212
それも手間じゃないですか?
そうそう、jcodeを使うと半角が化ける以外に、処理が遅くなるっていうのがありました。
最近はハードのスペックが上がったから問題ないとも思うのですが。
0214nobodyさん2005/08/27(土) 11:54:37ID:???
、ハ、餞JIS、ヌヘ隍�ウ、ネ、ートヒ、キ、ソ、鬘ゥ
2、チ、网簗ムエケ、キ、ハ、、、キ。」
0215nobodyさん2005/08/27(土) 12:25:45ID:???
既出だけど、半角カナが化けるのはjcodeが悪いわけじゃないから。
ロジックが甘いか、工夫が足りないだけ。

EUCだと正規表現で楽できることもあるけど、クライアントのほとんどはSJISの住人だから。
SJISの住人相手にはSJISで組んだほうがメリットになることも多いよ。

そもそも、最近はjcodeの出番がめっきり減った気がする。
0216nobodyさん2005/08/27(土) 13:01:28ID:???
内部処理やスクリプトの文字コードにSJIS使うのは手間増えるだけだから
オススメしないけどな。入り口と出口で変換する方が楽。

中身は古い人はEUCで、イマドキの人はunicodeが良いでしょう。
0217nobodyさん2005/08/27(土) 14:53:32ID:???
Unicode使うとSJISなんて使う気になれなくなるよ
0218nobodyさん2005/08/27(土) 19:10:26ID:???
ならなくなる じゃないか?
0219nobodyさん2005/08/27(土) 19:25:06ID:???
Unicodeってそんなにいいのか?(他のスレで散々既出だと思うが)
grep等のツールが使えなくなるのがちと痛いんだよなぁ。
新しめのLinux環境だと使えるのかな。。?
0220nobodyさん2005/08/27(土) 22:05:10ID:???
Grepの方をどうにかしようぜ
0221nobodyさん2005/08/28(日) 16:08:49ID:???
WinXP、ActivePerl6.8.1です。
use encodingやuse Encodeをソースに記述し起動させると、「問題が発生しました。ご迷惑をおかけして(ry」が出てPerlが強制終了してしまいます。
Encode.pmをコマンドラインで直接立ち上がげても同じでした。
何が原因でしょうか?
0222nobodyさん2005/08/28(日) 16:11:45ID:AszUkSZs
質問させてください。

Encode.pmがインストールされている環境とそうでない環境とで、プログラム内部で処理を分けようと思っているのですが、なぜかうまく行きません。

$Eflag = eval('use Encode qw/ from_to :fallbacks /; 1');

とやっておいて、

if ($Eflag) {
from_to($_, 'utf8', 'cp932', FB_XMLCREF);
}

という風に処理したいのですが、evalを通したらfrom_toだけだとうまくインポートできるのですが、この書き方だと:fallbacksのほうだけインポートされないようです。
普通にevalを通さないで、use Encode qw/ from_to :fallbacks /;と書いたら正常に動くのですが、これだとEncode.pmのない環境ではコンパイル時エラーが出てしまうので困っています。

ここでevalを通すと、:fallbackはインポートされないのでしょうか?
うまく処理する方法または、これに代わる何かいいアイデア等ございましたらぜひとも教えていただきたく思います。
0223nobodyさん2005/08/28(日) 16:50:57ID:???
>>221
とりあえず、アンインストールして、ディレクトリも全部消してから、再インストール。
できれば、最新のバージョンのものを。

>>222
BEGIN{
eval("use Encode qw(:fallbacks from_to)");
$eflag = ($@ ? 0 : 1);
}
if ($eflag){
from_to($d, 'utf8', 'cp932', FB_XMLCREF);
print $d;
}
0224nobodyさん2005/08/28(日) 17:01:40ID:???
>WinXP、ActivePerl6.8.1です。
ここスルーでつか?
0225nobodyさん2005/08/28(日) 17:05:14ID:???
「ここだけ○年進んでるスレ」の類から来たんだろう
0226nobodyさん2005/08/28(日) 18:08:27ID:AszUkSZs
>>223
どうもありがとうございました。
参考にさせてもらったところ無事問題が解決できました。
0227nobodyさん2005/08/29(月) 02:19:20ID:???
すみません質問します。メールを登録アドレスに配信するシステム(メルマガを発行しようと思ってます)を考えているのですが、アドレスが行ごとに入力されているファイルと、実行用のperlを用意して、

$sendmail = '/usr/sbin/sendmail';
open(LOG,"$datfile");
flock(LOG, LOCK_EX);
@alldata = <LOG>;
close(LOG);
foreach $mail (@alldata){
$mail =~ s/ //g;
open(MAIL,"| $sendmail -t");
print MAIL "To: $mail\n";
print MAIL "From: magazine\@foo.co.jp\n";
print MAIL "Subject: bar\n\n";
print MAIL "$message\n";
close(MAIL);
}

メールアドレスが格納されているファイル($datfile)を展開して、各行を$mailに代入(万が一を考えて半角スペースの除去も行っています)して、同じメールを送信しようとしているのですが、送信されるメールは、
差出人:ユーザーID
受信者:$mail該当者
で、本文に、

From: [email protected]
Subject: bar

$messageに入ってる文字列

と出てしまいます。

試しに$mailの部分の記述を実在するアドレスに差し替えたところ、$datafileの行数だけ(その回数だけforeachが実行されるから)記入したアドレスにメールが届きましたが、その場合は、差出人にFrom: の内容が、件名にSubject: の内容が入り、本文にこれらは出ませんでした。

なぜ、ズレが生じるのでしょうか?根本的に理解できてないかもしれません。お教えいただけると幸いです。
0228nobodyさん2005/08/29(月) 02:31:55ID:???
$mail =~ tr/\r\n//d; とでもしとけ。
0229nobodyさん2005/08/29(月) 02:32:27ID:???
SPAM業者はカエレ
0230nobodyさん2005/08/29(月) 02:35:14ID:???
>>228
改行コードが残っていて、改行のみの行が存在し、それ以降が本文扱いにされているのでしょうか。
有難う御座います。早速試してみたいと思います。
0231nobodyさん2005/08/29(月) 02:39:07ID:???
>>228
うまくいきました。有難う御座いました。

>>229
そういう誤解を招くと思ってメルマガと言ったんですが、信用はないですよね。
気分を害してしまい申し訳ありませんでした。
0232nobodyさん2005/08/29(月) 22:53:35ID:2Z/c1c0/
ごめんなさい。自分では解決できないので
質問させて下さい。

perl 5.0 linux apache環境です。(あまり環境は関係ない質問ですが。。)

国語,30,53,23,23
算数,35,35,12,64
公民,43,43,34,56
日本史,33,2,2,2

といった感じのCSVファイルがあったとして一部のデータのみ書き換えるという処理は
可能でしょうか?

つまり80行目の3列目だけデータを書き換えるとか、公民の5列目(56の部分)だけ56を52にするとか
することは可能でしょうか?

私の知識では
このCSVをすべて@配列にいれてこれをforeachで一行一行読んで5つにカンマでsplitして変数に保存していき、

($date.=date[0].",".date[1].",".date[2].",".date[3].",".date[4]."\n" )

date[0]が公民だったら4行目を52にして

($date.=date[0].",".date[1].",".date[2].",".date[3].",52\n" )

$dateを print FILEHANDLE date.csv;

ですべて上書き保存するという非効率な方法しか思いつきません。

要所部分だけ書き換えるという方法がありましたら、ないかも知れませんが。。
教えていただければ幸いです。
0233nobodyさん2005/08/29(月) 23:02:38ID:???
>>232
その環境でDB使わないで、あくまでcsvで行くのですね…。

すべて配列に入れるよりも、
正規表現で「公民」にマッチする行だけsplitして書き換えては。
0234nobodyさん2005/08/29(月) 23:06:26ID:???
>>232
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq5.html#How_do_I_change_one_line_in_a_fi
http://www.rfs.jp/sitebuilder/perl/05/func/join.html
02352322005/08/29(月) 23:36:34ID:2Z/c1c0/
>>233

ありがとうございます。mysqlもpostgreも使えない環境です。。
仰るとおりの方法にしたいのですが、
splitして該当の行だけ書き換えるという処理がわかりません。
もしよろしければ、ヒント下さい。

>>234

ありがとうございます。
読んでみましたが、私が232で試そうとしている
方法のようです。確かにこれが一番簡単で
私のような初心者にもわかりやすいのですが、
書き換える箇所が何箇所もあると
同じファイルを1回の処理で何回も上書き保存しないと
いけない重たい処理になってしまいます><
0236nobodyさん2005/08/29(月) 23:36:40ID:???
>>232
扱うファイルが小さいなら、DBを使うよりも
現在のようにシーケンシャルファイルを扱う方法のままが手軽でいいかも。

その上で、
1. 2次元の表を扱うので2次元配列に読み込む
2. ファイルからの読み込み、ファイルへの書き出しは
 push, join, map 等を使って簡潔に書けるので、その辺りを調べてみる
といいと思う。

my @data;
open(IN, 'data.csv');
for (<IN>) {  # ファイルサイズが大きいなら while で
  push(@data, [ split(/,/) ]);
}
close(IN);

$data[79][2] = 'hoge';  # 80行3列を書き換える
$data[2][4] = 52;  # 公民の5列目を52に

open(OUT, '> data.csv');
print OUT map { join(',', @{$_}) . "\n" } @data;
close(OUT);

# チェックしてないのでミスありそう

こんな感じはどうでしょう?
0237nobodyさん2005/08/29(月) 23:39:03ID:???
つStorable
02382322005/08/30(火) 00:03:14ID:x5m98we0
>>236

ありがとうございます。
その方法でやってみます。
確かめていないのでうごくかはわかりませんが、
取次ぎお礼まで!
ありがとうございました。
0239nobodyさん2005/08/30(火) 01:18:03ID:???
宿題くさいな
0240nobodyさん2005/08/30(火) 11:27:34ID:???
>>237
とか、テキストにしときたいなら Data::Dumper とかのほうが簡単
0241nobodyさん2005/08/31(水) 14:49:41ID:2aj3BZHt
変数のサイズを知りたい時は何を使えばいいんでしたっけ?
0242nobodyさん2005/08/31(水) 14:56:42ID:???
すいません、思い出しました。lengthでした。
0243nobodyさん2005/08/31(水) 16:24:59ID:???
ソースの中に
-----
next if (!$acl{$base_remote_user,$minfo->{'dir'}} &&
!$acl{$base_remote_user,"*"});
-----
という箇所があったのですが、中括弧($acl{})の中の意味が分かりません。
中括弧でかこって中にカンマというのはどういう意味でしょうか?
0244nobodyさん2005/08/31(水) 16:38:21ID:???
>>243
多次元配列のエミュレーション用の機能で
$foo{$a,$b,$c}
は
$foo{join($;, $a, $b, $c)}
と同じ。詳しくはperlvar(1)の$;の項などを参照されたい。
0245nobodyさん2005/08/31(水) 18:22:07ID:???
文字(A,a)をコード(\x41,\x61)に変換したいのですがどのようにすればいいでしょうか?
また、逆にコードを文字に戻したりもしたいのです。
0246nobodyさん2005/08/31(水) 18:23:01ID:???
ageます
0247nobodyさん2005/08/31(水) 18:30:58ID:???
>>245
pack、unpack、ordあたり調べてきな。
# 実際に '\x' も付けて表記してるならevalで戻せるけどな。
02482432005/08/31(水) 18:46:38ID:???
>>244さん
なるほど、分かりました。
どうもありがとうございました。
0249nobodyさん2005/08/31(水) 19:01:48ID:???
>>245
あまりきれいに書けてないけど。例を。

for ('A', 'a') {
  print '\x' . unpack('H2', $_);
}
for ('\x41', '\x61') {
  /\\x(..)/;
  print pack('H2', $1);
}
0250nobodyさん2005/08/31(水) 19:11:24ID:4hPwGNyx
XMLRPC::Liteを使ってブログにを投稿しようとしてるんですが
日本語使うと文字化けしちゃって読めません。
# どうやらbase64に強制変換されてる様子。
どうすれば日本語を使えるようになるでしょうか。
なお現在のソースはイカの感じです。

use strict;
use XMLRPC::Lite;
use Jcode;

my $name = "name";
my $pass = "pass";
my $title = "たいとる";
my $description = "ほんぶん";

#&Jcode::convert(\$title,'utf-8');
#&Jcode::convert(\$description,'utf-8');

print $title;

my $msgresult = XMLRPC::Lite
-> proxy('http://blog.fc2.com/xmlrpc.php')
-> call('metaWeblog.newPost', "0", $name, $pass,
{
'title' => $title,
'description' => $description,
'mt_allow_comments' => 1, # must be int, not string
'mt_allow_pings' => 1 # must be int, not string
},
1
)
-> result;
0251nobodyさん2005/08/31(水) 21:12:32ID:HyyIksuT
ほんとに初歩的な事だと思うんですが…
if( $a == 0 || $a == 1 || $a == 2 || $a == 3 ){

$aに0、1、2、3のどれかが入っていたら…、という文なんですが、
これをもう少し簡潔に書くとどうなるでしょうか?
数字が0、1、2、3……10くらいまで続き、また別のグループで11〜20、21〜30までを
今はそれぞれelsifで処理しています。
効率が悪いかな?と思いまして…。よろしくお願いします。
0252nobodyさん2005/08/31(水) 21:19:36ID:ihFBKKnR
>>251
TIMTOWDI

if $a =~ /(\d+)/ and 0 <= $1 and $1 <= 30
if defined $a and 0 <= $1 and $1 <= 30
0253nobodyさん2005/08/31(水) 21:19:58ID:???
>>251
if ( 0 <= $a && $a <= 10 ) { }
elsif ( 11 <= $a && $a <= 20 ) { }
elsif ( 21 <= $a && $a <= 30 ) { }
0254nobodyさん2005/08/31(水) 21:24:22ID:???
>>251
書き方云々ではなく、その処理自体を何とかできんのか
02552512005/08/31(水) 22:24:49ID:???
レスありがとうございます!
>254
すみません、なんかこの処理を他に変える方法が今の自分にはわからなくて…
スキル不足ですね。勉強します。
0256nobodyさん2005/08/31(水) 22:28:33ID:ihFBKKnR
あとで思いついた
10ごとに区切る前提なら
my $flag = int $a / 10;
if ( $flag = 0 ) {}
...
if ( $flag = 3 ) {}

は?
0257nobodyさん2005/08/31(水) 23:09:37ID:???
if ($a =~ /[0-9]/) {}
if ($a =~ /1[0-9]/) {}
if ($a =~ /2[0-9]/) {}
0258nobodyさん2005/08/31(水) 23:15:40ID:???
こういう回りくどい処理が必要になったら
どこか設計が間違ってると疑った方がいい。
0259nobodyさん2005/09/01(木) 09:17:57ID:???
>>256
$flag という変数名を使う習慣は捨てたほうがいい。
(そもそも割り算の商はフラグじゃないし)

もし意味がフラグだったとしても何のフラグなのかあらわす単語を名前にしる。
02602502005/09/01(木) 10:18:56ID:pBV3XGF+
自己レスです。

'title' => $title,
'description' => $description,

の所を

'title' => XMLRPC::Data->type('string', $title),
'description' => XMLRPC::Data->type('string', $description),
とする事で解決しました。
# $title及び$descriptionの中身はutf-8に変換してます。
0261nobodyさん2005/09/01(木) 14:07:05ID:???
Linuxのコマンドをperlで実行させて、その結果を変数に格納したいのですが
下記のようなやり方だと出来ません
どのようにしたらよいのでしょうか?

$b = system("vuserinfo -l $a");
print $b;
0262nobodyさん2005/09/01(木) 14:37:00ID:???
>>261
$b = `vuserinfo -l $a`;
print $b;

systemはコマンドの戻り値が返されるのかな。
あと、openかsystem関数かでパイプを使う方法等もあったと思う。
0263nobodyさん2005/09/01(木) 14:49:32ID:???
>>262
ありがとうございました!とても助かりました・・
0264nobodyさん2005/09/01(木) 17:46:03ID:???
初心者スレなので一応言っておくけど、
>>252>>256>>257は色々間違ってるよ。
0265nobodyさん2005/09/01(木) 18:28:04ID:???
>>264
ほんとだ。すべて微妙に間違ってる…。
0266nobodyさん2005/09/01(木) 18:37:12ID:???
夏休みの宿題に正解教える訳なかろう・・
0267nobodyさん2005/09/01(木) 19:34:23ID:???
>>265
微妙どころじゃない気が…
0268nobodyさん2005/09/01(木) 21:28:02ID:???
しかし誰も間違っている箇所を指摘できない罠wwwm9(^Д^)プギャーーーー
0269nobodyさん2005/09/01(木) 21:29:53ID:???
そんなもん必死に指摘するほどでもないだろうに・・・
0270nobodyさん2005/09/02(金) 01:43:26ID:5yfALZxB
while($line = <FILE>) {
 push(@tmp, $line);
}
close(FILE);

で、

print @data;

とすると、2行目以降、各行の先頭に半角スペースが入ってしまうのですが、
何が原因でしょうか?
0271nobodyさん2005/09/02(金) 01:48:22ID:???
ファイルの2行目以降の先頭に半角スペースがあるから
02722702005/09/02(金) 01:50:31ID:5yfALZxB
>>271さん
それはないです。。。
1行ずつ

while($line = <FILE>) {
 print $line;
}
close(FILE);

とすると大丈夫なので。
0273nobodyさん2005/09/02(金) 01:54:04ID:???
マジレスすると、>>270のを実行しても、何も出てこない
0274nobodyさん2005/09/02(金) 01:54:19ID:???
ほんとは print FH "$newline\n@array"; みたいなことしてんだろ。
02752702005/09/02(金) 01:54:19ID:5yfALZxB
$line =~ s/ //g;

とやっても変化無しです。
0276nobodyさん2005/09/02(金) 01:54:50ID:???
@tmpに詰め込んで@dataを出力している点について
02772702005/09/02(金) 01:55:26ID:5yfALZxB
>>273さん
すみません、

open(FILE, $file);

が抜けてましたorz
0278nobodyさん2005/09/02(金) 01:56:30ID:???
>>273の言いたい事は>>276が言ってることだと思われ
02792702005/09/02(金) 01:57:14ID:5yfALZxB
>>276さん
すみません、書き込む時に間違えました。
手元のは大丈夫です。

あぁ、もうだめぽ。
0280nobodyさん2005/09/02(金) 01:58:11ID:???
もう一回ゼロから勉強してこような
0281nobodyさん2005/09/02(金) 02:00:22ID:???
print @temp;


print "@temp";



以上の違いを説明せよ
0282民主党2005/09/02(金) 02:36:21ID:9iT1X8+f
  ★★★ また韓国、意図的な、でっち上げ反日報道 ★★★
 韓国大手テレビ局の8月15日番組「日本軍731部隊の生体実験」が、実は真っ赤なウソ、中国映画の盗用でっち上げだった。
 韓国マスコミは反日番組で、この種のでっち上げ「歴史歪曲(わいきょく)」をよく行うが、今回の事件で 「日本糾弾ならウソも平気」 という腐敗体質が改めて確認された。

 番組では実験の様子を「白黒の記録フィルム風」に紹介したが、視聴者から「映画の場面と同じだ」との声が上がり、悪質なでっち上げが露呈した。
 この中国映画はカラー作品だが、テレビでは本物に見せかけて「白黒」に変えられており、意図的なでっち上げであることは明白。

 日本の 民 主 党 【岡田党首】 は、日本国内に数十万人もいる反日的な在日韓国・朝鮮人に、日本の選挙権を与え、 民 主 党 に投票させようと画策している。
 在日韓国・朝鮮人の大部分は、戦後のドサクサで勝手に密入国した不法滞在者とその子孫だが、「強制連行された」とウソをつき、被害者のフリをして日本国内に居座っている。
 収入があっても税金は一切払わず、さらに毎月二十数万円の生活保護をもらい、日本人の悪口を言いながら遊び暮らしている。
0283nobodyさん2005/09/02(金) 10:04:13ID:???
まずやらないとは思うが$,に空白を設定すればprint @tempでも空白入るよ。

% perl -e '@temp=("a\n", "b\n"); $,=" "; print @temp;'
a
b

0284nobodyさん2005/09/02(金) 12:41:24ID:???
>>270
Perlのバージョンは?
それから、問題が再現する最小のコードを作ってそのまま貼ってもらえると
アドバイスしやすいかな。

おれは昔(1〜2年ほど前)、print @hoge; とすると最初の行だけ先頭に
半角スペースが入ったことがあった。
print にスカラーやリストを渡した場合等は大丈夫なんだが、配列1つだけ
(もしくは先頭に配列変数だったかな)を渡すとそうなった。
(270さんと逆だなぁ。)
今、win & Linux 上で試してみたけど、そういう現象は起こらなかった。

もしかすると、Perl の、print あたりの実装上の問題かも。

# 今試して再現しなかったと書いたけど、なにぶん昔のことなので
# 方法を間違えているだけかも。
0285nobodyさん2005/09/02(金) 12:56:58ID:???
>>284だが、

どうやらおれが書いた問題は
>>281さんが指摘したことだったみたいだ。

多分、自分の場合は、ヒアドキュメントの中で変数展開を使おうとして
先頭に改行が入っていたのだった。

print <<END;
@hoge
END

これだと改行が入るので、苦し紛れにリファレンスとデリファレンスを
使って次のように回避していたのを思い出した。

print <<END;
${ \join('', @a) }
END

>>281
文字列中での配列変数の展開では、要素間に半角スペースを入れて
結合されるのかな。
一方、引数として配列変数を指定した場合(前者)は、最初にリストに展開される
ため期待通りに処理される、と。
0286nobodyさん2005/09/02(金) 14:02:12ID:???
>>285
文字列中での変数展開では$"が間に挿入される。デフォルト値は空白。

printでは要素間に$,が挿入される。デフォルト値は空文字列。
0287nobodyさん2005/09/02(金) 23:01:28ID:???
>>281
「ひょっとして、ダブルクォート文字列の中に、chomp していない配列を入れていませんか?」
というやつだね。
0288nobodyさん2005/09/03(土) 03:59:11ID:???
アップロードされた画像をftpで別のサーバに転送して表示する画像掲示板のサンプルか何かはありませんか?
0289nobodyさん2005/09/03(土) 05:05:43ID:???
2chの串チェックの一つにtorチェックがありますが
あれはいったいどうやってtor経由か判断しているのでしょうか
0290nobodyさん2005/09/03(土) 15:37:23ID:???
>288
スレ違い
0291nobodyさん2005/09/03(土) 15:49:52ID:???
>>289
これでも参考に

風呂敷確認君 弐式 2.07
http://sv2ch.baila6.jp/chk_proxy.cgi
http://sv2ch.baila6.jp/chk_proxy.cgi?source
0292nobodyさん2005/09/04(日) 03:20:49ID:pmMRy4XZ
「項目区切りはHex(09)でお願いします」といわれましたが、
意味がわかりません。

「$v1 . hex(09) . $v2」というように項目の区切りとしてhex関数
を指定してみましたが、エラーが出てしまいます。

質問すると怒られるので焦ってます、、
ご教示いただけますと幸いです。
0293nobodyさん2005/09/04(日) 03:36:22ID:???
>>292
$v1 . "\x09" . $v2

hex 関数は、引数の文字列を16進数とみなし整数を返す関数。
0294nobodyさん2005/09/04(日) 04:03:51ID:???
>>293
本当に有難うございます。

「受付データの区切りはタブ(\t)を入れており、
項目区切りはHex(09)となってますので」

と言われた意味がようやくわかりました。
Hex(09)=\tということなんですね。

勉強になりました。
0295nobodyさん2005/09/04(日) 04:45:50ID:???
>>294
えーと、まぁ正確には

hex 関数は 「16進数 → 10進数 変換」する関数
(例: print hex('0a'); # 10 と表示される)

なので今回の例では hex は使えず。
代わりに、「10進数 → バイナリ 変換」 できる chr 関数、pack 関数、\x?? の表記
あたりのいずれかを使えばOKということです。

(例: print chr(9); # tab文字が表示される)

今回の例だと、

・$v1 . chr(0x09) . $v2
・"$v1\x09$v2"
・$v1 . "\t" . $v2
・"$v1\t$v2"

辺りでもOK。
0296nobodyさん2005/09/04(日) 08:02:46ID:???
区切りってことなら join "\t",@list; も忘れずに
0297nobodyさん2005/09/04(日) 12:20:52ID:???
>>291
ありがとうございます
見たところ単純にリストと照合してるだけのようですが
そのリストをどうやって作ってるのかがなぞですね
0298nobodyさん2005/09/04(日) 13:47:14ID:???
>>295-296
勉強になるお話、ありがとうございます。

なぜ指示した人は「Hex(09)で」といったのでしょうかね。
「\x09で」と自然に結び付けていったつもりだったのでしょうか。
言い方は間違ってないかと思いますが、少しおかしいとも思いました。
というか僕が混乱しているせいもありますが。。

素直に\tを使うことにします。
0299nobodyさん2005/09/04(日) 13:58:15ID:???
>>298
一般的に hex は 16進法の という意味で(語源の英語 hexadecimal がそういう意味)、
担当の人は 16進表記での09 というつもりで Hex(09) と書いたのかもしれないね。

でもまぁ、開発言語がPerlと限定されてるなら、hex と chr 関数を間違えた可能性も。
おれも普段はそこらへんは曖昧だしなぁ。
Perlでhex(09)で と指定されたら、あまり慣れてない人なら少々誤解してもある程度無理ない罠。

開発&上達ガンガレ。
0300nobodyさん2005/09/04(日) 17:23:14ID:???
>>299
今後の知識として今回のご教示は非常にためになりました。
最後までご親切に有難うございます。
ガンガリマス
0301nobodyさん2005/09/04(日) 22:22:16ID:???
サーバーから転送量激しいから何とかしてくれってメールきて画像系CGIの転送量がやばいらしいから該当CGIにトラフィック制御を付けようと思ってます。
そこで次のサブルーチンを作成してみました
[ $Trafic_Timeout ]秒間に [ $Trafic_min_limit ] バイト転送したら転送量エラーと封\示したいとしbト &TraficPlus(画像サイズ); って感じで呼び出したいと思っています。
全くスマートなプログラムではありませんが、これでいけると思ってやった見て、何度か改良しましたがうまくいきません。
どなたか改良又は知恵をかしていただけませんか?宜しくお願いします。

sub TracficPlus{
$plus = $_[0];
my $size;
&filelock('tr.lock');
$Trafic_min_limit = 202400;
$Trafic_Timeout = 60;
my $nowtime=time;
open(IN,"time.trafick");$mtime = <IN>; close(IN);
open(IN,"now.trafick");$total = <IN>;close(IN);
$time = $nowtime - $mtime ;
if($time > $Trafic_Timeout){
$total = 0;
open(IN,">time.trafick");print IN $nowtime; close(IN);
}
$total += $plus ;
open(IN,">now.trafick");print IN $total;close(IN);
open(IN,"total.trafick");$ttt = <IN>;close(IN);
$ttt += $plus;
open(IN,">total.trafick");print IN $ttt;close(IN);
&fileunlock('tr.lock');
if($total > $Trafic_min_limit){&Error($Limit);}
return $size;
}

(http://pc8.2ch.net/test/read.cgi/tech/1121804136/658 からのスレ違いとのことでこちらにマルチっぽくなってしまっていますが宜しくお願いします。)
0302nobodyさん2005/09/04(日) 22:52:45ID:???
>>301
とりあえずすぐに気づくのは、$size に値が代入されずに return されてることだなぁ。

1. 各 .trafick ファイルの役割
2. どういうふうに うまくいかないのか

を書いてもらえれば、アドバイスしやすいかも。
0303nobodyさん2005/09/04(日) 22:57:53ID:???
わざと変えてるなら余計なお世話かもしれんが
トラフィックの綴りはtraffic
0304nobodyさん2005/09/04(日) 23:10:18ID:???
>>303
真剣に綴りミスしてました。忠告サンキューです。

>>302
えと、今もう一度プログラム書き直しているので>>301の物はおいとかしてください。
今やろうとしているのは、 n 秒間に m バイトのデータが転送されたら n 秒経過するまで転送量エラー画面で止めておくプログラムを組みたいと思っています。
03053042005/09/05(月) 00:04:16ID:???
ちょっと書き直してみましたが、やはりうまいこと生きませんでした。
この状態で、$Trafic_min_limitの値を0にして、実行しても記録はされているもののエラーには飛びませんでした。
各行で何をやろうとしているのかは注釈を入れておきました。宜しくお願いいたします。

sub TrafficPlus{
$plus = $_[0];
$Trafic_min_limit = 202400;
$Trafic_Timeout = 60;
my $Traffic_now   = 'traffic.now.hidden'; #現在の転送量保存
my $Traffic_total = 'traffic.total.hidden'; #全体の転送量保存
my $Traffic_time  = 'traffic.time.hidden' #現在の転送量を保存したときの時間
my $nowTime=time;  #現在の時間
&filelock('tr.lock');
$ntraffic = `cat $Traffic_now`; #現在の転送量取得
$straffic = `cat $Traffic_time`; #保存したときの時間を取得
$ptime   = $nowTime - $straffic; #現在の時間と保存したときの時間差取得
if($ptime > $Trafic_Timeout){$ntraffic = 0;} #指定時間を超えていた場合リセット
$ntraffic += $plus; $straffic += $plus; #現在の転送量に新たな転送量を加える
#現在の転送量をファイルに記録する
`echo '$ntraffic' > $Traffic_now`;
`echo '$straffic' > $Traffic_total`;
`echo '$nowtime' > $Traffic_time`;
&fileunlock('tr.lock');
if($Traffic_now > $Trafic_min_limit){&TrafficError;}
return ($Traffic_now,$Traffic_total);
}
0306nobodyさん2005/09/05(月) 00:12:17ID:???
正規表現で
\0
というのは何を表しているのでしょうか?
ぐぐって見たのですが、見つかりませんでした。
(あまりにも単純すぎて、検索するのが意外と難しい)
0307nobodyさん2005/09/05(月) 00:13:24ID:???
>>306
ヌル文字
0308nobodyさん2005/09/05(月) 00:19:28ID:???
圧縮転送はダメなん?
03093062005/09/05(月) 00:23:07ID:???
>>307
ありがとうございます。
javascriptでnull文字使って結合か・・・
頭が痛い
03103042005/09/05(月) 00:24:11ID:???
既にgzip圧縮されてるっぽいです
日転送量が3GBぐらい行ってるらしくて。普通の鯖なら蹴られて当然な数値ってことはすぐ分かりました。
まだ許してくれてるので早急に対応したいなと。とりあえず今は画像の表示にsleepで時間差を付けて耐えております。
0311nobodyさん2005/09/05(月) 00:39:15ID:???
>>305
とりあえず最後のif文で、$Traffic_now(ファイル名)と
$Traffic_min_limit(バイト数)を比較してるのはおかしいだろ。
$ntrafficじゃないのか?

あと$ntrafficがリセットされるのが、リクエスト間が$Traffic_Timeout秒
あいたときだけなんだが、これはそういう仕様なのか? $Traffic_Timeout秒
以下の間隔でリクエストが来続けるといったん制限かかったらかかりっぱなし
になりそうだが。
0312nobodyさん2005/09/05(月) 00:55:25ID:???
>>311
すっゲー間違いしてました。サンキューです。
修正してみましたがまだ正しく動かないっす・・・。
とりあえずできるまで粘ってみます。
0313nobodyさん2005/09/05(月) 01:20:29ID:???
>>305

>>311が書いてるけど、各秒ごとの転送量を保存しないと、
指定時間内の転送量が出せないね。

↓文法チェックもしてないけど。ファイルロック処理等も無し。
0314nobodyさん2005/09/05(月) 01:21:54ID:???
sub TrafficPlus {
  my $plus = shift;  # 増加量
  my $Trafic_min_limit = 202400;
  my $Trafic_Timeout = 60;
  my $now = time;  # 現在時刻

  my %traffic;  # 転送量

  # ファイルから転送量情報を読み込む。
  open(IN, 'traffic.dat');
  my %in = split(/,/, <IN>);
  close(IN);
  for ( keys %in ) {  # $Trafic_Timeout秒以前の情報を捨てる
    $traffic{$_} = $in{$_} if ( $_ > $now - $Trafic_Timeout );
  }
  $traffic{$now} += $plus;

  my $sum;  # 指定時間内の転送量合計
  for ( keys %traffic ) {
    $sum += $traffic{$_};
  }

  # 転送量情報を保存。
  open(OUT, '> traffic.dat');
  print OUT join(',', %traffic);
  close(OUT);

  if ( $Trafic_min_limit > $sum ) {
    TrafficError();
  }
}
0315nobodyさん2005/09/05(月) 06:55:48ID:???
perl 5.8 でPPMを使ってGDをインストールしようとしたのですが出来ませんでした
GDインストール解説サイトに5.8はまだPPMが使えないのでActivePerlは5.6をインストールするように書いてありました
その解説は2004年9月に書かれたものですが
現在も5.8ではPPMは使えないのでしょうか
0316nobodyさん2005/09/05(月) 08:41:06ID:???
GD 2.25ならあるみたい。ppmで
rep add theoryx5 http://theoryx5.uwinnipeg.ca/cgi-bin/ppmserver?urn:/PPMServer58
としてから
search GD
で見つかると思う
0317nobodyさん2005/09/05(月) 10:34:21ID:???
>>315
有難う御座います
いまから試してみます
03183042005/09/05(月) 11:26:42ID:???
転送量の件できたっぽいので一応報告しときます。↓の奴で今のところ正常に動いてます。ありがとうございました。
sub TrafficPlus{
$plus = $_[0];
#現在の転送量保存
 my $Traffic_now = 'traffic.now.hidden';
#全体の転送量保存
 my $Traffic_total = 'traffic.total.hidden';
#現在の転送量を保存したときの時間
 my $Traffic_time= 'traffic.time.hidden';
#現在の時間
 my $nowTime=time;
&filelock('tr.lock');
 #現在の転送量取得
  $ntraffic = `cat $Traffic_now`;
 #保存したときの時間を取得
  $straffic = `cat $Traffic_time`;
 #現在の時間と保存したときの時間差取得
  $ptime = $nowTime - $straffic;
 #指定時間を超えていた場合リセット
  if($ptime > $Traffic_Timeout){$ntraffic = 0;$straffic = $noTime;}
 #現在の転送量に新たな転送量を加える
  $ntraffic += $plus;
  $straffic += $plus;
 #現在の転送量をファイルに記録する
  `echo '$ntraffic' > $Traffic_now`;
  `echo '$straffic' > $Traffic_total`;
  `echo '$nowTime' > $Traffic_time`;
&fileunlock('tr.lock');
if($ntraffic > $Traffic_min_limit){&TrafficError;}
return ($Traffic_now,$Traffic_total);
}
0319nobodyさん2005/09/05(月) 11:34:24ID:???
あーチョッと2行書き忘れていたので行数の関係上注釈無しで入れときます。

sub TrafficPlus{
$plus = $_[0];
  $Traffic_min_limit = 500000;
  $Traffic_Timeout = 60;
  my $Traffic_now  = 'traffic.now.hidden';
  my $Traffic_total  = 'traffic.total.hidden';
  my $Traffic_time  = 'traffic.time.hidden';
  my $nowTime=time;
&filelock('tr.lock');
    $ntraffic   = `cat $Traffic_now`;
    $straffic   = `cat $Traffic_time`;
    $ptime    = $nowTime - $straffic;
    if($ptime > $Traffic_Timeout){
        $ntraffic = 0;
        $straffic = $noTime;
    }
    $ntraffic += $plus;
    $straffic += $plus;
    `echo '$ntraffic' > $Traffic_now`;
    `echo '$straffic' > $Traffic_total`;
    `echo '$nowTime' > $Traffic_time`;
&fileunlock('tr.lock');
    if($ntraffic > $Traffic_min_limit){&TrafficError;}
return ($Traffic_now,$Traffic_total);
}
0320nobodyさん2005/09/07(水) 13:59:48ID:oYntvDxu
NFSとかサーバ設定関係は一切いじらず、2サーバのファイルを
同時に書き込むような仕組みでなにかよい方法はございます
でしょうか。
この2サーバはロードバランサーで動作しております。

現在は各サーバに受け側CGIを設置(ファイル書き込みCGI)。
それぞれのサーバにアクセスがあった場合、SOCKET通信で
もう一方のサーバのCGIを叩く仕組みでファイルの同期を取って
いるのですが、アクセスが集中したりすると
「Resource temporarily unavailable」とエラーが出たりしてしまい、
多少怒られております。

何かよい案があればご教示いただけますでしょうか。
宜しくお願いいたします。
0321nobodyさん2005/09/07(水) 20:41:36ID:3mQbsuSc
シロートな質問ですいませんが、どなたか教えて下さい。

<A href=http://a.jp/abc.cgi?menu=1>;メール</A>
というリンクでabc.cgiへ移るとき、メニュー番号をmenu=1で渡すと同時に
<INPUT TYPE=\"hidden\" NAME=\"id\" VALUE=$wk_id >でIDとパスワード
も渡すことはできないでしょうか?そもそもhiddenはフォームのボタン等
がクリックされた場合のみで、リンクの場合には渡せないのでしょうか?
リンクでID、パスワードを渡すとアドレスに表示されるので、できれば
hidden等が良いのですが。

よろしくお願い致します。
0322nobodyさん2005/09/07(水) 20:50:01ID:???
Perl関係ねーぞ

<A>のリンクでhrefにアドレスを設定するのではなく、
onClickでJavascriptのfunctionよんで、そこでsubmitさせる
0323nobodyさん2005/09/07(水) 20:50:14ID:???
>>320
CGIを動かしてる鯖以外に、ファイルサーバを導入する。しかないような…。

しかも、Resource temporarily unavailableのメッセージはhttpdが出してるやつでしょ?
単なるアクセス制限だからCGIのコーディングと関係ない。
0324nobodyさん2005/09/07(水) 20:53:03ID:???
>>321
JavaScript を使えばできますよ。

<a href="http://hoge/abc.cgi?menu=1" onclick=〜>
# onclick で呼ばれる関数で post メソッドで submit (CGI呼び出し)。

それか素直に、button にしておくか。この場合でも、
<form method=POST action="./abc.cgi?menu=1">
としておくと、URLには menu=1 が現れる。

上記いずれの場合でも、CGI側で menu と id の値を両方取得可。

# JavaScript と HTML の細部の記憶は曖昧なのでスペルミス等あれば悪しからず。
0325nobodyさん2005/09/07(水) 23:53:10ID:???
>>323
ご返答有難うございます。

アクセス制限ですか。
とくに認証等はかけてないのですが、接続数制限という意味でしょうか。
0326nobodyさん2005/09/07(水) 23:59:39ID:???
>>325
他で管理している鯖ですか?

認証は関係ありません。
制限自体は、その鯖の設定によりけりです。
単位時間あたりの接続数、ヒット数、転送量、など
いろいろな情報を元に制限をかけることが可能です。

制限がヒット数になっていて、そのページに画像が多い場合、
すべてヒットとカウントされて制限に引っかかることもあります。
0327nobodyさん2005/09/08(木) 00:24:20ID:???
>>320
あれ?ちょっと変じゃないですか??

ロードバランサ入れてるんですよね。
一方のCGIが叩かれた時に、もう一方のCGI叩いたらダメでしょ。
負荷分散してる意味が無いような…。
0328nobodyさん2005/09/08(木) 01:46:08ID:???
>>326
CGI側ではどうすることもできないんですね。
サーバの設定を見直してもらいます。

>>327
一部だけファイルを同期する必要があるので、この手法を
とりました。
0329nobodyさん2005/09/08(木) 03:24:01ID:vnFPn7Ff
%test = (
2 => '2です',
6 => '6です',
'Y' => '12です'
);

このようなハッシュを

foreach my $key (sort { $a <=> $b || $a cmp $b } keys %test) {
print "$key\n";
}

こう並べ替えますと、なぜか

Y
2
6

になってしまいます。

2
6
Y

にしたいのですが、
ご教示いただけますと幸いです。
0330nobodyさん2005/09/08(木) 04:23:02ID:???
>>329
Yは数値じゃないから$a <=> $bの時点で0と見なされてる。
0331nobodyさん2005/09/08(木) 04:24:19ID:???
そのハッシュキーだけなら
sort { $a cmp $b }
でいいんじゃね?
0332nobodyさん2005/09/08(木) 04:27:51ID:???
むしろデフォルトのsort keys %testでいいっしょ。
03333292005/09/08(木) 11:27:17ID:???
皆様、ご返答有難うございます。

実はこの部分、サブルーチン化していて使いまわして
いるので何かよい方法はないかと思っていたのですが、
$a <=> $b の数値比較のあとに $a cmp $bが評価されて
いないのではなく、$a <=> $bの時点でYが0になっていたの
ですね。

このルーチンは多くのところで使われておりますが、$a cmp $b
に統一するよう検討してみたいと思います。

本当に有難うございました。
0334nobodyさん2005/09/08(木) 13:51:44ID:+KUBGHaQ
会員登録のシステムを製作中です。
ログをどうするか悩んでいます。
プレインテキストで数千件の登録を管理するのは可能でしょうか。
また不可能だとすればどういう方法があるでしょうか。
是非ご教示願います。
0335nobodyさん2005/09/08(木) 15:06:45ID:???
>>334
コーディングと関係の無い話だと思います。
0336nobodyさん2005/09/08(木) 15:35:52ID:???
>>334
数千程度なら平気じゃないかな。
しかし信頼性は低いので、SQL使うのが速いし安全かと。
0337nobodyさん2005/09/08(木) 19:09:08ID:vnFPn7Ff
負荷について教えていただきたく思っているのですが、

sub send_socket{
 use Socket;
 my ($host, $filename, $data) = @_;
 my $path = "$filename?$data";
 my $return_value;
 my $port = getservbyname('http','tcp');
 my $iaddr = inet_aton("$host") or return 0;
 my $sock_addr = pack_sockaddr_in(80,$iaddr);
 socket(SOCKET,PF_INET,SOCK_STREAM,0) or return 0;
 connect(SOCKET,$sock_addr) or return 0;
 select(SOCKET);
 $| = 1;
 select(STDOUT);
 print SOCKET "GET /$path HTTP/1.0\r\n\r\n";
 while(<SOCKET>) {m/^\r\n$/ and last;}
 while(<SOCKET>) {$return_value .= $_;}
 close SOCKET;
 return $return_value;
}

これで内容を取得するのと

sub send_socket{
 my @wget_status = `/usr/bin/wget -q -O - "http://$host/$path"`;
 foreach (@wget_status){ $return_value .= $_; }
 return $return_value;
}

これで取得するのとでは同等という考えではございませんでしょうか。
ご教示いただけますと幸いです。
0338nobodyさん2005/09/08(木) 19:32:32ID:???
>>337
単に負荷と言われても、どこに注目するかによって違うので、一概には比べられない。

上のは、スクリプトの部分が多い。
下のは、プロセスをforkしてる。
0339nobodyさん2005/09/08(木) 20:26:41ID:???
>>338
100アクセス/secくらいのキャンペーンサイトで後者を使用
するのですが、非常に不安で胃がいかれそうです。。
何かアドバイス等ございましたら何でもよいのでいただけ
ますと幸いです。
0340nobodyさん2005/09/08(木) 21:12:24ID:???
>>339
コケそうな感じですね…。
どうしても後者なら、キャンペーン中だけでも
鯖で起動できるプロセス数を引き上げておかないと…。
0341nobodyさん2005/09/08(木) 21:29:41ID:???
>>340
前者だったらいけそうなのでしょうか。
まだ半日くらい猶予があるので、違いがあるのであれば
前者を検討してみたいと思います。
アドバイスいただけますと幸いです。
0342nobodyさん2005/09/08(木) 21:51:45ID:???
教えて君ですみません。

偉い人に聞いてみたところ、「uname -nで分かるノード名を使って通信して、
2台のサーバのファイルの同期を取れ」といわれたのですが、一体Perlで
どのようにしてこのような通信ができるのかが全く思い浮かびません。

これ以上何も教えてくれそうもないので調べてみたのですが、これといった
答えも見つからず呆然としております。

2台は同ネットワーク上にあるものです。

ご教示いただけますと非常に助かります。
0343nobodyさん2005/09/09(金) 00:20:57ID:???
@AA10 = ( 0, 1, 2, 3, 4 );
$BB = 10;
$CC= '$AA' . "$BB" . "[0]";

$CC を表示させると $AA10[0] となってしまいます。
どうしたら $BB などの文字を変えずに「0」と表示できるのでしょうか?

よろしくお願い致します。
0344nobodyさん2005/09/09(金) 00:23:35ID:???
>>343
print eval($CC);
03453432005/09/09(金) 00:56:01ID:???
>>344
無事表示されました。
本当にありがとうございました。
0346nobodyさん2005/09/09(金) 01:35:56ID:DzBAr2be
半角スペースを全て&nbsp;に置換したいのですが、
タグ内部まで変換されてしまって困っています。

 <font size="7"> ほげほげ </font>

$text =~ s/ /&nbsp;/g;をすると

 <font&nbsp;size="7">&nbsp;ほげほげ&nbsp;</font>
    ~~~~~~~
になってしまいます。
タグ内部を除いた部分だけを置換するにはどうしたらいいでしょうか?
0347nobodyさん2005/09/09(金) 01:41:53ID:???
スレ違いです。

正規表現道場@2ch Part4
http://pc8.2ch.net/test/read.cgi/php/1105930285/
03483292005/09/09(金) 04:28:01ID:???
sortのことで質問させていただいたものです。

たしかに
%test = (
2 => '2です',
6 => '6です',
'Y' => '12です'
);
は
foreach my $key (sort {$a cmp $b} keys %test) {
print "$key\n";
}
で

2
6
Y

こうなりましたが、たとえばキーに10や100といった数字が入っていると、
一番上にきてしまいます。

数字順>英数字という優先順位で並び替えるにはどうしたらよいのでしょうか。
0349nobodyさん2005/09/09(金) 06:19:11ID:???
sub sortfunc {
if ($a =~ /[^0-9]/ && $b =~ /[^0-9]/) {
$a cmp $b;
} elsif ($a !~ /[^0-9]/ && $b !~ /[^0-9]/) {
$a <=> $b;
} elsif ($a =~ /[^0-9]/ && $b !~ /[^0-9]/) {
1;
} elsif ($a !~ /[^0-9]/ && $b =~ /[^0-9]/) {
-1;
}
}
foreach my $key (sort sortfunc %test) {
print "$key\n";
}
まあもっといい方法あるかな?
03503492005/09/09(金) 06:28:21ID:???
%test→keys %testで
0351nobodyさん2005/09/09(金) 06:44:26ID:???
>>348
print map { "$_\n" } sort {
  $a !~ /^\d+$/ <=> $b !~ /\d+$/ ||
  $a <=> $b ||
  $a cmp $b
} keys %test;
0352nobodyさん2005/09/09(金) 08:09:10ID:???
さらに混ぜっ返しつつ warnings clean に。

print map "$_\n",
  sort {
    return $b =~ /^\d+$/ ? $a <=> $b : -1 if $a =~ /^\d+$/;
    return $b !~ /^\d+$/ ? $a cmp $b : 1;
  } keys %test;

>>348 のケースだと四行目は単に $a cmp $b; でもヨシだけれど、1 と -1 を交換すると逆のニーズにも対応できるという噂。
0353nobodyさん2005/09/09(金) 11:49:05ID:???
>>341
半日っていうともう猶予は過ぎてるかも知れないけど、>>338は
Perl始めたばかりのド素人のようだから無視するように。

mod_perlを使っていないのなら下の案はwgetを子プロセスとして起動する分、
サーバー負荷は無条件に高い。
単純計算で1アクセスにつき無条件にperlとwgetで計2プロセスが起動される
ことになる。wgetの中で上のコードと同じようなことをやっているのだから、
上の案のほうが負荷は半分になると考えていいだろう。

しかしそんなにアクセス数が見込まれるサイトがHTTP経由でデータ取得を行う
なんていうアホな設計になっているところが信じられん。
03543482005/09/09(金) 11:50:39ID:???
皆様、私にはレベルが高すぎです。
本当に有難うございます。

とりあえず一旦

foreach my $key (sort k::sort_rule keys %$refs) {
print $key;
}

sub sort_rule{
return $b =~ /^\d+$/ ? $a <=> $b : -1 if $a =~ /^\d+$/;
return $b !~ /^\d+$/ ? $a cmp $b : 1;
}

こんな感じで後で試してみようかと思います。
結果は追ってご連絡いたします。
0355nobodyさん2005/09/09(金) 12:06:18ID:???
>>353
有難うございます。
あれから実はソケット通信をやってみたのですが、エラーが出てしまったんです。

Object not found!
The requested URL was not found on this server.

If you entered the URL manually please check your
spelling and try again.

If you think this is a server error, please contact
the <a href="mailto:webmaster@localhost">webmaster</a>.

Error 404

localhost.localdomain

それで偉い人に聞いてみたら、「uname -nで分かるノード名を使って通信して、
2台のサーバのファイルの同期を取れ」とか言われたのですが、これがさっぱり
わからず、もうどうにでもなれといった感じでオープンが近づいております。。

ノードを名取った後どのような処理をすればよいのか、もしもご存知のようでしたら
ご教示いただきたく思っております。
0356nobodyさん2005/09/09(金) 15:06:48ID:???
>>355
なんか予想の斜め上をいく展開だな。

とりあえずその偉い人に
同一セグメントのサーバ同士のファイルの同期をとるのが目的なら
いっそのことNFSかsambaかWebDAVでディレクトリを共有したらどうですか?
と進言してみたら?

リアルタイム性を要求されないのならrsyncとかも使える。
0357nobodyさん2005/09/09(金) 17:24:02ID:???
>>352
>>351だが、351のコードで warnings 出るっけ?
それとも他のコードのことかな。
0358nobodyさん2005/09/09(金) 17:56:17ID:???
>>357
数じゃない文字列を <=> で比較すると use warnings 下では

Argument 〜 isn't numeric in numeric comparison (<=>) at 〜

が出ることをいってるんじゃないだろうか。

0359nobodyさん2005/09/09(金) 18:18:45ID:???
>>356
NFS等の導入は一番初めに提案させていただきましたが、
上から許可がおりないとか何とかであっさり却下されました。。

もうどうしたらよいのやら。。
0360nobodyさん2005/09/09(金) 19:22:09ID:???
>>358
なるほど。サンクス。勉強になりました。
たしかに暗黙の型変換を利用してるなぁ。
0361nobodyさん2005/09/09(金) 20:40:27ID:???
>>359
プロジェクト全体が腐ってるっぽいな。
404になる件はノード名を/etc/hostsに登録すれば
なんとかなるだろうが…

0362nobodyさん2005/09/10(土) 10:54:03ID:???
>>359
ヘッポコ上司に連座させられたくなかったら、
ちゃんとしたプロマネつれてこないとポシャルと、
上司を飛び越してその上の上司に進言しなさい。

>>361
> 404になる件はノード名を/etc/hostsに登録すれば
> なんとかなるだろうが…
ならない。
0363nobodyさん2005/09/10(土) 11:15:29ID:???
$count=0;
open(LOG,"$logfile");
$count += tr/\n// while(read LOG, $_, 1024);
close(LOG);

どうしてこれで$logfileの長さをカウントできるのか教えてください。
3行目のtr/\n// while(read LOG, $_, 1024);がよく分かりません。
0364nobodyさん2005/09/10(土) 11:15:52ID:???
404というエラーが正常に返ってきているのだから、接続はできているのだ。
0365nobodyさん2005/09/10(土) 11:19:09ID:???
>>363
ファイルのサイズではなく、行数をカウントしてるのでは。

ちなみに
open(LOG, $logfile);
の方が良いと思います。余計な変数展開がなくなります。
03663632005/09/10(土) 11:22:57ID:???
>>365
行数でした。
C言語しか知らないもので、while(条件){実行する内容}
という形式は理解できるのですが、perlではwhile文はどのように展開されるのでしょうか?
0367nobodyさん2005/09/10(土) 11:34:44ID:???
>>366
while を後置しているだけです。スクリプティング言語では多く見られます。

以下と同じ意味です。
while (read(LOG, $_, 1024)) {
$count+= tr/\n//; # trは置換に成功した数を返す。
}
0368nobodyさん2005/09/10(土) 11:34:57ID:???
>>366
perlのシンタックスの勉強なら本を買え。
0369nobodyさん2005/09/10(土) 11:47:10ID:???
>>367
>スクリプティング言語では多く見られます。
これ本当なの
Perl独自の変態仕様じゃないの
0370nobodyさん2005/09/10(土) 11:49:30ID:???
>>369
Perlから広まっていった…と記憶してる
0371nobodyさん2005/09/10(土) 15:15:07ID:???
trをやめてchompで。
0372名無しさん@そうだ選挙に行こう2005/09/11(日) 16:20:19ID:yhvSpEP/
モジュールを使わずにSHA-1ハッシュ関数を生成しようと思い以下のサブルーチンを拾ってきて以下の2つのサーバーでprint &SHA("a");を試したんですがサーバー1の方で正しいハッシュ関数が生成されてないみたいです。
サーバー1: Fedora Core release 3, Kernel 2.6.9-1.667, Perl version 5.8.5
サーバー2: FreeBSD 5.4-STABLE, Perl v5.8.2
どうすればよろしいでしょうか?
sub SHA {
### &SHA("squeamish ossifrage\n");
### Should return 82055066 4cf29679 2b38d164 7a4d8c0e 1966af57
  local ($temp, $m, @A, @K, $x, $n);
  local ($b, $c, $d, $e, $S, $r, @W, $t, $v);
  my ($msg, $p, $l) = @_; #$p=0; $l=0
  my $inputp=$_[0];
  local $_;
  $temp = 'D9T4C`>_-JXF8NMS^$#)4=L/2X?!:@GF9;MGKH8\;O-S*8L\'6';
  $m = 4294967296;
###$m=1+~0;
  @A=unpack"N*",unpack "u",$temp;
  @K=splice@A,5,4;
sub M{($x=pop)-($m)*int$x/$m};
sub L{$n=pop;($x=pop)<<$n|2**$n-1&$x>>32-$n}
@F=(sub{$b&($c^$d)^$d},$S=sub{$b^$c^$d},sub{($b|$c)&$d|$b&$c},$S);
do{
  $msg=~s/.{0,64}//s;$_=$&;
  $l+=$r=length;
  $r++,$_.="\x80"if$r<64&&!$p++;@W=unpack N16,$_."\0"x7;$W[15]=$l*8
if$r<57; for(16..79){push@W,L$W[$_
-3]^$W[$_-8]^$W[$_-14]^$W[$_-16],1}($a,$b,$c,$d,$e)=@A;
  for(0..79){$t=M&{$F[$_/ 20]}+$e+$W[$_]+$K[$_/20]+L$a,5; $e=$d; $d=$c;
   $c=L$b,30; $b=$a; $a=$t}$v='a'; @A=map{ M$_+${$v++}}@A
}while$r>56;
return sprintf'%8x'x4 . '%8x',@A;
}
03733482005/09/11(日) 16:54:25ID:???
遅ればせながら、ご報告させていただきます。

foreach my $key (sort k::sort_rule keys %$refs) {
 print $key;
}

sub sort_rule{
 return $b =~ /^\d+$/ ? $a <=> $b : -1 if $a =~ /^\d+$/;
 return $b !~ /^\d+$/ ? $a cmp $b : 1;
}

これでいきました!本当に有難うございました!
まだまだ技術レベルが低いので意味がわかってないのですが、
これから勉強してこの構文を十分理解できるようになりたいと
思います。

ご教示、誠に有難うございました。
0374名無しさん@そうだ選挙に行こう2005/09/11(日) 23:02:31ID:moSzhZBr
$_が分かりません。
説明を読むと、デフォルトの変数として、省略されている場合も
自動的に代入や出力されている特殊変数とあるのですが、たとえば
if ($_[0] eq 'bye') {
いきなりこんなのが出てきた場合、一体何をしてるんでしょうか。
自動的に配列を作って、0に何かが代入されている?

うかがうのに妥当なスレがないようだったので、こちらで尋ねました
よろしくお願いします。
0375名無しさん@そうだ選挙に行こう2005/09/11(日) 23:05:32ID:???
スクリプトの第一パラメータとか
サブルーチンの第一引数とか
0376名無しさん@そうだ選挙に行こう2005/09/11(日) 23:07:43ID:???
> スクリプトの第一パラメータとか
0377名無しさん@そうだ選挙に行こう2005/09/11(日) 23:12:45ID:???
>>374

@hoge = (1 ,2, 3);
↓
$hoge[0] == 1

@_ = (1 ,2, 3);
↓
$_[0] == 1

ok?
03783742005/09/11(日) 23:22:07ID:???
>375,>376,>377
レスありがとうございます。
>377の例、わかりやすかったです
特に個別に名前はつけてないけどこーゆー配列(変数)だよ、っていう事なんでしょうか。

もしかしてすごくアホな事聞いてるかもしれないんですが、さっきの
if ($_[0] eq 'bye')
コレ、いきなり出てきたんです。>377で言う@_ = (1 ,2, 3); みたいなのがなくて。
@_ = (1 ,2, 3); がないのに、一体何と比較してるんだろう???となってしまったんですが…
0379名無しさん@そうだ選挙に行こう2005/09/11(日) 23:29:33ID:???
>>378
サブルーチンの引数は、勝手に @_ に入ります。
というか、基本なんだからマニュアルか、本を読もうよ…。
03803742005/09/11(日) 23:37:29ID:???
>379
すみません。実は本読んでもよくわかりませんでした。
もうちょいスクリプトいじってみて、悩んでみます…
0381名無しさん@そうだ選挙に行こう2005/09/11(日) 23:41:56ID:???
>>380
その本、巻末に索引付いてませんか?
そこで、$_ と @_ を探しましょう。
0382nobodyさん2005/09/12(月) 17:57:25ID:???
たとえば、
-----
$classname = 'bar'
return "foo::".$classname->new();
-----
みたいに、変数に入ってる値でクラスを呼び出すことはできないのでしょうか?
(この例だと、foo::barを呼び出したいです)
foo::??の??の部分を変数にして動的に変えたいですが、何かやり方はありますか?
0383nobodyさん2005/09/12(月) 18:25:32ID:???
eval
0384nobodyさん2005/09/12(月) 20:53:06ID:???
>>382
use strict; を使ってるなら

no strict 'refs';

使ってないなら

$a = 'aaa';
&{$a."::new"}();
0385nobodyさん2005/09/12(月) 20:54:01ID:???
あら、上手くかけてなかった。

use strict; を使ってるなら

no strict 'refs';
$a = 'aaa';
&{$a."::new"}();

使ってないなら

$a = 'aaa';
&{$a."::new"}();
0386nobodyさん2005/09/12(月) 20:56:53ID:???
strict使ってないなら
$obj = "foo::$classname"->new();
もできるんじゃないかな。
0387nobodyさん2005/09/12(月) 21:23:44ID:???
>>386
おお、ほんとだ。
strict 使ってても、no strict 'refs' でOKみたい。
0388nobodyさん2005/09/12(月) 22:46:32ID:Giee4nr4
CGI.pmでのテーブルタグの出力ってどうやればいいんですか?

print table(TR,(td("")));

この書き方だとエラーになるようなんですが
0389nobodyさん2005/09/13(火) 10:56:07ID:???
>>387
no strictで制限を緩めるときはブロックに閉じ込めて必要最小限の
範囲だけにした方がいいよ。
0390nobodyさん2005/09/13(火) 11:31:37ID:???
質問です。
ファイルを開いて処理する時に

open (FILE,"<$list");
while(<FILE>){
chomp;
my (undef,$addr,$svr,$uer,$pass) = split(/<>/,$_);
&get($addr,$svr,$usr,$pass);
}
close FILE;

と、

open (FILE,"<$list");
my @getlist = <FILE>;
close FILE;
foreach my $usrdata(@getlist){
chomp($usrdata);
my (undef,$addr,$svr,$uer,$pass) = split(/<>/,$usrdata);
&get($addr,$svr,$usr,$pass);
}

ってどちらが速いいですか?
会社の人は「whileよりforeachのほうが速い」って言うのですが、
何回ベンチ取ってもwhileのほうが1割近く速くなるんです。
私のベンチの取り方が問題?

読み込むファイルの大きさは1kb程度のものです。
0391nobodyさん2005/09/13(火) 12:15:30ID:???
>>390
その例ならwhileの方が普通は早そうでベンチとも一致する。

my @getlist = <FILE>;

でファイル全体を一行ずつにばらした配列を作るのが余計な
手間になるからね。

ただ一般的には往々にして直観はあてにならないのできちんと
ベンチをとって評価するのが正道。
0392nobodyさん2005/09/13(火) 12:28:09ID:???
なにこの初心者
0393nobodyさん2005/09/13(火) 14:15:39ID:???
ファイルが巨大だったらメモリも食うし一括読み込みはあかん
03943822005/09/13(火) 14:15:41ID:???
384さん
386さん
うまくいきました。ありがとうございました。
0395nobodyさん2005/09/13(火) 14:32:09ID:???
>>389
サンキュ。そこまで書いたほうが親切だったね。
0396nobodyさん2005/09/13(火) 20:13:08ID:???
便乗して質問させてください。
掲示板CGIなどで、特定の投稿を編集をするとき、一括読み込みをしないでデータを書き換える方法はありますか?
0397nobodyさん2005/09/13(火) 21:19:34ID:???
書き換え前後のサイズ(文字数)とかが同じなら可能。
0398nobodyさん2005/09/13(火) 23:40:10ID:???
>>392
お前にもそういう時期があったろう
03993902005/09/14(水) 00:52:53ID:???
>>391
>>393
ありがとうございます。

会社の人が言うように、whileよりforeachのほうが速いケースってあるんだろうか・・・
と思う今日この頃。
0400nobodyさん2005/09/14(水) 01:35:33ID:???
>>399
ファイルから逐一読み出す処理よりも、
変数から処理するほうが速いって意味だったとか。
0401nobodyさん2005/09/14(水) 23:20:56ID:???
標準入力された画像データをPerlMagickで直接加工したいのですが・・・
use CGI;
use Image::Magick;
$cgi = new CGI;
$fh = $cgi->param('picFile');

$i = new Image::Magick;
$i->Read($fh); #これができない

print "Content-type: image/jpeg¥n¥n";
$i->Write('jpeg:-'); #何も出力されない

フォームで選択されたファイルをどうにかしてファイルハンドルとして
PerlMagickに読み込ませたいのですが、うまく行きません。

現在は標準入力のデータを一旦ファイルに書き出し、
それを読み込んで加工する方法を取っておりますが、明らかに非効率だと思うのです。
いい方法はございませんでしょうか。
0402nobodyさん2005/09/14(水) 23:24:25ID:???
$fh = $cgi->param('picFile');
04034012005/09/14(水) 23:57:54ID:???
>$fh = $cgi->param('picFile');
$fhはファイルハンドルじゃないってことですか?
でも
read($fh, $buf, 1024);
という風にできるから・・・
0404nobodyさん2005/09/15(木) 01:10:00ID:???
>>403
PerlMagickと組み合わせて使ったことはないのでよくわからんが、
ファイルハンドルがほしいのなら

$fh = $cgi->upload('picFile');

を使う方がいいんじゃないかと。(ただしCGIモジュール2.47以降)

詳しくはCGIモジュールのPODの「CREATING A FILE UPLOAD FIELD」を
をよく読むといいだろう。
0405nobodyさん2005/09/15(木) 13:41:48ID:3HNHstci
ローマ字を平仮名になおしたいんですが
s/ba/ば/g;
s/bi/び/g;・・・・みたいに何十行もえんえん続けるようなのでなく、
もっと効率的に動いて効率的に書けるような方法ありますか?
0406nobodyさん2005/09/15(木) 14:12:50ID:???
>>405
そおんなもんとっくに誰かが作ってるだろうと思い検索したらあったよ
ttp://pitecan.com/OpenPOBox/romakana/
04074012005/09/15(木) 15:53:13ID:???
>>404
uploadとは盲点でした。が、状況は変わらず・・・。
ファイルハンドルを渡す時は
$i->Read(¥*fh);
とするとリファレンスあったので、これも試してみました。

PerlMagickにこだわるあまりCGIの方が疎かになっているようなので、
色々可能性を模索したいと思います。
0408nobodyさん2005/09/15(木) 16:33:46ID:???
>>407
ファイルハンドルのときは

$i->Read(file => $fh);

だと思うが。
04094012005/09/15(木) 17:18:27ID:???
>>408
あ、ほんとだ。リファレンスにも書いてあるし、何故見落としてたんだろう・・・orz
おかげさまでうまく行きました。ありがとうございました。
0410nobodyさん2005/09/16(金) 08:23:19ID:0dogEF/n
すみませんすみません。
本当に申し訳ないです

知らない方がいらっしゃるのであれば申し訳ないのですがネットゲーム「罪と罰」のようなCGIを利用し、
複数のプレーヤーの様々な数値(ステータスなど)を参加者全体で共有するどういった内容で行なわれているのでしょうか?


ついでにもう一つの質問を。スレ違いな感はありますがどうか答えてやってください。
PerlとPHPが多くのCGIで利用されているようですが二種類の言語が存在するということは各々に得手不得手があるということですよね?
その得手不得手及び私が制作しようとしているCGIゲームではどちらが向いているのか、初心者ではどちらが学びやすいか教えてもらえるとかなり光栄です。
よろしくお願いします。

自分の質問…あまりにも馬鹿なのか基本的すぎるのか検索にすらHitしないんです…orz
0411nobodyさん2005/09/16(金) 08:31:10ID:???
>>410
もう少しちゃんと調べような。
http://www24.big.or.jp/~obo/game/ore_/gild/
これはPerlで書かれてる模様。

2つ目の質問はスレ違いだが、これ以上他のスレに誤爆されても困るので答えておく。
まずCGIと言う形では向いていない。
罪と罰もそうだけど、このタイプの設置を禁止している鯖も多い。
そしてCGIにはRubyやPython、JAVAもあればCもある。
要約するとこうだ、半年ROMってろ。
0412nobodyさん2005/09/16(金) 08:32:08ID:???
直リンスマソ。
半日ROMってくる
0413nobodyさん2005/09/16(金) 09:32:49ID:???
>>412さん
う〜ん…
自分は船乗りなので海の上でできる趣味が無いかな?と思ったんですけどねぇ…。
本で勉強してからまた書き込みます。まずは罪と罰と同じPerlから購入してみようと思います。
オススメの書籍があるならばお教えください。
レス無くとも言われたとおりROMっているので気を悪くしないでください。
04144132005/09/16(金) 10:03:47ID:???
追記

私に出てきてほしい場合は(限りなくそんな場合無いとは思いますが…)乗船期間以外であれば「あの時のゲームCGI初心者」や「誤爆犯」など分かりやすく呼んでいただけると出てきます。
おそらく自分から出てくるのは仕事もあるので4ヵ月〜半年後になると思います。
0415nobodyさん2005/09/16(金) 11:06:01ID:???
以上、罪と罰スクリプトの宣伝でした。
次の質問ドゾー
0416nobodyさん2005/09/16(金) 11:44:27ID:???
php は perl ほどスクリプト書いてて楽しくないなー、て思った。

>>410
まあ初心者的には php のが楽かもね、と。
04174132005/09/16(金) 21:00:27ID:???
いきなり約束破ってすみません。お礼が言いたかったのと今日、本屋行って色々と探した時の疑問があったので見逃してください

>>416さん
レスありがとうございます。
PHPですか。HTMLと一緒に記述できる点が初心者向きということですか?

本屋でPerl関連の本を探してもあまり見つからない(一冊しか無かった…)のは何故でしょう?
素人調べで悪いのですがUNIXと記述方法が似ていると言う事なのでUNIXを学べば良いのでしょうか?
でもUNIXってかなりレベルが高いような…
0418nobodyさん2005/09/16(金) 21:05:55ID:???
>>417
>本屋でPerl関連の本を探してもあまり見つからない(一冊しか無かった…)のは何故でしょう?

これはありえないと思われます。事実ならその本屋・・・品揃え悪すぎだと・・・
0419nobodyさん2005/09/16(金) 21:06:32ID:???
>>417
それはお前んとこの本屋の品揃えが悪いだけ。
Amazonで検索汁。かなりたくさんある。
0420nobodyさん2005/09/16(金) 21:30:04ID:???
うざいなぁ。
0421nobodyさん2005/09/16(金) 21:49:41ID:???
>>417
Perl以外の言語についても聞きたいなら専用のスレに
行くといいよ。
0422nobodyさん2005/09/17(土) 00:01:30ID:???
まあまあ。

>>417
php は関数が最初から腐るほど用意されてあるから、
perl みたいに自分で書いたりモジュール用意したりする手間が省けることが多いのだよ。
そこが perl の楽しいところでもあるんだけど、初心者には荷が重いかもとか。

結構Web上でも初心者から学べる解説サイトがいくつかいくらでもあるので、そういうの見てもいいかもね。
まあ、ここは perl コーティングの質問スレだから、これ以上はここではきかないでね。
0423nobodyさん2005/09/17(土) 00:24:53ID:???
> php は関数が最初から腐るほど用意されてあるから、

そう?妄想なら日記に書いておいてよ。
0424nobodyさん2005/09/17(土) 01:50:33ID:???
>>423
>>423
>>423
>>423
>>423
>>423
>>423
0425nobodyさん2005/09/17(土) 04:40:43ID:???
<?php
$funcs = get_defined_functions();
print count($funcs["internal"]);
?>
このスクリプトで組み込み関数の数を調べられるわけだが

うちの環境(PHP4.4.0+mb_string)では
826という数字が出て来た。
0426nobodyさん2005/09/17(土) 07:33:55ID:???
Perlスレで書くのもなんだが>>423が何を言いたいのかわからないので>>425を実行
php5.1.0b2
1084
腐るほどかどうかは不明だが妄想とはいえないだろ
0427nobodyさん2005/09/17(土) 07:58:14ID:???
PHPマニュアルの関数一覧を見れば一発。

数えるのマンドクセ('A`)
0428nobodyさん2005/09/17(土) 08:32:46ID:???
get_defined_functions();
こんな関数がある時点ですでに腐っている。
0429nobodyさん2005/09/17(土) 09:10:30ID:???
よそ行ってやれよ
0430nobodyさん2005/09/17(土) 10:05:17ID:???
PHPやだ〜Perlがいい〜
0431nobodyさん2005/09/17(土) 11:31:11ID:???
>>428
ワロタw 確かにw
■ このスレッドは過去ログ倉庫に格納されています