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

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

レス数が1000を超えています。これ以上書き込みはできません。
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
0432nobodyさん2005/09/17(土) 12:55:22ID:???
>>1-431
URL見てわかるとおり、ここはphp板ですよ?
0433nobodyさん2005/09/17(土) 15:15:36ID:???
ところで、perl には組み込み関数とやらはどのくらいあるの?

また、組み込み関数とやらにバグがあった場合、root 等の権限を
持たないユーザでは何も出来なくなるけど、そういう場合どうするの?
0434nobodyさん2005/09/17(土) 15:35:59ID:9NJ0Gho0
連想配列に値をセットしていき、セットした順で
キーを抜き出したいのですが、これは無理なんでしょうか?

%hoge = ('aaa', 3, 'ccc', 2, 'bbb', 1);
foreach(%hoge){
print "$_ ";
}

欲しい結果
aaa 3 ccc 2 bbb 1
0435nobodyさん2005/09/17(土) 15:43:14ID:ceziuPle
質問。
biglobeでMIME::BASE64使うにはどうしたらいいの?
0436nobodyさん2005/09/17(土) 16:07:42ID:Oc8EoCio
>>423
無理じゃない?キーの頭に値を入れてソートするとか
0437nobodyさん2005/09/17(土) 16:23:52ID:???
>>434
ふつーに無理ではないかと。
0438nobodyさん2005/09/17(土) 16:41:27ID:???
>>434
それができるモジュールがあったと思う。
モジュール名は失念。

>>435
MIME::BASE64 を cpan あたりからダウンロードして biglobe の自分の
ディレクトリに置き、

use lib qw(path/to/MIME::BASE64);

でOK。
0439nobodyさん2005/09/17(土) 16:44:02ID:???
>>434
use Tie::Hash::Array;

tie my %hoge, 'Tie::Hash::Array';
%hoge = ('aaa', 3, 'ccc', 2, 'bbb', 1);
foreach(%hoge){
print "$_ ";
}
0440nobodyさん2005/09/17(土) 16:44:52ID:???
>>438
> MIME::BASE64 を cpan あたりからダウンロードして biglobe の自分の

http://search.cpan.org/src/GAAS/MIME-Base64-3.05/
xs とかあるけど、どーやってコンパイルするんだろう。
04414392005/09/17(土) 16:45:43ID:???
ごめん、うまくいかない。
0442nobodyさん2005/09/17(土) 16:45:58ID:???
>>439
tie しないといけないとは、まぬけなもじゅーるでつね。
04434392005/09/17(土) 17:02:03ID:???
>>442
いや、私に言われても困るわけだけど。

でもtieを使わない方法ってあるの?
0444nobodyさん2005/09/17(土) 17:04:08ID:???
しらーん。

>>434 がどうして >>434 なような意味不明なことを考えたかだ。

@unko = ('aaa', 3, 'ccc', 2, 'bbb', 1);
foreach (@hoge){
print "$_ ";
}
0445nobodyさん2005/09/17(土) 17:08:38ID:???
>>440
pure perl 版はどうでしょう?
http://search.cpan.org/~gaas/MIME-Base64-Perl-1.00/lib/MIME/Base64/Perl.pm
0446nobodyさん2005/09/17(土) 17:10:31ID:???
>>440
あと、biglobe 鯖に入ってるコンパイラを使えれば
コンパイルできるかも。
0447nobodyさん2005/09/17(土) 17:14:41ID:???
>>445
へー。pure perl なのあったんでつね。

>>446
がんばってコンパイラの使い方を説明してあげてくれ。w
04484392005/09/17(土) 17:15:38ID:???
>>434
use Tie::Hash::Indexed;

tie my %hoge, 'Tie::Hash::Indexed';
%hoge = ('aaa', 3, 'ccc', 2, 'bbb', 1);
foreach(%hoge){
print "$_ ";
}

# 一応できたけど、このモジュールだったけか…。
0449nobodyさん2005/09/17(土) 17:19:12ID:???
こんなことして何の役に立つのかという件について。
0450nobodyさん2005/09/17(土) 17:45:46ID:???
>>448
知らなかったけど、調べて見たらそれっぽいね。
PHPは最初から順序付きハッシュなんだっけ?
0451nobodyさん2005/09/17(土) 17:55:00ID:9NJ0Gho0
>>436-439
どうもありがとうございます。
用途は、、確かに配列でも代用できそうなんですけど、
キー指定して、値を引っ張るて事をしたく、
たまに、決まった順番でまとめて出力したかったからです。
0452nobodyさん2005/09/17(土) 18:08:16ID:???
>>451
頭大丈夫?
0453nobodyさん2005/09/17(土) 18:09:57ID:???
>>450
PHPは配列とハッシュ(連想配列)の区別がないから、そのはず。
(じゃないと、キュー/スタックとして使えなから。)

$hoge = array('aaa' => 3, 'ccc' => 2, 'bbb' => 1);
foreach($hoge as $key => $value){
echo "$key => $value ";
}

結果
aaa => 3 ccc => 2 bbb => 1
0454nobodyさん2005/09/17(土) 18:15:55ID:???
>>452
ばっちり大丈夫ですよ。
少なくともおまえよか。
0455nobodyさん2005/09/17(土) 18:18:20ID:???
2度と来るなよ
0456nobodyさん2005/09/17(土) 18:29:36ID:???
おまえもなw
0457nobodyさん2005/09/17(土) 18:45:39ID:???
回答があった後にこれだからなあ。後味の悪い厨房だ
0458nobodyさん2005/09/17(土) 18:47:37ID:???
>>451
それだったら
@hoge = ('aaa', 3, 'ccc', 2, 'bbb', 1);
こうやっといてから
%hogehash = @hoge;
って2つつくれば済むような。
0459nobodyさん2005/09/17(土) 18:52:47ID:???
>>457
454は騙りだろ
そう思っとけ
0460nobodyさん2005/09/17(土) 18:53:10ID:???
>>457
回答と煽りは別。
厨房に構うやつも厨房。おまえは厨房だって事。
0461nobodyさん2005/09/17(土) 19:00:26ID:???
すごい…論理です。
0462nobodyさん2005/09/17(土) 20:19:55ID:???
煽りに釣られる時点でクソです(><)
0463nobodyさん2005/09/17(土) 20:25:16ID:???
クソ蝿見っけ^o^
0464nobodyさん2005/09/17(土) 21:02:52ID:EwuItVJ4
>>434
疑似ハッシュって今ダメなんだっけ?

>>440
MIME::Base64ならローカルにコンパイルしてFTPでコピーしても動くよ。
0465nobodyさん2005/09/17(土) 21:16:29ID:???
> MIME::Base64ならローカルにコンパイルしてFTPでコピーしても動くよ。

put 先の環境がわからない場合は、手が出せないと思うのだけど。頭大丈夫?
0466nobodyさん2005/09/18(日) 01:36:06ID:???
不毛な煽りはやめようぜ。
やってるやつは1人か2人だと思うけど。

マジレスすると

>>452
そういうニーズがあって別に問題ないだろう。

>>465
もう少し知識をつけてから書き込みましょう。
0467nobodyさん2005/09/18(日) 02:17:25ID:???
>>466
> もう少し知識をつけてから書き込みましょう。

何の知識だろう?説明して欲しいなら正直に言えばいいのに。

pure perl 版でない MIME::Base64 を動かす場合、xs をコンパイルしないとけない。
biglobe で動くようにバイナリを作らないといけないので、
> put 先の環境がわからない場合は、手が出せないと思うのだけど。頭大丈夫?
0468nobodyさん2005/09/18(日) 02:21:44ID:???
>>466
> そういうニーズがあって別に問題ないだろう。

頭が大丈夫か否か確認しているだけで、問題であるとは言ってないのでは?
0469nobodyさん2005/09/18(日) 02:38:34ID:???
>>468
頭大丈夫?
0470nobodyさん2005/09/18(日) 02:40:02ID:???
おれの頭はだめぽ。
0471nobodyさん2005/09/18(日) 02:40:28ID:???
小学生ですか?
0472nobodyさん2005/09/18(日) 02:42:27ID:???
つまんね
0473nobodyさん2005/09/18(日) 02:44:47ID:???
藻前らこんな夜中に何やってるんですか?
0474nobodyさん2005/09/18(日) 02:49:56ID:???
頭大丈夫?
0475nobodyさん2005/09/18(日) 02:53:27ID:???
おれの頭もだめぽ。
0476nobodyさん2005/09/18(日) 03:02:25ID:5XfzNwGp
おまいの頭はガッ
0477nobodyさん2005/09/18(日) 03:03:29ID:???
小学生ですか?
0478nobodyさん2005/09/18(日) 03:08:31ID:???
つまんね
小学生とか2回もウザいし。
0479nobodyさん2005/09/18(日) 06:58:08ID:???
>>464
擬似ハッシュは5.10.0以降無くなるから、お勧めしない。
perlrefのPseudo-hashes: Using an array as a hash、NOTE参照。
0480nobodyさん2005/09/18(日) 15:30:34ID:tUMS1QFu
GDモジュールを使って、HTTPアップロードされた画像ファイルを指定したサイズに縮小して保存する
…ということをレンタルサーバーでやりたいんですが、あまり大きくない画像(試した画像は174x180ぐらい)では
うまくいくものの、でかい画像(試した画像は1201x1372)になると処理が途中で止まってしまうみたいです。(アップロード処理後で出力しているはずのHTMLが出力されない)
アップロードまではうまく行ってるようなのでアップロード後の処理のみですが、作ったスクリプトは以下のような感じです。原因も対応もさっぱりです。どうすればよいでしょうか?どなたか教えてください。

$icon_width = 100; # 幅を100に縮小
$icon_height = 100; # 高さを100に縮小

open(IMG, "アップロードされたファイル");
$sourceimg = newFromJpeg GD::Image(\*IMG);
($image_size_x, $image_size_y) = $sourceimg->getBounds();
close(IMG);

$newimg = new GD::Image($icon_width, $icon_height, 1);
$newimg->copyResized($sourceimg, 0, 0, 0, 0, $icon_width, $icon_height, $image_size_x, $image_size_y);

open(FILE, ">縮小後のファイル.jpg");
print FILE $newimg->jpeg();
close(FILE);
0481nobodyさん2005/09/18(日) 15:37:08ID:???
>>480
それは、テスト環境とかでまともに動いているスクリプトでつか?
情報の出し惜しみはダメでつよ?
0482nobodyさん2005/09/18(日) 15:37:23ID:???
レンサバの処理時間制限に引っかかってるんじゃないの?
ローカルで一度試してみ。
04834802005/09/18(日) 16:03:16ID:???
ローカルのテスト環境ですか…。なるほど作ってやってみようと思います。
とりあえず使ってるレンサバではシェルが使えるのでシェル上で
適当に画像を置いてやってみたら、ちゃんと縮小されました…
0484nobodyさん2005/09/18(日) 16:09:10ID:???
>>483
なら、タイムアウト食らってるね。
その鯖、cron 使える?
0485nobodyさん2005/09/18(日) 16:21:18ID:???
PerlでMySQLを利用しようとして、エラーで進まないのでご教授ください。
ローカルのテスト環境はWin2000とPerlは5.8.7です。

MySQLは無事にインストールが出来、動作も確認済みです。
Perlで呼び出す際の問題なのですが、use DBI;とすると、
Can't locate loadable object for module DBI in @INC (@INC contains: C:/usr/lib C
:/usr/site/lib .) at C:/usr/lib/DBI.pm line 254
というエラーが出てしまいます。
が、DBI.pmはあるべき場所にありますし、エラーの出る行数を見ても}
があるだけで、行き詰まっております。
04864802005/09/18(日) 16:22:26ID:???
>>484
which cronでパスが表示されるので入ってるみたいです。
ただ、恥ずかしい話ですが私は使ったことがないので使い方を知りません。
0487nobodyさん2005/09/18(日) 17:10:35ID:???
>>486
ttp://www.coolbrain.net/cron.html

知らない事については、勉強すればいいと思う。
いろいろ試してみて理解不能だったら、また質問すると良いよ。
0488nobodyさん2005/09/18(日) 17:12:59ID:???
>>485
DBD::MySQL とかは入ってる?
04894802005/09/18(日) 17:18:21ID:???
>>487
有り難うございますー 勉強してきます。

その他の回答してくださった皆さんも有り難うございました。
04904852005/09/18(日) 17:29:40ID:???
>>488
libの中に DBD/mysql.pm があります
0491nobodyさん2005/09/18(日) 17:30:34ID:???
>>490
それって、単体では動かないのだけど、バイナリとかは入ってる?
04924852005/09/18(日) 17:39:42ID:???
CPANから落としてきたものを解凍して丸々放り込んでます。
0493nobodyさん2005/09/18(日) 17:42:06ID:???
>>492
なんで、それだけで動くと思う?

http://perldoc.jp/docs/modules/DBD-mysql-2.1026/DBD/mysql/INSTALL.pod
04944852005/09/18(日) 17:57:30ID:???
ppmがエラー出すので、代替方法のつもりで手動インストールをやって行き詰まってました。

Perlモジュールスレがあったみたいなので、そちらで勉強してきます。
0495nobodyさん2005/09/19(月) 19:07:11ID:beipsuRn
require で宣言した変数値が、取れたり取れなかったりで困っております。
共通の設定定義ファイルを読み込み、それがシステムで使いまわされる感じを
考えています。

*パス構成*

cgi-bin/
| settings.pl   … (x)変数に設定を代入している、定義ファイル
-log
| |counter.cgi  … (a)アクセスカウンター ( settings.pl で設定した変数が生きている )
|
-bbs
 .|index.cgi    … (b)掲示板トップ ( settings.pl で設定した変数が消えている )

(a)にて、require '../settings.pl' を行うと、(x)で宣言した変数は生きているのですが
(b)にて、require '../settings.pl' を行っても、(x)の宣言が反映されません。

どなたか、お知恵をお貸しいただければ幸いです。
0496nobodyさん2005/09/19(月) 21:04:41ID:???
>>495
それだけだと
どこかで変数が干渉してんじゃない?
って事しか・・・
0497nobodyさん2005/09/19(月) 21:36:55ID:???
>>495

問題が発生する最も短いソースを作ってみることが大切だね。
そうすると、質問しなくても自分で解る場合も多い。

一番ありそうなのは、変数のスコープが違っているということだろうけど。
0498nobodyさん2005/09/19(月) 21:45:40ID:uGVzhqRv
TXTファイルを、何行目か指定して読み込む方法がありましたら、教えてください。
0499nobodyさん2005/09/19(月) 21:49:45ID:???
>>498
全然試してないけど
my $file = 'hoge.txt';
my $line = 12;

open(FH, $file) || die "$file : $!\n";
while (<FH>) {
next if ($. < $line || $line < $.); # skip
print $_; # 目的の行
}
close(FH);
05004952005/09/19(月) 21:55:20ID:???
>>496-497
レスありがとうございます。
二重require(use) して、干渉しているようです。??(?Д?)

cgi-bin/
| settings.pl   … (x)変数に設定を代入している、定義ファイル
-log
| |counter.cgi  … (a)アクセスカウンター
|
-bbs
 .|index.cgi    … (b)掲示板トップ
 .|BBSthread.pm … (c)スレッド制御モジュール


(b)の index.cgi では、 use BBSthread.pm を宣言していて、
さらに (c) の BBSthread.pm で require '../settings.pl' 宣言していました。

試験的に use BBSthread をコメント化したところ、
settings.pl で設定した値が取得できました。

counter.cgi ではこのような二重require を行っていません。
これが原因っぽいです。
今回は、二重require されないようコーディングすることによって回避します。

ありがとうございました。
0501nobodyさん2005/09/19(月) 22:03:07ID:???
あーあ、解決に必要な情報も示さず自己解決かよ。

質問の上手い下手だけでその人の素質が分かりそうな気がする。
0502nobodyさん2005/09/20(火) 00:12:02ID:???
>>500
同じファイルに対してrequire を二重に実行すると、2回目は読み込まれない。
BBSthread.pm とcounter.cgi とで変数のスコープが違っているなら、
先にrequire した方にのみ、settings.plの内容が反映されることになる。

手っ取り早く解決するなら、require を eval に変更すればいいのだが、
このような使い方は感心しないね。
settings.pl の内容を、システムに共通な定数のリストを返す「関数」
にして、各モジュールはこの関数を呼び出すのが常道だと思われるが。
0503nobodyさん2005/09/20(火) 02:27:35ID:jMPX6Q/f
データベースとperlでデータをCSVに書き出すプログラムを書いています。

SQLで取得したデータをHTMLでテーブルにして表示しているのですが、
よくフリーメールであるような各行にチェックボックスがあって、
それにチェックを入れたデータだけCSVに書き出すといったものを作りたいのですが、
ロジック的にはどういったものになるのでしょうか??チェックボックスでCGIに渡せるパラメータは
○○=on とかってなりますよね。どうやって、データを識別したらよいでしょうか???
0504nobodyさん2005/09/20(火) 02:41:10ID:???
>>503
○○=on になっているものだけ取り出せばOKでは?
0505nobodyさん2005/09/20(火) 03:50:56ID:???
>>503
決してバカにするつもりで聞くわけじゃないけど、今までにCGIのプログラムを
書いて、ブラウザからフォームのデータを受け取ってみたことある?

いや、もしかして、そのレベルでつまづいているんじゃないかと思ったんで。
0506nobodyさん2005/09/20(火) 04:20:05ID:???
>>505
そういうひねくれた質問の仕方すると何かいいことある?

いや、もしかして、初心者いじって喜んでるんじゃないかと思ったんで。
0507nobodyさん2005/09/20(火) 06:54:46ID:???
データベース使っててCSVに書き出すプログラムって・・
0508nobodyさん2005/09/20(火) 07:07:20ID:???
データ作ってストリームで吐き出すか何かするだけじゃないのか
0509nobodyさん2005/09/20(火) 07:19:44ID:???
>>503
<input> には name と value に任意の文字列が指定できる。
チェックボックスの場合、チェックがオンになっているときだけ
name=value という形式の文字列が送られてくる。
従って name が同じでも value が違えば識別できる。
順序は保証されないので、順序に依存してはいけない。
0510nobodyさん2005/09/20(火) 08:49:48ID:???
>>503
試してみてから質問してもらえるか。

> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
05115052005/09/20(火) 11:54:43ID:???
>>506
503の質問って、別の板にもあった。そこでWebProgに行けって言われたから
ここに来たのだろうと思うんだが、質問内容に何も改善がなく、コピペしている
だけなんで、あいかわらず質問者の意図もレベルも分からなかいから、
どこまで分かってる? と、確認しているだけなんだが・・・

何を試したかとか、どこまで分かっているか、とか、情報が一切ないのは困る。
0512nobodyさん2005/09/20(火) 18:16:45ID:???
質問です。
CGI.pmを使ってフォームの値を受け取ろうとしてます。
-----
<form action="hoge.cgi?getval=ggg" method="post">
<input type="hidden" name="postval" value="ppp">
<input type="submit">
</form>
-----
こんな感じのフォームの値を受け取ろうとしているんですが、
GETの引数がCGI.pmに渡されません(この場合getvalが渡されない)
これは仕様でしょうか?何か方法があったりしますか?
0513nobodyさん2005/09/20(火) 18:27:59ID:???
merhodでpost指定してるから
0514nobodyさん2005/09/20(火) 18:28:07ID:???
>>512
> <form action="hoge.cgi?getval=ggg" method="post">

自分で method="post" て書いてるじゃないですか…。GET引数は渡りません。
hiddenで渡してください。
05155122005/09/20(火) 18:42:00ID:???
>513
>514
故意にPOSTを指定してるんです。
actionに「acton=hoge.cgi?getval=ggg」としてるんで、GETの値も渡るかなと思ったんですが、
ダメなんですかね?
そういうものなんでしょうか?
0516nobodyさん2005/09/20(火) 18:53:02ID:???
>>515
それでは、なぜGETとPOSTがあるのかを説明してください。
また、メソッドになぜ両方指定するものがないのかも考えてください。
0517nobodyさん2005/09/20(火) 18:53:22ID:???
>>515
(undef, $getval) = split /=/, $ENV{QUERY_STRING};

でOK。
0518nobodyさん2005/09/20(火) 18:56:07ID:???
>>516
いやいや、量の多い投稿をしたいが、同時に query により
URI も用意したい
という用途はあるぞ。
0519nobodyさん2005/09/20(火) 19:06:19ID:???
> CGI.pmを使ってフォームの値を受け取ろうとしてます。
05205122005/09/20(火) 19:12:18ID:???
>516
えっと、分かりません(汗
なんでなんでしょう?
私の中では、ブックマーク可能なページはGETにしとく、、くらいの認識しかないです。
あと、URL直接叩かれるとまずいページはPOST、、とか。そんな認識でごめんなさい。

>517
CGI.pmに頼らず、自分でパースしなくてはならない、ということですね。
これならできそうです。

で、
POSTのときってURLでパラメータ渡しちゃダメなんでしょうか?それが普通?
php書くときは結構普通にやってたけど、これって考えを改めたほうが良いですか?
0521nobodyさん2005/09/20(火) 19:15:09ID:???
>>520
> POSTのときってURLでパラメータ渡しちゃダメなんでしょうか?それが普通?
お行儀は良くない程度と思っておけばいいんじゃない?
CGI.pmはmethodを見るから受け取れなかっただけ
0522nobodyさん2005/09/20(火) 19:22:09ID:???
>>520
> POSTのときってURLでパラメータ渡しちゃダメなんでしょうか?それが普通?

問題ないと思うよ。
おれもよく使ってる。
0523nobodyさん2005/09/20(火) 21:01:01ID:???
絵文字除去ルーチンを各所サイトを参考に作ったのですが、
もしも下記に間違い等ございましたらご教示いただきたい
次第です。
宜しくお願いいたします。


sub remove_emoji{
my $str = $_[0];

# i-mode, EZweb
my $sjis = '[\x81-\x9F\xE0-\xF7\xFA-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF]';
my $emoji = '[\xF8\xF9][\x40-\x7E\x80-\xFC]';
$str =~ s/\G((?:$sjis)*)(?:$emoji)/$1/go;

# vodafone
$str =~ s/\x1B\$[\x21-\x7A]+\x0F//g;

return $str;
}
0524nobodyさん2005/09/20(火) 22:01:11ID:???
>>523
試してみて不具合がでたら聞きに来い
0525nobodyさん2005/09/20(火) 22:08:21ID:???
>>523
人を Lint 代わりに使わないでくれ
0526nobodyさん2005/09/20(火) 22:23:57ID:???
>>524-525
不愉快な思いをさせてしまい、本当に申し訳ありませんでした。
今のところ不具合はないのですが、もしもアドバイス等いただ
ければと思い書かせていただいた次第です。

悪気はありませんのでお許しください。
すみませんでした。
0527nobodyさん2005/09/20(火) 22:29:15ID:???
>>520
CGIモジュールではPOSTメソッドのときにurlのquery stringで渡した
パラメタはurl_paramっていう別のインタフェースでとるようになって
いるのよ。詳しくはCGIモジュールのマニュアル嫁。特にMIXING POST
AND URL PARAMETERSという見出しのところ。

05285122005/09/21(水) 00:16:24ID:???
>521 >522
なるほど、安心しました。

>527
ごめんなさい。おもいっきり書いてましたね。
どうもありがとうございます。ものすごく助かりました。
精進します。
0529nobodyさん2005/09/21(水) 02:03:43ID:???
このスレって、Lint 代わりに使ってもいい?
0530nobodyさん2005/09/21(水) 11:00:47ID:???
>>529
自作CGIを評価するスレ
http://pc8.2ch.net/test/read.cgi/php/1049514428/
0531nobodyさん2005/09/21(水) 11:41:12ID:AdBzR2Q9
すいません
perlで作成したcgiの質問があります。

HTML側で
<input type=file name="aaa">
<input type=file name="bbb">
とファイルを指定して
perlのcgi側で受け取りたいのですが
やり方がわかりません。

色々ネット上を調べたり「とほほ」を見ていたけど
二つ以上ファイルを受け取る方法がわかりません。

なにか情報をいただけますと幸いです。
0532nobodyさん2005/09/21(水) 13:00:42ID:???
>>531
アップロード以前に、GETやPOSTの受け取り方分かってるの?
まだなら先にそっちから勉強してくれ。
05335312005/09/21(水) 13:22:54ID:AdBzR2Q9
う、、、大変申し訳ありません。
今の所
use CGI;
my $cgi = new CGI;
my $comment = $cgi->param('comment');
上記のようにして取得しています。

だたファイルの場合はどうすれば取得できるのか不明だったため
質問させていただきました。
0534nobodyさん2005/09/21(水) 13:51:44ID:???
送信側は ENCTYPE="multipart/form-data" になってる?
これが原因じゃなかったら他の回答者のレスに期待してくれ。
05355312005/09/21(水) 15:03:05ID:AdBzR2Q9
送信側は↓のようにしているんでなってます、、、
<FORM METHOD=POST ENCTYPE="multipart/form-data" ACTION="test02.cgi">
<INPUT TYPE=file NAME="AAA"><BR>
<INPUT TYPE=file NAME="BBB"><BR>
<INPUT TYPE=submit VALUE="送信">
うーむ 助けて偉い人ー
0536nobodyさん2005/09/21(水) 15:37:57ID:???
>>531
1つも2つも同じことを繰り返すだけだろ
05375312005/09/21(水) 15:56:07ID:AdBzR2Q9
えーっと
INPUT TYPE=file
のデータの取得方法が分からないのです、、、

説明不足で申し訳ありません
05385312005/09/21(水) 15:58:18ID:AdBzR2Q9
(追記)
ひとつだけだったら
http://web.archive.org/web/20010210200144/wakusei.cplaza.ne.jp/twn/cgi-bin/wwwupl2.txt
で取れるとわかったのですが。
0539nobodyさん2005/09/21(水) 16:40:09ID:???
>>531
ヒント:>>403
0540nobodyさん2005/09/21(水) 17:10:37ID:???
>>538
うへ、スクラッチで書いてるのか。悪いことは言わないから
CGIモジュール使うことをオススメするね。
05415312005/09/21(水) 17:13:23ID:AdBzR2Q9
はいー
えーっとそのCGIモジュールを使用した際の
取得方法をお教えいただきたいのです。

わがままなのは十分承知しておりますが
ヒントではなくズバリッお教えいただけますと幸いです。
0542nobodyさん2005/09/21(水) 17:21:41ID:???
>>541
CGIモジュールの使い方をどうやって調べるか?
下記の順序でお試しください。

1.マニュアルを読む
2.和訳がないかググる
3.分かりやすく説明したサイトがないかググる
4.使っている他のスクリプトがないかググる
5.開き直ってにちゃんねるで聞く

05435312005/09/21(水) 17:36:51ID:AdBzR2Q9
ぐぐりまくって以下のようにし解決しました。
use CGI;
my $buffer;
my $query = CGI->new;
my $file = $query->param('BBB');
#my $file_name = ($file =~ /([^\\\/:]+)$/) ? $1 : 'uploadedd.bin';
my $file_name = 'aaa.jpg';
open(OUT, ">$file_name") or die(qq(Can't open "$file_name".));
binmode OUT;
while (read($file, $buffer, 1024)) {
print OUT $buffer;
}
close OUT;

どうもお騒がせいたしましたっ
0544nobodyさん2005/09/21(水) 22:30:20ID:???
1行例書いてあげればいいだけなのに、不親切だなあ。 いいけど。
0545nobodyさん2005/09/21(水) 23:07:53ID:???
不親切だなぁとか書かれて親切になったスレでもあるわけ?いいけど。
0546nobodyさん2005/09/22(木) 02:02:03ID:???
言い出しっぺの法則
0547nobodyさん2005/09/22(木) 05:13:05ID:???
>>544
自分は書いてあげる気はないけど、他人には書けばいいのにと言うわけね。
0548nobodyさん2005/09/22(木) 09:00:24ID:???
もう自己解決したみただしいいじゃないか
0549nobodyさん2005/09/22(木) 10:10:21ID:???
自己解決しました
0550nobodyさん2005/09/22(木) 17:44:54ID:???
自己発電しました
0551nobodyさん2005/09/22(木) 17:46:12ID:???
自己誘電しました
0552nobodyさん2005/09/22(木) 18:00:03ID:???
自己陶酔しました
0553nobodyさん2005/09/22(木) 18:34:37ID:???
自己破産しました
0554nobodyさん2005/09/22(木) 19:49:05ID:???
自己弁護しました
0555nobodyさん2005/09/22(木) 19:57:59ID:???
各ソースに共通で使える定数を用意したくて、以下の3つのソースを用意しました。
↓test.pl
-----
#!/usr/bin/perl
use strict;
use const; # この行をコメントアウトすると動く
use func;
my $obj = func->new();
$obj->print_var();
-----
↓func.pm
-----
package func;
use const;
sub new() {
my $class = shift;
my $self = {@_};
bless $self, $class;
}
sub print_var() {
printf('[%s]', FOO);
}
1;
-----
↓const.pm
-----
use constant FOO => 'aaa';
1;
-----
tesp.plを実行しても、const.pmの中のFOOの値が表示されずに、そのまま"[FOO]"が表示されます。
でも、test.plの中の「use const;」をコメントアウトすると、きちんと"[aaa]"が表示されます。
各ページで共通の定数を用意したいときは、違う方法が必要なのでしょうか?
0556nobodyさんNGNG
Perl5.8以前のサーバー環境で使っていたCGIが
Perl5.8以降のサーバーで動作しなくなったのですが
使えなくなった関数などがあるのでしょうか?
わかる方いましたら教えてください。
0557nobodyさん2005/09/22(木) 20:37:31ID:???
適当だけど、内部で扱うコードがutf-8になったぐらいしか
0558nobodyさん2005/09/22(木) 20:45:04ID:???
>>556
問題が再現する最小のソースを書くべし。
書く過程で解決することも多々。
0559nobodyさん2005/09/22(木) 20:56:13ID:???
>>555
そのやり方ではだめ。const.pmが最初にuseされるときにカレントの
パッケージでFOOが定義されて、それ以後のuseでは既に読み込まれている
ので無視されている。test.plのuseをコメントアウトすると動くのは
それによってfunc.pmでのuseが最初になるからだ。

で、こういう用途には定数をexportするモジュールにするのが普通。
perlmod読んでパッケージとモジュールについて勉強するのがいいだろう。
0560nobodyさん2005/09/22(木) 21:04:17ID:???
Perl5.8以前のサーバーとPerl5.8以降のサーバーってまったく別の鯖かな?
なら関数とかいうんじゃなくて鯖独自の問題のような希ガス
0561556NGNG
CGIゲームなのですが同じログが何個も何個も表示されます。

sub NewsChange {
for ($NC = $NewsMax; $NC >= 2; $NC--) {
$News[$NC] = $News[$NC - 1];
}
$News[1] = $_[0];

$GFyear++;
}

ここらへんが誤動作してそうです・・・。
0562556NGNG
CGIゲームなのですが同じログが何個も何個も表示されます。

sub NewsChange {
for ($NC = $NewsMax; $NC >= 2; $NC--) {
$News[$NC] = $News[$NC - 1];
}
$News[1] = $_[0];

$GFyear++;
}

ここらへんが誤動作してそうです・・・。
0563nobodyさん2005/09/22(木) 21:13:13ID:???
>>556
perl58delta
0564nobodyさん2005/09/22(木) 21:15:48ID:???
>>561
そんな基本的なことしかしてないコードの動作が
かわるとはまず思えないので、問題はその範囲
にはないな。
0565nobodyさん2005/09/22(木) 22:08:46ID:???
>>561-562
> 同じログが何個も何個も表示されます。

何個も書いているのだと思われ。
0566556NGNG
>>560
まったく別なんですが3つのサーバーで試してずっと前から使ってた1つ目のサーバーは大丈夫で
2つ目、3つ目の新しいサーバーが同じようなバグが出て使い物にならなかったので
新しい仕様だから使えないのではないかと思いました。
0567nobodyさん2005/09/22(木) 22:54:51ID:???
エラーメッセージを書いてくれ
0568556NGNG
>>567
エラーメッセージは出ません。
まったく同じスクリプトをまったく同じ手順で設置しているんですが
正常にゲームができるサーバーと、ゲーム開始直後に
同じログがずらりと並んでゲームができなくなるサーバーがあります。
0569nobodyさん2005/09/22(木) 23:15:47ID:???
それしか情報がないんじゃエスパー回答者のお出ましを
願うしかないような希ガス。
0570nobodyさん2005/09/22(木) 23:28:38ID:???
>>556
ソース晒せないならこの話題は終わり。
0571nobodyさん2005/09/23(金) 00:46:02ID:???
>>556
ログってあんたが勝手に考えた仕組みだろう。
そのログを取る部分、そしてログの意味とか晒してもらわにゃ何とも言えん。

ていうか、変数の流れを追えばちゃんとエラーを特定できるはずだから。
0572nobodyさん2005/09/23(金) 01:02:22ID:???
>>556
ブラックボックスを提示して「動きが変です、助けて下さい」って言って、
まともな回答が帰ってくると思うか?
0573エスパー回答者2005/09/23(金) 01:51:44ID:???
>>561
FORTRAN に対する郷愁が無いのなら、@Newsは0番目の要素から使うようにすべきだろう。
unshift @News, $new_element;
splice @News, $NewsMax-1;
$GFyear++;

とすれば、誤動作していたサブルーチンNewsChange を削除することができる。
これで問題は全て解決する(......はずだよな)。
0574nobodyさん2005/09/23(金) 10:48:25ID:???
CGIゲームは専鯖か自鯖でやれよ
0575nobodyさん2005/09/23(金) 11:41:48ID:???
そこでAjaxですよ。

とか、言ってみたりする。
0576nobodyさん2005/09/23(金) 11:47:00ID:???
Ajax の方が負荷かけるのは簡単だけどな。
JavaScript にしとけ。
0577nobodyさん2005/09/23(金) 12:07:02ID:???
Flashも、通信クライアントになれるんだっけ?
0578nobodyさん2005/09/23(金) 15:02:27ID:???
>>577
なれるけどスレ違い。
0579nobodyさん2005/09/23(金) 16:12:52ID:NELxQvyQ
http://psmk2.net/


ここのアクセスカウンターって改造されてね?
0580nobodyさん2005/09/23(金) 16:20:20ID:???
スレ違い
0581nobodyさん2005/09/23(金) 16:35:54ID:???
>>579
全然改造されて無いじゃん
氏ね
0582nobodyさん2005/09/23(金) 20:49:12ID:???
ageてるんだから宣伝だろ。
0583nobodyさん2005/09/23(金) 21:32:21ID:???
お気に入りにいれてやろうかゴラァ!!
0584nobodyさん2005/09/26(月) 01:11:42ID:???
質問です。
Perl内で、他のURLにあるデータを参照することはできますか?
具体的には、
open(WORK,"http://www.hogehoge.net/foo/baa.txt");
みたいな事です。
0585nobodyさん2005/09/26(月) 01:32:11ID:???
>>584
LWP
0586nobodyさん2005/09/26(月) 01:47:23ID:???
>>584
実在するドメインを例示に使うなとあれほど(ry
0587nobodyさん2005/09/26(月) 02:22:09ID:???
ちゃんと例示用に予約された example.jp とか、 example.com があるのに、
なぜゆえ・・・
0588nobodyさん2005/09/26(月) 02:59:24ID:???
そこに、ドメインがあるからさ、フフフ・・・ ><
0589nobodyさん2005/09/26(月) 04:43:37ID:???
hogeとfugaも日本人用に予約しておけよな
0590nobodyさん2005/09/26(月) 04:49:01ID:???
>>589
藻前が買ってボランティア汁。
0591nobodyさん2005/09/26(月) 17:53:48ID:???
プログラム板で聞いたら板違いと、言われたので再度ここで質問させてください。

チェックボックスでデータを受け取って
HTMLの確認画面に反映させるプログラムを作っているのですが
行き詰まりました。

例えば、course1,course2,course3とあってcourse1とcourse3がチェックされたら
course2のところが空白で反映されます。

ex.)HTML出力画面
course1

course3

こんな感じになります。

この空白を詰めて

course1
course3
みたいな風に出力したいのですがどのようにすれば良いでしょうか?
05925912005/09/26(月) 17:54:19ID:???
ちなみにソースはこんな感じです。汚くてごめん・・。

if($FORM{'course1'} ne "on"){
print "<TR><TH ALIGN=\"right\" VALIGN=\"top\">希望コース:</TH><TD>\n";
print "$HTML{'course1'}\n";
print "<INPUT TYPE=\"hidden\" NAME=\"course1\" VALUE=\"$FORM{'course1'}\">\n";
print "</TD></TR>\n";
}


if($FORM{'course2'} ne "on"){
print "<TR><TH ALIGN=\"right\" VALIGN=\"top\"></TH><TD>\n";
print "$HTML{'course2'}\n";
print "<br>";
print "<INPUT TYPE=\"hidden\" NAME=\"course2\" VALUE=\"$FORM{'course2'}\">\n";
print "</TD></TR>\n";
}
0593nobodyさん2005/09/26(月) 18:03:42ID:???
>>591
>>592も質問するには情報足らないので、エスパーのフリをしてみる。
foerach ('course1','course2','course3') {
if ($FORM{$_} eq "on") { next; }
print "<TR><TH ALIGN=\"right\" VALIGN=\"top\">希望コース:</TH><TD>\n";
print "$HTML{$_}\n";
print "<INPUT TYPE=\"hidden\" NAME=\"$_\" VALUE=\"$FORM{$_}\">\n";
print "</TD></TR>\n";
}
これでまず問題点を切り分けてくれ。
0594nobodyさん2005/09/26(月) 18:16:11ID:???
>>591
思うにそれは空白をつめて表示させるためにはどのようなHTMLであるべきか
という問題であって、それさえわかってしまえばその通り出力するプログラムを
書けばいいだけだから、まずHTMLに詳しい人がいるところで質問するのが
スジってもんじゃないだろうか。ここにもいるかもしれないけどさ。

05955912005/09/26(月) 18:19:54ID:???
>>593
ありがとうございます、無事に動きましたw
エスパーですね!
すみません、情報不足で・・。>>594さんが書いた通りです。

>>594
すみませんでした。 orz
0596nobodyさん2005/09/26(月) 18:27:36ID:???
どうやらエスパーになれたらしい。
変数以外で同じ文字を出力する場合とかは、とりあえずループにかければ問題点は見つかる。
コピペしたつもりでも、うっかりで変わってたりするから。
05975912005/09/26(月) 18:30:46ID:???
>>596
勉強になりました。ありがとうございました。
0598nobodyさん2005/09/26(月) 21:18:44ID:Q7jBJFo3
$FORM{$_} eq "on" and print <<"END" foerach qw( course1 course2 course3 );
<TR>
 <TH ALIGN="right" VALIGN="top">希望コース:</TH>
 <TD>
  $HTML{$_}
  <INPUT TYPE="hidden" NAME="$_" VALUE="$FORM{$_}">
 </TD>
</TR>
END

エスケープとかprint連記とかキモイからこれぐらいスッキリしてもらえる?

いや、オナニーだけどさ。
0599nobodyさん2005/09/26(月) 21:48:52ID:fXbmUf3O
foerach
0600nobodyさん2005/09/26(月) 22:27:10ID:???

ヒントをいただきたく思っております。

cgiで書き出すhtmlページ page1 → page2 に進んで、 page1に戻ったときに 「あんたpage2に進んだからもう戻れないよ!!」

ってやりたいのですが、

集めた情報では cookieでセッション管理して、page1でcookie → page2でcookieになんか値を持たせる。
でもってpage1に戻ったら値違うからダメよ!みたいなことをしろ!! 

とあったのですが、どんなソースなのかさっぱりです。。

どなたか道しるべいただけませんでしょうか?所謂ブラウザの戻る制御みたいなことなのですが、
phpではなく perlでやりたいです。


野暮な質問ですいません。何卒宜しくお願いいたします。
0601nobodyさん2005/09/26(月) 22:38:13ID:???
>>600
その集めた情報の意味がわからないなら、ここで聞いても意味がないと思います。
クッキーの保存と呼び出しの勉強をしてきてください。
ついでに、ブラウザの戻る進むでは意味がないのであしからず。
0602nobodyさん2005/09/26(月) 22:44:25ID:???
>>601
ブラウザのバックはjavascriptで消せる。

Cookieの送り方が分からないんじゃどうしようも無いがな。
0603nobodyさん2005/09/26(月) 23:05:12ID:???
このサイトはもちろん見ましたよね?

http://www.google.com/search?num=50&hl=ja&q=perl+%E3%82%AF%E3%83%83%E3%82%AD%E3%83%BC&lr=lang_ja
0604nobodyさん2005/09/26(月) 23:07:24ID:???
>>601さん
レスありがとうございます。

最近cookieの勉強を始めたばかりなので、ほんとに基本しか知らないのですが、
この場合は、NAME= 値(たとえば1)、 print "path=", "/page2 ";  でpage2に値を持たせて。。
戻ったときにエラーを出す方法がよくわからないのですが。。。勉強不足ですいません。

0605nobodyさん2005/09/26(月) 23:29:13ID:???
>>602
ブラウザはIEだけじゃないですよ。
>>604
検索の方法から勉強してください。
0606nobodyさん2005/09/26(月) 23:45:44ID:???
>>604
いやいや、俺始めてクッキーを知った日に応用は出来なかったけどそれぐらいの事は出来たが・・・・

まぁ>>601氏の言うようにブラウザの戻るはキャッシュがほとんどなので(略
0607nobodyさん2005/09/27(火) 09:58:18ID:???
>>600
http://perldoc.jp/docs/modules/CGI-Session-3.11/Tutorial.pod
http://perldoc.jp/docs/modules/CGI-Session-3.11/Session.pod
これでセッションは、だいたい分かると思うけど。
0608nobodyさん2005/09/27(火) 23:34:13ID:1E14u9Km
$sql =~ s/(\\|\'|\%|\,)/\\$1/g;

これがおかしな挙動を見せるのでググってみたところ、
%は%%でエスケープすることを学習したのですが、

$sql =~ s/(\\|\'|%%|\,)/\\$1/g;
こうした場合、「%」1つの入力であれば正常にエスケープされるように
なってのですが、「%%」と入力するとなぜか\\%%になってしまいます。

ご教示いただけますと非常に助かります。
0609nobodyさん2005/09/27(火) 23:41:28ID:???
おまいがしたいのはこれではないのか?
$sql =~ tr/\'%,/\\\'\%\,/;

それと安易にエスケープするな\Q使え
0610nobodyさん2005/09/27(火) 23:56:08ID:???
>>609
早速のご返答有難うございます。

しかし、「\\\\\'''''%%%%%」と入力したところ、
「\\\\\\\\\\'''''%%%%%」となりました。

前の\のみエスケープされているみたいです。
0611nobodyさん2005/09/28(水) 00:02:13ID:???
別の方法も試してみましたが、だめでした。

$sql =~ s/\Q(\\|'|%|,)\E/\\$1/g;

これですと
「\\\\\'''''%%%%%」は「\\'''%%%%%,,,,,」になってしまいました。。
0612nobodyさん2005/09/28(水) 00:07:50ID:???
何をしたいんだっけ?
06135842005/09/28(水) 00:12:25ID:???
ありがとうございます。
LWP・・・。

プロレス団体みたいですね。

0614nobodyさん2005/09/28(水) 00:14:48ID:???
lib-www-perl すごいプロレス団体でつね。
0615nobodyさん2005/09/28(水) 00:46:08ID:???
解決しました。

よくわかりませんが、
$sql =~ s/(\\|\'|\\%|\,)/\\$1/g;
にすることによって解決しました。

お騒がせしました。
0616nobodyさん2005/09/28(水) 00:47:05ID:???
Larry Wall Prowrestling
0617nobodyさん2005/09/28(水) 01:02:47ID:MTwQib0M
Perlで数学的な演算をやろうと思っているのですが、
15桁(1÷3の場合は小数第14位)までしか計算出来ないようです。

例えば、1 / 3 を計算すると、
0.33333333333333 となってしまいます。


例えば、1 / 3 の結果を 100桁で出力させたい場合は、
小数第5000位で割り切れる割り算の答えを正確に (= 小数弟5000位まで) 出力したい場合には
どのようなコードにすれば良いでしょうか?

ご教示お願いします。
0618nobodyさん2005/09/28(水) 01:03:41ID:???
誤) 例えば、1 / 3 の結果を 100桁で出力させたい場合は、
正) 例えば、1 / 3 の結果を 100桁で出力させたい場合や、


間違えました。申し訳ありません。
0619nobodyさん2005/09/28(水) 01:34:06ID:???
>>617

Math::BigFloat
0620nobodyさん2005/09/28(水) 08:23:08ID:???
>>617
use bignum;

bignum->div_scale(100);
my $x = 1.0;
print $x/3, "\n";

bignum->div_scale(5000);
my $y = 1.0;
print $y/7, "\n";
06216172005/09/28(水) 17:07:26ID:???
>>619-620
ご教示ありがとうございます。
実際にやってみたら正常に動作しました。

div_scale(); で無限に計算を続けるようになるとおもったら
数百桁までしか計算されていないようなので、
div_scale(1000000000000000000) みたいに馬鹿でかい数をいれたら
期待通りに動作しました。
0622nobodyさん2005/09/29(木) 09:36:51ID:???
 <html>
 <head><title>test</title></head>
 <body>test</body>
 </html>
上のようなHTMLファイルを読み込んで、
gzip圧縮してブラウザにかえすCGIを作っています。

gzip圧縮する部分はネットの記事を参考に出来たのですが
HTMLを読み込んでCGIに出力させるにはどうすればよいでしょうか。
0623nobodyさん2005/09/29(木) 09:53:31ID:???
>>622
そういうことしたいときは、mod_gzip ってものを使うんですが。
0624nobodyさん2005/09/29(木) 10:05:50ID:???
>>622
質問の意味がよく分からんが、

print <<END;

<html>
<head><title>test</title></head>
<body>test</body>
</html>
END

でいいのでは?
0625nobodyさん2005/09/29(木) 10:16:37ID:???
sub fuck {
local $/;
open(F, "fuckyou.html") || die "why don't you fuck?"
my $buf = <F>;
close(F);
return $buf;
}

こーゆーことをしたいとかじゃなくて?
こんな基本すら書けない人間が gzip とか言ってるのってありえんとおもた。
0626nobodyさん2005/09/29(木) 10:26:27ID:???
>>625
http の レスポンスヘッダを返さないと。

>>622
print "\n", `cat hoge.html`;
0627nobodyさん2005/09/29(木) 10:27:10ID:???
>>626
IIS な鯖だったら cat できんわけだが。
0628nobodyさん2005/09/29(木) 13:45:10ID:???
#!/usr/local/bin/perl

use CGI
cgi = new CGI

(formの値をどうたらこうたら)

(メイン演算)



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

print "<html>\n";

(演算結果をprint)

print "</html>";


という感じのPerlのCGIがたくさんあるのですが、
一つだけHTMLソースがベタ書きで出てしまいます。
Win IE ではちゃんと見えるのですが、Mozilla でソース丸見えです。
他も同じように作ってるつもりなのに、なぜこれだけ失敗するのかわかりません。
何か勘所ありましたらお教えくださいませ。 よろしくお願いします。
0629nobodyさん2005/09/29(木) 13:59:24ID:???
>>628
たくさん cgi ファイルがある設計がどうかしていると思われ。
0630nobodyさん2005/09/29(木) 14:05:41ID:???
>>629  ? なんで?
演算ごとに作っておいた方がラク。
0631nobodyさん2005/09/29(木) 14:09:41ID:???
>>628
問題が再現する最小のソースを書くべし。
0632nobodyさん2005/09/29(木) 14:11:47ID:???
>>628
ソースって中濃?とんかつ?
どのソースが見えてる?
0633nobodyさん2005/09/29(木) 14:13:15ID:???
>>630
何をもってラクとするかだよね。
MVC フレームワークとか勉強してみてください。
0634nobodyさん2005/09/29(木) 14:20:46ID:???
>>628
HTMLがテキストで見えるのなら、Content-typeが上手く出力されてないと思われ。
出力されてるヘッダを確認。
0635nobodyさん2005/09/29(木) 14:21:56ID:???
ヘッダって何ですか?とか聞かれる悪寒。
その次に、確認方法きぼんぬ。とかね。
0636nobodyさん2005/09/29(木) 14:49:09ID:???
>>635
perlをローカルにインスコしてるなら、lwp-requestコマンドが使えるので、コマンドラインから
lwp-request -e -d http://example.net/
という感じでアクセス。
0637nobodyさん2005/09/29(木) 14:50:07ID:???
>>634 ちゃんと text/html と思われているもようでつ。
演算部分をカットしても表示変わらず。 
もっかいよく見てみます  どうもありがとうございました。
0638nobodyさん2005/09/29(木) 15:14:00ID:???
こういうのを見てると、どーかんがえても何らかのフレームワークに乗ったほうが楽だね。
0639nobodyさん2005/09/29(木) 19:45:41ID:???
だから、みんなPHPに流れたのかも。
0640nobodyさん2005/09/29(木) 20:02:55ID:???
PHPやだ、Perlが良い!
0641nobodyさん2005/09/29(木) 20:33:30ID:???
「みんな」流れたことにしたいのでつか?
p2 とか見てると、芸術的なすぱげっちーだし、

> たくさん cgi ファイルがある設計がどうかしていると思われ。

って感じだしなぁ。
06426392005/09/29(木) 21:56:36ID:???
>>641
ほらほら、いちいち噛み付かない。

「みんな」ってのは、「ダメなやつはみんな」という意味だ。
そう書けば満足かな?

もっとも、新規にダメなやつが参入してくるから、あんまり
状況は変わってないが。

> たくさん cgi ファイルがある設計がどうかしていると思われ。

うん。一つ一つは正しそうに動くのに、全体を流すとつじつまが
あわなかったりしてね。まあ、きちんと管理できるなら、小分けに
したほうがいいという考えもありだとは思うけど。
0643nobodyさん2005/09/29(木) 22:00:27ID:???
>うん。一つ一つは正しそうに動くのに、全体を流すとつじつまが
あわなかったりしてね。まあ、きちんと管理できるなら、小分けに
したほうがいいという考えもありだとは思うけど。

テキストエディターのスクロールバーがちっこくなって、
編集時のスクロールでドラッグしにくいので、
用途や動作内容に分けて分割してる。
0644nobodyさん2005/09/30(金) 00:31:42ID:???
ファイルをオープンしようとすると、ファイルがある・またはファイルを作ろうとしているのに何故かNo such file or directoryが出てくるので
手前で$!を見てみたところ、Bad file descriptorと出てきて、その原因が分からなくて困っています。

Bad file descriptorはどんな状態のときに出るのでしょうか。
色々試したところ、 require 'hoge.pl'; (hoge.plは自前のもの)を削ると上記のエラーが出なくなるのですが、
hoge.plの中身を削って行ってもエラーが消えません。
requireに制限でもあるのでしょうか。

http://e-words.jp/w/E38395E382A1E382A4E383ABE38387E382A3E382B9E382AFE383AAE38397E382BF.html
これを見てもどこで何が起こっているのか見当が付きません。よろしくお願いします。
0645nobodyさん2005/09/30(金) 00:54:07ID:EO7sC93p
PDFのファイルの印刷をActivePerlから行いたいのですが、どのように行えば良いのでしょうか?
06466442005/09/30(金) 01:20:52ID:???
No such file or directoryについては解決しました。Bad file descriptorは関係ありませんでした。
しかしBad file descriptorが出たままなので気味が悪いです。一体何が問題なのでしょうか。
0647nobodyさん2005/09/30(金) 03:16:19ID:???
携帯に対応させる為のPerlコーディングは、
一般的にどのようなコーディング方法がありますか?
0648nobodyさん2005/09/30(金) 03:56:57ID:???
優勝記念マジレス
>>647
携帯でPerlを動かすのは聞いたことがないのでCGI用途とすると、
スクリプトはサーバ側の環境に依存するから自由にコーディングできる。
あとは問題なるかも知れないHTTP(リクエスト/レスポンス)ヘッダと問題になりそうなキャリア特有のhtml(chtmlとかhdml)。
前者はPerlに限ったことじゃないし、後者は板が違うね。
0649nobodyさん2005/09/30(金) 08:41:28ID:???
>>642
> ほらほら、いちいち噛み付かない。

>>641 を噛み付ついている状態であるとみなしているくせに、
どーして、そんな噛み付いているやつに、噛み付くのだろう。

> うん。一つ一つは正しそうに動くのに、全体を流すとつじつまが
> あわなかったりしてね。まあ、きちんと管理できるなら、小分けに
> したほうがいいという考えもありだとは思うけど。

ちゃんとした設計してれば、「小分け」の状態が良いと思われ。

>>648
> 優勝記念マジレス

板が違うね。
06506472005/09/30(金) 10:13:27ID:???
ありがとうございました。
0651nobodyさん2005/09/30(金) 10:18:00ID:???
真面目につっこむと

理想的に「小分け」された状態ってのは
「cgi」がたくさん小分けに作られるという意味ではないよね?
0652nobodyさん2005/09/30(金) 14:09:04ID:???
テラワロス
0653nobodyさん2005/09/30(金) 14:54:58ID:???
>>651
フレームワーク厨が暴れる前の発言では、

小分け == cgi たくさん

が成り立ってるっぽいので、何とも言えないのでは?
0654nobodyさん2005/09/30(金) 15:29:51ID:???
>>653
いやいや、>>651は>>649への突っこみと読むべきだろう。
0655nobodyさん2005/09/30(金) 17:05:31ID:kGP+cAoI
>>649
いちいち噛み付かない。
0656nobodyさん2005/09/30(金) 17:12:02ID:???
>>651
ちゃんとした設計をしているなんて前提条件なかったじゃん。
後出しジャンケンっぽくて、ちょっとイヤーンだぞ。

そもそも、

> ちゃんとした設計してれば、

という前置きがつけば、何でも正当化できる。

『ちゃんとした設計をしていれば、○○の状態がよい』は、
無敵であるがゆえに、何も語っていないのと同じ。
0657nobodyさん2005/09/30(金) 20:15:08ID:???
> 無敵であるがゆえに、何も語っていないのと同じ。

異なる性質のものを同じにしたいのですか?
0658nobodyさん2005/09/30(金) 20:19:04ID:???
> > ちゃんとした設計してれば、
>
> という前置きがつけば、何でも正当化できる。

ほう、何でも正当化できるんですか。それはすごい言葉ですね。
今回の小泉タン違憲問題も「ちゃんとした設計してれば、」をつけて
正当化の程よろしくおながいします。
0659nobodyさん2005/09/30(金) 20:37:17ID:???
藻前ら共食いやめろ。
0660nobodyさん2005/09/30(金) 20:42:25ID:ue8bjOg5
ここは話題を逸らしてどれだけ釣れるかを競うスレですね
0661nobodyさん2005/09/30(金) 21:04:35ID:???
> Perlのコーディングで困ってる人のスレです。
0662nobodyさん2005/09/30(金) 22:49:26ID:???
面白い話があるからおまいら聞いてくれ。

彼女が医療関係の学校に通ってるんだが、実習か何かで精神
障害者の施設へ行ったそうなんだ。それが終わって会った時に、
単なる会話として「大変だった?」とか訊いてたら、「あなたと同じ
本を読んでる患者がいた」って言うんだよ。隠してあったエロ本が
見つかったのかと動揺してたら、「あれだよ、表紙に動物の絵が
書いてあるコンピュータの」って言うから、オライリーのを順番に
見せていったら「それそれ! ラクダのやつ」だって。

施設の人が言うには、その患者は絶対にその本を手放さないし、
取り上げると錯乱するからずっと持たせてあるんだってさ。
0663nobodyさん2005/09/30(金) 23:10:31ID:???
で?
0664nobodyさん2005/09/30(金) 23:23:25ID:???
ラクダ本がどうかしたか?
0665nobodyさん2005/09/30(金) 23:43:37ID:???
他スレの終わったネタを持ち込むなよ。
0666nobodyさん2005/10/01(土) 00:06:13ID:tjNKkKzJ
perl でCGIに挑戦中の者です。
何日考えても歯が立たない問題にぶち当たったので、詳しい人の知識をお借りしたいです!!

私がやりたいことは、textファイルのある一行を、別のデータで上書きするということをしたいです。
現在、削除する行を探すためにforeachを使っています。

私の望むイメージはこのような感じです。
-------aaaa.txtのファイル------
あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの
-------------------------
↑を
---------------------------
あいうえお
かきくけこ
さしすせそ
なにぬねの
------------------------

削除したい行を特定する部分は自分でなんとかできたのですが、肝心の削除方法が理解不足でどのようにすればいいのか分かりません。
ご教授お願いします。
0667nobodyさん2005/10/01(土) 00:10:24ID:tjNKkKzJ
何を言ってるのか良くわかんなくなってました。ごめんなさい。

私が知りたいのは、削除するためにはどのようにすればいいのか、です。
0668nobodyさん2005/10/01(土) 00:18:13ID:???
こう考えよう。

・今あるデータを配列に読み込む
・新しく作るデータを入れる配列を用意する
・消したい行だけを新しい配列に入れない
・新しい配列をファイルに書き込む
0669nobodyさん2005/10/01(土) 00:25:11ID:???
この際だから書いちまうか

open (TXT, "<aaaa.txt");
flock (TXT, 1);
@data = <TXT>;
close TXT;
@new = ();
foreach (@data) {
 if ($_ ne "たちつてと\n") {
  push (@new, $_);
  }
 }
open (TXT, ">aaaa.txt");
flock (TXT, 2);
print TXT @new;
close TXT;
0670nobodyさん2005/10/01(土) 00:36:22ID:???
文字の置き換えについて教えてください!

$okikae =~ s/文字/変更後の文字/g;

までは分かりましたが、
チルダやスラッシュを含む文字を置き換えるときはどうすればよいのでしょうか?
例として/~id/aaa/aaa/を/bbb/に置き換えるには??
教えてください。
0671nobodyさん2005/10/01(土) 00:44:17ID:???
メタ文字
エスケープ
などの言葉で検索すると幸せになれるかもしれない
0672nobodyさん2005/10/01(土) 07:28:28ID:???
> 幸せになれるかもしれない

なんてどこの老人が使い始めた言葉なのか知らないけど、
見るたびに気持悪くなる・・・。
0673nobodyさん2005/10/01(土) 08:58:47ID:???
うぐぅ、ぎもじわるぃ…
0674nobodyさん2005/10/01(土) 10:35:57ID:???
幸せになれるかもしれないとか見るたびに気持ち悪いとか言い出したのは誰なのかしら
0675nobodyさん2005/10/01(土) 11:27:36ID:???
>>672->>674

>>660
0676nobodyさん2005/10/01(土) 12:54:48ID:???
m9プギャ
0677nobodyさん2005/10/01(土) 14:07:37ID:3dTdip7r
MIMEについての質問です。

以下のようにMIMEを使ってメールを受信して本文を取得するプログラムを作っています。

#!/usr/bin/perl

use File::Basename;
use MIME::Parser;


my $parser = MIME::Parser->new;


#ファイルの一時保存場所を指定
$parser->output_dir('/tmp');


#標準入力からメールを取得
my $entity = $parser->parse(\*STDIN);
my $body_entity = ($entity->is_multipart) ? $entity->parts(0) : $entity;
my $body = $body_entity->bodyhandle;

open(FILE, ">> /log");
print FILE "Test\n";
print FILE $body->as_string."\n";
close(FILE);

ですが、何故か$body->as_stringの時点で本文が拾えず空文字列になります。
ちなみにheadなどのメソッドや、ファイル添付時のis_multipart、partsなどは正常な値を返します。

どういった理由が考えられるのでしょうか?
0678nobodyさん2005/10/01(土) 14:34:03ID:???
MIME::Explode とかが使いやすかった気がするけど。
0679nobodyさん2005/10/01(土) 23:13:02ID:???
>>646
遅レスだが、$!(errno)はシステムコールやライブラリ呼び出しが
失敗したときは値がそれに応じて設定されるけど、成功したときは
未定義なので、何になっているかはわからない。

perldoc perlvarの$!の説明をよく嫁。

0680nobodyさん2005/10/02(日) 04:48:22ID:???
すみません。
http://internet.watch.impress.co.jp/www/article/1999/1122/special.htm
でフォームからメールがおくれたのですが、確認画面を表示させたいのですが、
どのように書いていけばよいのでしょうか。
よろしくお願いします。
0681nobodyさん2005/10/02(日) 09:19:04ID:???
どのようにって・・・
まさか手取り足取り一から十まで順を追って説明しろなんて
ふざけた要求してるわけじゃないよな?

ここの説明を参考にやったんなら、
確認画面の表示の有るフォームメールcgiをいくつかダウンロードして
スクリプトを眺めてみればいいんじゃない?
0682nobodyさん2005/10/02(日) 10:23:03ID:???
スカラーコンテキストの演算子に
文字列の一部を正規表現でキャプチャし一発で渡したい時にはどうすればいいでしょうか?
一応 op ${\("STR" =~ /REGEX/g)}; でできるのですが冗長ですよね。
0683nobodyさん2005/10/02(日) 11:42:59ID:???
>>682
そういうのは一行で書く必然性が無ければ
二行に分けた方が読み解き易く美しい。

"STR" =~ /(REGEX)/;
op $1;

> ${\("STR" =~ /REGEX/g)};
REGEX にマッチした部分文字列の*リスト*を返した上で
無理矢理一つだけを利用しているのが無駄と混乱を招く。
どうしても /g を使いたければ

op +("STR" =~ /REGEX/g)[0];

とでもした方がいいだろう。
0684nobodyさん2005/10/02(日) 11:53:28ID:???
>>682
おそらく /g を付けているのは問題回避のためだろうから、
値1つを取れればいいなら

op +("STR" =~ /REGEX/)[0];
06856822005/10/02(日) 12:38:08ID:???
>>683 >>684
ありがとうございます。確認しました。
/gはラクダ本(日3版175P)に「リストコンテキストでm//gを使って…」とあったので両方必須なのだと勘違いしていました。
実際のコーディングは2文でやってみようと思います。
0686nobodyさん2005/10/02(日) 14:19:35ID:???
URLでよくtest.pl?line=ABC&line2=DEF
みたいに引数を渡す場合がありますがコマンドラインからこのような
引数を渡すにはどうしたらよいでしょうか?
#>perl test.pl 「ここの部分?」
0687nobodyさん2005/10/02(日) 14:35:59ID:???
perl test.pl line=ABC line2=DEF

値は @ARGV に入る。
06886862005/10/02(日) 15:14:12ID:???
>>687
サンクス。
if($#ARGV >= 0){ $buffer = join'&',@ARGV; }
デコードに付け加えて何とかなりますた。
0689nobodyさん2005/10/02(日) 15:16:12ID:???
>>688
if ($#ARGV >= 0)
より
if (@ARGV)
の方が好き。
06906862005/10/02(日) 15:19:46ID:???
>>689
アチャー。確かにそちらの方がいいですね。何か遠回りしてる漏れ。
0691nobodyさん2005/10/02(日) 16:49:19ID:???
if (scalar @ARGV) って書いちゃうなあ。
0692nobodyさん2005/10/02(日) 17:19:24ID:???
そもそも直で値を代入してしまう。
0693ヽ(´ー`)ノ ◆.ogCuANUcE 2005/10/02(日) 17:35:02ID:???
if 文使わなくても $buffer = join('&', @ARGV); だけで良くね?
@ARGV が空リストなら $buffer は空文字になるわけだし。

使うんなら $buffer = join('&', @ARGV) if @ARGV; かな。
0694nobodyさん2005/10/02(日) 17:51:48ID:???
前やったベンチでは@ARRAYより$#ARRAYの方が速かった
06956802005/10/03(月) 01:39:26ID:???
>>681さん、あれから自分でやってみてできました。
別に確認画面を作成してそのでーたをメールを送るCGIに渡すようにしました。
ありがとうございました。
0696もな2005/10/03(月) 02:21:03ID:???
掲示板をいちから作っているのですが、どうしてもdatファイルに文字を書き込めません。
書き込みボタンを押すとエラーが出るわけでもなく画面が遷移して、また再表示というふうにはなるのですが・・・。
どうかご教授願います。datファイルには何も書き込まれていない状態です・・

以下ソースです↓

#!/usr/bin/perl

require 'cgi-lib.pl';
&print_header(); #ヘッダを表示する

if(open(CHK,"bbs.dat")){
if(&get_data == 0){
if ($name eq '') {
&show_error('名前が記入されていません');
} elsif ($title eq '') {
&show_error('タイトルが記入されていません');
} elsif ($message eq '') {
&show_error('内容が記入されていません');
}
&write_to_file();
}
&read_file(); #ファイルからデータを読み出してリストに格納
&print_top(); #トップを表示する
}else{
&show_error('データファイルがオープンできません');
}

続く
0697もな2005/10/03(月) 02:22:02ID:???
sub print_header(){
$haikei_img ="back.jpg"; #背景画像の指定
print "Content-type: text/html\n\n";
print "<META HTTP-EQUIV=Content-Type CONTENT=\"text/html;CHARSET=Shit_JIS\">";
print "<html>\n";
print "<head><title>Simple BBS</title></head>\n";
print "<body style=\"background-image : url($haikei_img);background-repeat : no-repeat;background-attachment : fixed;\" text=#000000>\n";
}

sub print_top(){
print "<center<table width=600><tr><td>\n";
print "<br><br><center><h2>掲示板</h2>\n";
print "<hr> [ <a href=http://www.yahoo.co.jp>;Back To Homepage</a> ] <hr></center>\n";
print "<form method=post action=\"bbs1.cgi\">\n" ;
print "<table border=0>\n" ;
print "<tr><td align=right>名前 :</td><td><input type=text size=20 name=name></td></tr>\n" ;
print "<tr><td align=right>E-mail:</td><td><input type=text size=40 name=mail></td></tr>\n" ;
print "<tr><td align=right>URL :</td><td><input type=text size=40 value=http:// name=url></td></tr>\n" ;
print "<tr><td align=right>タイトル:</td><td><input type=text size=40 name=title></td></tr>\n" ;
print "<tr><td align=right>内容 :</td><td><textarea cols=50 rows=5 wrap=hard name=message></textarea></td></tr>\n" ;
print "<tr><td colspan=2 nowrap align=right><input type=submit value=送信><input type=reset value=書き直し></td></tr>\n" ;
print "</table>\n" ;
print "</form>\n" ;
}
0698もな2005/10/03(月) 02:23:21ID:???
sub get_data{
&ReadParse(*FORM_DATA);
if($FORM_DATA{'action'} eq 'reqist') {
&get_time(); #時刻の取得
$name = $FORM_DATA{'name'};
$message = $FORM_DATA{'message'};
$title = $FORM_DATA{'title'};
$mail = $FORM_DATA{'mail'};
$url = $FORM_DATA{'url'};
$action = $FORM_DATA{'action'};

    return 0;
}else{
return 1;
}

}

#========================================================
# 日付の取得と整形
#========================================================
sub get_time(){
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime;
@weekday = ('日','月','火','水','木','金','土');
$week=$weekday[$wday];
$mon++;
$year = 1900+$year;
$date="$year年$mon月$mday日($week) $hour時 $min分 $sec秒";
}


0699もな2005/10/03(月) 02:24:43ID:???
sub write_to_file(){
open(WRITE,">>bbs.dat");
print WRITE"$name\t$mail\t$url\t$date\t$title\t$message\n";
close(WRITE);
}
sub read_file(){
open(READ,"bbs.dat");
@data_set = <READ>;
close(READ);
}
sub show_error(){
print "<h2>エラー発生</h2><hr><br>";
print "エラー内容: $_[0]";
print "<br>WebブラウザのBackボタンで戻ってください";
exit();
}
_END_
0700もな2005/10/03(月) 02:25:24ID:???
以上ですm(__)m
0701nobodyさん2005/10/03(月) 02:34:33ID:???
まるまる張るんだったらどこかにうpしる。
0702nobodyさん2005/10/03(月) 02:46:02ID:hN7oOpvn
perlのバージョンが3以下なんじゃないの???
それだとオブジェクト指向サポートしてないから書き込めないよ
0703nobodyさん2005/10/03(月) 02:51:30ID:???
ヒント:オープンモード
0704もな2005/10/03(月) 02:51:39ID:???
ttp://www.error.to/~marty/ss2_bbs/ss2_bbs_img/8_1.txt

です。おねがいしますm(__)m
0705nobodyさん2005/10/03(月) 02:51:47ID:???
>>698
> if($FORM_DATA{'action'} eq 'reqist') {
                    ↑
0706もな2005/10/03(月) 03:04:26ID:???
>>703

オープンモードですか?
+>や>>などですか。調べてみましたが、もはやどうにも;;


>>705

初歩的なミスですね、ありがとうございます。

その部分を registと書き直しましたが
改善しません。
0707nobodyさん2005/10/03(月) 03:33:27ID:???
>>704
入力画面の表示の部分に
<input type="hidden" name="action" value="request">
が抜けている。

そしてなにより、@data_setにいれたログを表示する部分が、ない。
0708もな2005/10/03(月) 03:44:44ID:???

>入力画面の表示の部分に
><input type="hidden" name="action" value="request">
>が抜けている。

今自分で発見しました。ごもっともです・・・。これが原因でした。

>そしてなにより、@data_setにいれたログを表示する部分が、ない。
これはこれから実装予定です。
いまはとりあえずbbs.datに書き込めればいいので。

ありがとうございましたm(__)m
0709nobodyさん2005/10/03(月) 05:25:36ID:AwkrNdbs
神様、お願いします。
CGIの改造を考えていますが、この内容が素人に出来そうでしょうか?
パールの解説のHPを見つけたのと、大昔、BASICをやっていました。

「掲示板に親記事を投稿した人間以外にレスを付けれなくする。」
1、親記事の入力フォームに記事ロックの選択肢を追加。ログデータに
この項目を追加。
2、ロックマーク表示。
3、レス投稿時に親記事番号のログデータを読み込んで、ロックであれ
ばパスワード判定。パスワードは投稿時の物を使用、判定はそのサブル
ーチン流用。
4、エラー処理。(サブルーチンから流用)。
0710nobodyさん2005/10/03(月) 05:36:42ID:???
根性があればできんじゃない?
0711nobodyさん2005/10/03(月) 05:40:27ID:???
>>709
既存のスクリプトは読めてるみたいだしいけると思うよ
0712nobodyさん2005/10/03(月) 18:47:13ID:???
>>710-711
神キター
07137092005/10/03(月) 22:58:15ID:y4rbqtg0
ありがとうございます。頑張ってみます。

ログファイルの読み込み、書き込みが強敵です。なにせ、BASICには無い
概念なので。あとは、他の部分からの流用、小改造でなんとかなりそうなんで
すが。
0714nobodyさん2005/10/03(月) 23:16:50ID:???
やってもらいたいなら、最初からそう書くべきだと思うけど。
07157092005/10/03(月) 23:55:41ID:YGt8QF/s
そういうスレがあるのは知っています。ただ、できたらいいな、ぐらい
なものなので。

とりあえず、ログデータを定義している部分をチェックしたので、そこ
からスタートです!!
0716nobodyさん2005/10/04(火) 11:53:28ID:ibcAkGb+
質問させてください。

@list1 = (1,3,5,7,9,11,13,15,17,19,21,23,25,27,29)
@list2 = (1,4,7,10,13,16,19,22,25,28,30)

と入っています。
ここで
・リスト2の中のものがリスト1にある場合はその値を@list3に、
・リスト2の中のものがリスト1にない場合はその値を@list4に、
それぞれ入れて行きたいと思うのですが、その方法がわかりません。

最終的には
@list3 = (1,7,13,19,25,30)
@list4 = (4,10,16,22,28)
にしたいのです。

@list1〜@list4は便宜上数値にしていますが、実際に入るのは文字列(URL)で、@list1の要素は100以上になる場合があります。@list2はせいぜい5個くらい。
0717nobodyさん2005/10/04(火) 12:19:46ID:???
>>716
ハッシュにいれて調べるのが常套手段。

@list3 = (1,7,13,19,25,30)
@list4 = (4,10,16,22,28)

じゃなくて

@list3=(1,7,13,19,25)
@list4=(4,10,16,22,28,30)

でよければ

@list1{@list1} = ();

@list3 = grep {exists $list1{$_}} @list2;
@list4 = grep {!exists $list1{$_}} @list2;

でいけるけど、30が@list4じゃなくて@list3に入るようにするのは難しいな。
0718nobodyさん2005/10/04(火) 14:23:03ID:???
なんかすげー。

> @list1{@list1} = ();

こんな書き方あるのか。
0719nobodyさん2005/10/04(火) 15:06:23ID:???
>>718
原理としては @hash{'foo', 'bar', 'baz'} と同じなんだが。
07207162005/10/04(火) 15:10:49ID:ibcAkGb+
>>717

30は@list4の間違いです。申し訳ありません。

ハッシュを使うのですね。
ありがとうございました!!
0721nobodyさん2005/10/04(火) 15:12:11ID:???
素人スマソ、生理的に嫌かもしれませんが

$dummy = '/^';
$dummy .= join'$/ || /^',@list2;
$dummy .= '$/';
@list3 = grep(eval $dummy,@list1);
@list4 = grep(!eval $dummy,@list1);
07227212005/10/04(火) 15:16:47ID:???
間違ったので読み飛ばしてください。(鬱
0723nobodyさん2005/10/04(火) 15:21:32ID:???
>>718
スライスはやりすぎのような気がするので、

$list1{$_} = 1 foreach @list1;

ぐらいの方が見やすいんじゃないかねぇ。これだと値が1だから
exists使わずに

@list3 = grep {$list1{$_}} @list2;

みたいに書けるし。
0724nobodyさん2005/10/04(火) 15:45:08ID:???
それならこう書くかな。
my %flag = map { $_ => 1 } @list1;
07257092005/10/04(火) 15:46:59ID:16WUnnwb
第一夜。
まずは入力フォームを追加して、ログデータの項目を追加。
掲示板に投稿して入力値が入っているかテスト。・・・FTPで開いて
みるが、入っていない。試行錯誤するがダメ。もう止めようと思う。

第一夜続き。お風呂でぶくぶくしていると、使っていないname値を流用すれ
ば全部済むことに気がつく。
俺って天才!! さっそく試す。ダメ。

0726nobodyさん2005/10/04(火) 15:47:19ID:???
どうでもいいが >>721 は /^(?:a|b|c)$/ とういうような書き方を知らないのか
0727nobodyさん2005/10/04(火) 15:49:41ID:???
>>709 オツカレw
07287092005/10/04(火) 15:50:20ID:16WUnnwb
第二夜。
よ〜〜〜く見たら、formのnameに「"」がついてないことに気がつく。
再度、投稿してFTPでファイルを開く。

入ってる〜〜〜〜〜!!!!!

新たにログデータの項目を追加した状態で試す。

入ってる〜〜〜〜〜!!!!!
0729nobodyさん2005/10/04(火) 16:38:19ID:???
>>728
ローカルでテストしましょうね。
0730nobodyさん2005/10/04(火) 16:56:19ID:???
とりあえずオメ
07317092005/10/04(火) 17:13:56ID:0ZPYmA+s
ありがとうございます!! 
ところでローカルということは、サーバーに上げなくてもCGIは動く
のですか?

第二夜続き。
過去ログの処理が入っているので、安全を考えてname値の流用の方に決
定。とりあえずクッキーを外したいので、そこだけ消去。動作確認。

レスロック判定をしてロックなら投稿記事にマークを出す。ログデータ
はもともと読み込まれているので、if文を書いてみる。
原文から「!」が逆の判定になるのだろうと推測。

if ((!$reno)&&($sub_color eq "1")) {
 print "[ロック] ";
 }

出た〜〜〜〜〜!!!!
0732nobodyさん2005/10/04(火) 17:47:20ID:???
>>731
プログラムだから動くよ〜。
0733nobodyさん2005/10/04(火) 18:20:23ID:???
>>731
> ローカルサーバ
あの KENT-WEB にさえ 「自宅マシンWWWサーバ化計画」 とやらがあるんだし、いろいろぐぐってみそ
0734nobodyさん2005/10/04(火) 18:31:14ID:???
機種依存文字のチェックルーチンを作っててはまった事実。

---------- ソース(EUC) ----------
use Jcode;
$char = '(1)'; # 機種依存文字の丸1だと思ってください。
print qq(${char}\n);
Jcode::convert( \$char, 'euc' );
print qq(${char}\n);
exit;

---------- 出力(EUC) ----------
(1)
?

文字コード同じでもJcodeかますと機種依存文字が「?」になるんですね…
なんでだろ。
0735nobodyさん2005/10/04(火) 19:35:46ID:???
>>731
ここで日記書く前にCGIの基礎を勉強して来い
つか質問無いなら書くな
0736nobodyさん2005/10/04(火) 19:40:27ID:???
>>734
ウチではそのソースでも「?」にはならないけど
07377342005/10/04(火) 19:49:55ID:???
>>736

まじですか?
ちなみに環境は、

・FedoraCore 3
・Perl 5.8.5
・内部エンコードUTF8(あまり関係ない気がするけど)

です。
0738nobodyさん2005/10/04(火) 19:54:18ID:???
Jcode.pm の ユニコ←→EUC 変換テーブルにない文字なだけじゃね?
07397092005/10/04(火) 20:09:01ID:5HGueAp3
>>735

はあ。プログラマーさんは真面目なんですね。
では、さようなら。アドバイスありがとうございました。
0740nobodyさん2005/10/04(火) 20:51:20ID:???
>>734
エディターで使用してるフォントと結果表示のフォントが違うんじゃない?
同じ文字コードでも後者のフォントには含まれてない文字だとか。
0741nobodyさん2005/10/04(火) 21:16:41ID:???
>>740
Jcode::convertにかける前と後で表示させていて、かける前のは
ちゃんと表示されてるというんだからそれは違うんじゃないかと。

print qq(${char}\n);

のかわりに、

print unpack('H*', $char), "\n";

にして文字コード表示させるとなにかヒントがつかめるかもしれず。

ちなみにうちの環境ではどちらも普通に丸1が表示されてコードは
ada1だった。
0742nobodyさん2005/10/04(火) 21:27:51ID:???
Jcodeは5.8.x以降Encodeのラッパーとして動くとかあるから、
PerlバージョンとJcodeのバージョンによって動作が違うと考えられるけど。
0743nobodyさん2005/10/04(火) 21:47:32ID:???
ああ、そういえば Encode の日本語変換はかなりのヘタレだ。
0744nobodyさん2005/10/04(火) 22:10:19ID:???
なんかヘンだ。
print qq(${char}\n);
は
print $char . "\n";
とか
print "$char\n";
にならんのか?

いや、オフトピだけどさぁw
0745nobodyさん2005/10/04(火) 22:16:13ID:???
俺なら
print $char, "\n";
かな
0746nobodyさん2005/10/04(火) 22:19:58ID:???
>>745
俺も。 なんとなく効率よさそう
0747nobodyさん2005/10/05(水) 01:00:16ID:???
Win2K環境でhoge.txtを作ってから、

open (FH, "<hoge.txt");
print FH "�I";
close FH;

これを実行してエディタで開くと、文字コードがEUCになってしまう
0748nobodyさん2005/10/05(水) 02:26:59ID:???
>747
ここは独り言書き込みスレじゃねえ
0749nobodyさん2005/10/05(水) 03:23:07ID:???
ハッシュのキーにHTMLタグ等を入れる予定なのですが、
キーに指定不可能な文字列というものはあるものなの
でしょうか。

ご教示いただけますと幸いです。
0750nobodyさん2005/10/05(水) 07:42:46ID:???
>>747
文字コードが被ってるだけ。エディタの問題。

>>749
文字列で表すことができれば、なんでもOK。
07517342005/10/05(水) 12:48:09ID:???
>>741

コード出力試したんですが、
見事に
(1) → ada1
? → 3f
でしたw

3fってもろに ? のコードなんだよなぁ…
となるとJcodeの変換テーブルに無い文字は
全部 ? に変換しちゃってるとしか考えようが…

ちなみに Jcode.pm のバージョンは 2.3 でした。
一応現在の最新版を入れたんだけど…



>>742, 743

それは痛い…
まだまだJcode使わざるをえないようですね



>>744, 745, 746

大抵 print するときはPerl変数と通常の文字列が混ざるんで、
qq() でくくって ${} で変数を切り分ける癖が付いてるみたいです。
逆に , や . で結合する方が気持ち悪いと感じてる…
(もちろん、単純な文字列の場合はその限りじゃないですが)

0752nobodyさん2005/10/05(水) 13:03:38ID:???
>>751
qq() と . は、文字列結合があるからなぁ。
, ならIOにそのまま渡るだけだけど。
0753nobodyさん2005/10/05(水) 13:51:44ID:???
>>751
たぶん勘違いしてると思うのだが、新しめのJcode.pmはperl5.8以降と
組み合わせるとコード変換部分をPerlがもともと備えている機構を
使うようになるので、
07547512005/10/05(水) 13:58:42ID:???
>>752

可読性を重視してました…
速度的にはそのとおりですね

>>753

×Jcode
○jcode(.pl)
でした。。
0755nobodyさん2005/10/05(水) 14:06:45ID:???
Debianのunstableで試してみたんだが、パッケージでインストールしたperl5.8.7
とJcode.pmのHPから落としてきた2.03との組み合わせでで確かに'?'になった。
unstableでJcode.pmのパッケージはいまだに0.88なのはその辺を嫌ってるの
かもしれんな。

0756nobodyさん2005/10/05(水) 14:10:46ID:???
>>754
いや jcode.pl は utf-8 ⇔ euc-jp はできんぞ。
07577542005/10/05(水) 14:14:34ID:???
>>756
ソースも出力もEUCなので、UTFからの変換は行ってないです。
(すんません、なんか本題とずれちゃってる…)
0758nobodyさん2005/10/05(水) 15:40:19ID:???
>>750
ありがとうございます。
キーボードで入力できる文字全てが対象なんですね。
良かったです。
0759nobodyさん2005/10/05(水) 16:29:09ID:???
いっそ、jcode.plにするとか
0760nobodyさん2005/10/05(水) 16:35:30ID:???
つか euc ⇔ euc なら変換する必要ないじゃんか。
いきなり convert じゃなくて、getcode で文字コード取得してから自分で判別してやれば「いいじゃない
0761nobodyさん2005/10/05(水) 17:13:12ID:???
>>734 を読んで思ったこと。

>---------- ソース(EUC) ----------
>use Jcode;
ソースはEUCとのことだが、use encoding を宣言していないため、
Perl はこのソースをUTF-8だと認識すると思われ。

>$char = '(1)'; # 機種依存文字の丸1だと思ってください。
$charには、「『丸1』のEUCコード」が入る。但し、PerlはこれをUTF-8の
文字コードだと認識する。

>print qq(${char}\n);
PerlがUTF-8の文字コードだと認識している「『丸1』のEUCコード」が出力される
ため、出力結果は見かけ上は正常に見える。

>Jcode::convert( \$char, 'euc' );
これは、「『丸1』のEUCコード」をUTF-8の文字コードだとして、対応する
EUCコードを返せ、ということになるが、そんなものが無いために「?」が
返されるのではないだろうか。
0762nobodyさん2005/10/05(水) 17:35:41ID:???
>>761
use utf8してないからそんなこたないと思うが。
0763nobodyさん2005/10/05(水) 18:06:34ID:???
use Encode qw(from_to);

euc2euc("\xad\xa1");
euc2euc("\xdb\xd9");
exit;

sub euc2euc
{
my $char = shift;
from_to($char, 'euc-jp', 'euc-jp');
print ((map{ unpack('H2', $_) } split(//, $char)), "\n");
}

これを動かしてみれば分かると思う。
結局、○に1とかの文字を渡さないのがいいかと。
0764nobodyさん2005/10/05(水) 19:43:50ID:???
>>763

なるほど。
ということはEncodeを使うコード変換(Perl5.8以上のJcode含む)に
機種依存文字を渡してはいけないってことですね。
※5.8以下のJcodeとjcode.plは不明

うーん、、機種依存文字の判定はしんどいなぁ…
0765nobodyさん2005/10/05(水) 21:14:51ID:???
>>764
CPANにあるEncode::JIS2K使うとか。詳しくはわかんないけど
試した感じでは丸付き数字ぐらいならなんとかなるっぽいよ。
0766nobodyさん2005/10/05(水) 21:36:18ID:???
すいません。ご指導おねがいいたします。
クイズのプログラムを作っているのですが、csvへの書き込みが思うようにいきません。。
↓とりあえず現状はこうなっています。
ttp://s1.muryo-de.etowns.net/~testjoy/

このまま回答を送信すると

項目1 項目2 項目3
総問題数 回答番号 正解番号
総問題数 回答番号 正解番号
・   ・   ・
・   ・   ・

と書き込まれるのですが、これを

項目1 項目2 項目3
Q1(問題番号) Q1の回答番号 Q1の正解番号
Q2(問題番号) Q2の回答番号 Q2の正解番号
Q3(問題番号) Q3の回答番号 Q3の正解番号
・   ・   ・
・   ・   ・

という形に修正したいです。ここまでやってどうしてもうまくいきません。。。
どなたかお助けお願い申し上げます。
07677662005/10/05(水) 21:37:30ID:???
おかしいとこのソースは

foreach (@question) {
($rank_data) = split(/\t/);

open(CSV , ">> file.csv");
flock(CSV,2);
@logs2=<CSV>;
$rank_data="$key,$val,$aval\n";
push(@logs2,$rank_data);
print CSV @logs2;
flock(CSV,8);
close(CSV);
}

です。お願い申し上げます。。
0768nobodyさん2005/10/05(水) 21:42:47ID:???
>>767
問題が再現する最小のサンプルコードを載せるべし。
0769762005/10/05(水) 21:52:03ID:???
>>768
こんな具合でございます。。

# 質問の取得

&ReadParse;

if(open(IFILE,"question_1.tsv")) {
while(<IFILE>) {
chomp();
push(@question,$_);
}
close(IFILE);
07707672005/10/05(水) 21:54:07ID:???
# 質問の表示

my($qnum) = 0;
foreach (@question) {
($qval,$aval,@column) = split(/\t/);
next if($qval eq "");

$qnum++;
$key = "Q".$qnum;

【問題$qnum】$qval

!;

$anum = 0;
foreach (@column) {
next if(!$_);
$anum++;
print qq!<BR>\n!;
print qq!<INPUT TYPE="radio" NAME="$key" VALUE="$anum">$_\n!;
}
07717672005/10/05(水) 21:58:19ID:???
# 回答の表示

my($qnum) = 0;
foreach (@question) {
($qval,$aval,@column) = split(/\t/);
next if($qval eq "");

$qnum++;
$key = "Q".$qnum;
$val = $in{$key};
if($val eq $aval) {
$check = "○";
} else {
$check = "×";
}

$anum = 0;
$answer[$anum] = " ";
foreach (@column) {
next if(!$_);
$anum++;
$answer[$anum] = $_;
}
0772nobodyさん2005/10/05(水) 22:30:09ID:Y4Xwvx08
質問させてください。
最近サイトの荒しが多くて、IPとホストのドメインを取得しようとしています。
$ENV{'REMOTE_ADDR'}
$ENV{'REMOTE_HOST'}
で情報を得ようとしているのですが、REMOTE_ADDRの方は値が入っているのに、
REMOTE_HOSTの方は何も入っていません。ローカル起動ではないのですがなぜ
でしょうか?プロバイダの違う複数の端末からもためしてみたのですが、入っ
ていませんでした。
よろしくお願いします。
0773nobodyさん2005/10/05(水) 22:45:29ID:???
>>772
つながってきた相手のIPアドレスは必ずわかるけど、
ホスト名はIPアドレスからDNSで逆引きしないと
出ないので、出そうとするとその分鯖の負荷になる。
なので、特に共用の鯖では逆引きしない設定にして
あることが多い。多分それじゃないかと。

0774nobodyさん2005/10/05(水) 23:15:07ID:???
つまりこっちで関数使って逆引きすればいいってことね。
0775nobodyさん2005/10/06(木) 03:58:29ID:???
げっとほすとばいあどれす
0776nobodyさん2005/10/06(木) 11:31:35ID:???
>>764
> 機種依存文字
Shift_JIS だけど、
どこかに

/([\x85-\x87][\x40-\xff]|\x88[\x40-\x9e]|[\xeb-\xfc][\x40-\xff])/;
って書いてあった。
0777nobodyさん2005/10/06(木) 11:54:16ID:???
>>767
foreach (@question) のループの中で、$key, $val, $aval
が全く変更されていない。従って、$rank_dataは常に同一の
文字列になる。もしかすると、
($rank_data) = split(/\t/); を、
($key,$val,$aval) = split(/\t/);
にすれば、望んだ結果が得られるかもしれない。
0778nobodyさん2005/10/06(木) 13:20:28ID:Zoab/OuC
$db = PP->db;

$st = $db->prepare("$C{sqlbase} and ch=? and subch!='notice' and pubtime > now() - '1 day'::interval order by pubtime desc");

すいません、↑この一文は何をしているんでしょうか?
perlの文章の中に出てきたのですが、これはSQLの文の一部なんでしょうか
0779nobodyさん2005/10/06(木) 20:10:40ID:???
>>778
PPクラスのdbメソッドの返値が代入されている$dbに対して
prepareメソッドを一つの引数とともに呼び、その返値を$stに代入してる。
引数は普通の文字列で、$C{sqlbase}が変数展開される。

SQL文の一部かどうかはそのプログラムを書いた人じゃないので知らん。
07807782005/10/06(木) 21:47:25ID:Zoab/OuC
ありがとうございます。かなり参考になりました。そのアドバイスを参考になんとか解析できそうです
0781nobodyさん2005/10/07(金) 04:33:20ID:7A4FQYqd
http://hogehoge.co.jp/cgi-bin/hoge.cgi
でname=valueというクッキーを発行して
http://foo.jp/に渡したいんです。

domain="http://foo.jp/";
path="/";
name="value";

というクッキーを作ったんですが受け取ってもらえませんでした。
どうすればいいんでしょうか。
0782nobodyさん2005/10/07(金) 07:25:00ID:???
URLじゃなくてドメイン名なんだからfoo.jpじゃないと。
ただし、ピリオドが2つ以上含まれないといけないらしいが・・・
0783nobodyさん2005/10/07(金) 10:32:33ID:???
>>778-779
そもそも
$db->prepare()
 ↑が何なのか分からん
0784nobodyさん2005/10/07(金) 11:40:23ID:???
>>781
domain属性がドメイン名でないという782の指摘は正しいが、
ドメイン名foo.jpに直したとしても、クッキーを発行するホストの
ホスト名hogehoge.co.jpがドメイン一致しないので、拒否される
んじゃないだろうか。実際とは変えてあるのだろうからなんとも
言えんが。

RFC2965の「3.3.2クッキーの拒否」
ttp://www.studyinghttp.net/cgi-bin/rfc.cgi?2965
0785nobodyさん2005/10/07(金) 11:54:42ID:???
IE の インターネットオプション → プライバシー → 詳細設定 に 「サードパーティの Cookie」 ってあるから、拒否されるかどうかはそこで決まるんじゃないかな。
0786nobodyさん2005/10/07(金) 12:11:20ID:???
>>783
$dbはPPクラスのオブジェクトじゃないの?
推測だけど。

>>781
他所のCookieを読み込みたいのですが
http://pc8.2ch.net/test/read.cgi/php/997686085/

ほんと、古いスレがあるよなぁ。

>>785
それは、コンテンツに第三者のコンテンツを埋め込んで、
そこでクッキーを発行する方法っしょ。
0787nobodyさん2005/10/07(金) 12:23:51ID:???
>>783
オレの推測ではDBIのデータベースハンドルじゃないかなー。


0788nobodyさん2005/10/08(土) 11:15:59ID:???
答はNoだ
0789nobodyさん2005/10/08(土) 18:30:12ID:???
>>783
これは本当のこと言ったらいかんの? >>786-788の流れは…。
0790nobodyさん2005/10/09(日) 12:58:13ID:???
こんなスクリプト書いて redir.cgi ってファイル名つけて実検してるんですけど、
500 エラーになります。試しに nph-redir.cgi という名前にすると 503 になります。
使ってるのは、apache2 です。よろしくおねがいします。
my $x = CGI->new();
print $x->redirect(
-location => $url,
-status => 301,
);

07917902005/10/09(日) 13:04:30ID:???
suexec のせいで 500 くらってますた。すんません。
0792nobodyさん2005/10/09(日) 20:13:06ID:20mFB5Hk
初歩的な質問ですが、正規表現で、最後にsをつけるのとつけないのとの違いがわかりません。
mは各行ごとに^や$が使えるようになるみたいですが。
どなたかおしえてください。
0793nobodyさん2005/10/09(日) 20:25:55ID:???
与えられた文字列を一行として扱う。.が改行にマッチする。
http://search.cpan.org/dist/perl/pod/perlre.pod
0794nobodyさん2005/10/09(日) 20:32:38ID:???
sオプションを使うことは稀ですから、sオプションがあるのを知っている時点で
その説明を読んでいる可能性が高いのではないでしょうか。

マニュアルページを読むだけで、解決する質問がかなり多いような気がします。
ぐぐるだけではなく、手元のマニュアルページも調べてみましょう。
0795nobodyさん2005/10/09(日) 20:38:17ID:???
まあ後はトライだな。
0796nobodyさん2005/10/09(日) 22:47:29ID:???
ハッシュのキーを正規表現で指定することは可能でしょうか
0797nobodyさん2005/10/09(日) 22:51:07ID:???
>>796
アルゴリズム上、無理です。
0798nobodyさん2005/10/09(日) 22:56:16ID:???
あ、tie して、そういうハッシュを作れば可能かな。面倒だけど
0799ヽ(´ー`)ノ ◆.ogCuANUcE 2005/10/09(日) 22:56:57ID:???
>>796
Tie Hash Reg で CPAN Search
0800nobodyさん2005/10/10(月) 00:05:51ID:???
>>796の質問の意味がわからん。
キーを正規表現で取り出すのとはちがうのか?
0801nobodyさん2005/10/10(月) 00:11:38ID:???
キーに対して値は1つ、
で正規表現で複数マッチしたら何を取り出すつもりだ
0802nobodyさん2005/10/10(月) 00:12:41ID:???
>>800
正規表現でキーを表現したいということでしょ。

$hash{/^ab/} = 3;
とか。

実際には tie して
$hash->{'^ab'} = 3;
みたいになるんだろうけど
0803nobodyさん2005/10/10(月) 00:14:08ID:???
>>801
複数マッチしたら、配列で返ってくるとかじゃないかな?たぶん
0804nobodyさん2005/10/10(月) 00:22:16ID:???
grepじゃできないようなことなのだろうか。
0805nobodyさん2005/10/10(月) 00:23:35ID:???
ハッシュ引くだけなら grep で出来そうだね
0806nobodyさん2005/10/10(月) 00:35:51ID:???
>>803
マジでーーー知らなかったスマソ
0807nobodyさん2005/10/10(月) 01:54:54ID:???
>>802
> 正規表現でキーを表現したい
それだけなら tie なんざせんでも。

my $str = 'abcabcdefdefabcdefabef';
my %hash;
$hash{$_} = [ $str =~ /($_)/g ] for (
  qr/^abc/,
  qr/ab./,
  qr/.fd.*?f/,
  qr/\d/,
);
print "$_ : ", join(', ', @{$hash{$_}}), "\n" for sort keys %hash;

正規表現にマッチするキーが持つ値を

@values = $hash{ qr/^abc/ };

のように取り出したいというのなら、ラッパーを
探すなり書くなり、という話になると思うが。
0808nobodyさん2005/10/10(月) 03:48:24ID:???
>>796
単純に

print grep { /$regex/ } keys %hash;

でOK。
0809nobodyさん2005/10/10(月) 03:50:32ID:???
マッチするキーの値を求めたいなら

print map { $hash{$_} } grep { /$regex/ } keys %hash;
0810nobodyさん2005/10/10(月) 09:58:24ID:???
@hash{grep /$regex/, keys %hash }
0811nobodyさん2005/10/10(月) 11:52:25ID:gKZw7BFl
質問させて下さい。

見よう見まねで以下のようにgethostbyaddrを使ってみたのですが
$addr = $ENV{'REMOTE_ADDR'};
$wkaddr = pack('C4', $addr);
use Socket;
$host = gethostbyaddr($wkaddr, AF_INET);

結果にYahooBB〜.bbtec.netってのが返ってきました。
使い方はこれであってるんでしょうか?
0812nobodyさん2005/10/10(月) 12:56:52ID:???
是が非でもマニュアルは読みたくないと、そうおっしゃるか。
0813nobodyさん2005/10/10(月) 13:53:46ID:???
>>811
つかおまいはどういう結果を期待してgethostbyaddrを使ったんだ
0814nobodyさん2005/10/10(月) 13:58:02ID:???
見よう見まねって・・
08158112005/10/10(月) 16:13:54ID:gKZw7BFl
gethostbyaddrの結果がYahooBBだけは入っているのですが、それ以外のプロバイダは空に
なっています。どうしてでしょうか?
お願いします。
0816nobodyさん2005/10/10(月) 16:18:09ID:???
どうなるのか分からない関数を
何が欲しいのか分からない状態で使って
結果が正しいのかどうかも分からないって…
それは質問なのか?
0817nobodyさんNGNG
とりあえず pack('C4', split(/\./, $addr)) だろ。
0818nobodyさん2005/10/10(月) 22:40:59ID:???
今Perlでプログラム組んでいてほぼ完全に動作しているのですが、原因が分からないのですが何かの切っ掛けでこの部分がたまにエラーを吐いてきます。

129 : foreach(keys %an){
130 :  $data = sprintf("%08d\t$_",$an{$_});
131 :  push(@count,$data);
132 : }

エラー内容は
Modification of a read-only value attempted at test.cgi line 130.
なのですが、このエラーの修正方法が分かりません。
このスレでいいのかちょっと謎ですが宜しくお願いします。
0819nobodyさん2005/10/10(月) 22:55:19ID:???
>>818
分からないエラーが出たときには、そのエラーメッセージでぐぐると良いですよ。
$dataが定数になっていたり、その行の変数、どれか tieしてませんか?
0820nobodyさん2005/10/10(月) 23:44:14ID:j4NUbQ7s
質問です。。
学校の宿題なんですが・・・初歩の初歩で質問するのもはずかしー問題かもしれません・・・
Hex number を入力してそのNumberをDecに変換し、さらにoctal number を decimal にするプログラムを作れ。
っていう問題です。
一応自分で書いたのは・・

#!/perl
use warnings;
use strict;
print "Hexadecimal and Octal number converter\n\n Please enter the Hexadecimal number:";
my $hex = <STDIN>;
print $hex,;

とりあえず、Hex→Decの変換をやってみようと思ってここまで書きました。
これだと、例えば、0xFFっていれても255って返ってこずにそのまま、0xFFって出ちゃうんですよね・・・
神様助けて・・・
0821nobodyさん2005/10/10(月) 23:52:05ID:???
>>820
つttp://www.site-cooler.com/cgi-bin/kansuu.cgi?lang=perl
0822nobodyさん2005/10/10(月) 23:52:46ID:???
>>820
それさ、そこに書いてある部分が問題文、
というか「これを拡張して書け」みたいな感じなんじゃない?

変換しろって言うんだから、変換しなよ。簡単だぞ。
がんばれよ。
08238202005/10/11(火) 00:01:28ID:ydWxrZ97
>>821,822 さんレスありがとうございます。
んー。。
変換する式みたいなもんがあるんでしょうか?
print 0xFF,;
って書くと勝手にPerlが普通の数字に変換してくれますが、内部でどのように変換してるんでしょか?
なんか、三角形の面積を求める公式みたいな計算式があればできるっぽいんですけど。。
もう一度一から教科書読み直して勉強してみます・・・。
0824nobodyさん2005/10/11(火) 00:02:58ID:???
先生としては、きちんと基数変換のコードを
書いてもらいたいんだろうなぁ。
0825nobodyさん2005/10/11(火) 00:09:26ID:???
>>824
それひどくねー?
08268202005/10/11(火) 00:22:37ID:m+2zbTP9
えー。途中経過です・・

#!/perl
#ex2.plx
use warnings;
use strict;
print "Hexadecimal and Octal number converter\n\n Please enter the Hexadecimal number:";
my $hex = <STDIN>;
print hex $hex,;

としたら、0xFF→255
となって変換できたんですけど・・こんなエラーが↓

Illegal hexadecimal digit'
' ignored at ex2.plx line7, <STDIN> line 1.
255

このエラーの最後に255って出たんですけど。。このエラーは無視したら怒られますか??
ま、いっか。おし、次はOctal!
0827nobodyさん2005/10/11(火) 00:28:56ID:???
ヒント:$hexの中にはあれも入って…
う〜ん。怒られないと思うけど、初歩的な悪い例として取り上げられるかもw
0828nobodyさん2005/10/11(火) 00:39:23ID:???
<STDIN>使うなら、chompも書いておいた方がいいかと
08298202005/10/11(火) 00:44:24ID:m+2zbTP9
hex と同じように octal も

#!/perl
#ex2.plx
use warnings;
use strict;
print "Hexadecimal and Octal number converter\n\n Please enter the Hexadecimal number:";
my $hex = <STDIN>;
print hex $hex,;
print "\n Please enter the Octal number:";
my $oct = <STDIN>;
print oct #oct,;

って感じに書いたら、、、
Use of uninitialized value in oct at ex2.plx line 10, <STDIN> line 2.
0

ってなって数字が0に!!

うーん。初歩的な悪い例ですか・・・$hex の中になにか良くないものが入ってるっぽいんですね・・・。
しかし、なんでOctalの場合だと0に・・・

もうちょいがむばってみます・・・
08308272005/10/11(火) 00:44:30ID:???
>>828
そうなんだけど、宿題だからヒントで止めておいたw
しっかし、まだあこで引っかかりそうだな。
08318272005/10/11(火) 01:01:39ID:???
>>828ででちゃたんで書きますけど…
>>826のソースでエラーがでるのは$hexにchomp関数を使用していないからです。
$hexの中には0xFF\nと入ってます。その\nを取り除くためにchomp関数を使います。

chomp関数とはなんぞや?
ttp://www.site-cooler.com/cgi-bin/kansuu.cgi?lang=perl&method=chomp

>>829についてはEasy mistake

それでは、おやすみなさい。
0832nobodyさん2005/10/11(火) 01:12:14ID:???
も− print eval(<STDIN>); でいいんでない? 点数もらえないだろうけど。
0833nobodyさん2005/10/11(火) 01:12:39ID:???
>chomp関数とはなんぞや?
いや、お前よりかはみんな知ってると思うが・・・^^;
08348272005/10/11(火) 01:22:05ID:???
>>833
馬鹿め!>>820宛に書いた文章だぞ。俺だってchompぐらい知ってる。

chomp関数とはなんぞや?(その下の行に簡単にわかるリンク先)
ttp://www.site-cooler.com/cgi-bin/kansuu.cgi?lang=perl&method=chomp

俺ってなんて優しいんだw
0835nobodyさん2005/10/11(火) 01:26:50ID:???
その前に誰か >>829 に
× print oct #oct,;
〇 print oct $oct;
って教えてやれよw
08368272005/10/11(火) 01:32:09ID:???
>>835
はっきりとは教えないようにしてたんだよ。
宿題だし、本人はやる気あるみたいだからな。
0837nobodyさん2005/10/11(火) 01:45:08ID:???
メモ帳で書いてるんかね。
テキストエディタだったらすぐ気づきそうな。
0838nobodyさん2005/10/11(火) 02:14:26ID:???
きっとvi使ってるんだろう
0839nobodyさん2005/10/11(火) 10:24:06ID:4r4FVZwb
#!/usr/bin/perl
$kexp= 200;
$pexp= 676;
$bexp= 267;
$kexp= $a;
$pexp= $b;
$bexp= $c;
$a + $b + $c= $d;
print $d;

何がいけないのかな?
0840nobodyさん2005/10/11(火) 10:28:16ID:???
>>839
数学ではなく、算数からやり直してきてください。
0841nobodyさん2005/10/11(火) 10:33:04ID:4r4FVZwb
算数ぐらいできますよお〜
それを、cgiとして使うと500になるんです。
数字の200とかは、適当に使ってるやつで、
ただのテストCGIなんだけど、上手く動かないorz

どこを改善すればいいんだ・・・。
0842nobodyさん2005/10/11(火) 10:40:14ID:???
>>839
httpヘッダ出してないからだろ。
加えて一行目のperlパスが違うってのもあるかもしれないが。
08438422005/10/11(火) 10:45:14ID:???
あ、違うわ。そもそもおまい代入の方向間違ってるよ。
「=」の左辺に右辺の結果が代入されるんだぞ。
ちょっと勉強しなおして来い。一発で見抜けなかった俺も修行してくるから。
0844nobodyさん2005/10/11(火) 10:49:14ID:4r4FVZwb
ぉ、よ〜く考えてみればそうだ・・・
じぇんじぇん頭が回ってなかったなw
よ〜し、では修正に逝ってきますw
0845nobodyさん2005/10/11(火) 10:53:23ID:4r4FVZwb
#!/usr/bin/perl
$kexp= 200;
$pexp= 676;
$bexp= 267;
$a= $kexp;
$b= $pexp;
$c= $bexp;
$d= $a + $b + $c;
print $d;

んで、一応上記のとおりに直しました。
その後はどうすればいいんですかね??
まじ、初歩的ですまんorz
0846nobodyさん2005/10/11(火) 11:03:44ID:iD4ymnU6
Server: Apache/1.3.33 (Unix) mod_perl/1.29
Image::Magickで画像の出力を試しているのですが、
Firefoxで以下のエラーメッセージが表示され上手くできません。
"画像ファイル "http://test.notw.biz/sample.cgi" は壊れいているため、表示できませんでした。"

シェルから実行したところ上手く画像は出来ているのですが、
ブラウザから動かすとうまく行きません。
http://www.gac.jp/article/index.php?stats=question&category=12&id=15812&command=msg
も参考にしましたが駄目でした。

use Image::Magick;

my $img_bg = new Image::Magick;
$img_bg->Set(size=>"90x9");
$img_bg->ReadImage("xc:pink");

print ("Content-type: image/png \n\n");
binmode STDOUT;
$img_bg->Write("png:-");
print "\n";

解決方法は何かないでしょうか?
>> $img_bg->Write("png:-");
を強制的にフラッシュ出来れば何とかなりそうな気はするのですが。。。
0847nobodyさん2005/10/11(火) 11:24:44ID:???
ハゲワラwww
0848nobodyさん2005/10/11(火) 11:26:44ID:???
>>818
>原因が分からないのですが何かの切っ掛けでこの部分がたまにエラーを吐いてきます。
>
>129 : foreach(keys %an){
>130 :  $data = sprintf("%08d\t$_",$an{$_});
>131 :  push(@count,$data);
>132 : }

"%08d\t$_"は、$_の内容に応じて、展開結果が変わる。
展開結果の中に書式指定文字列としてタブーなものが混じることもあるから、
「たまにエラーを吐く」ということになるのだろう。
$data = sprintf("%08d\t%s", $an{$_}, $_);
のようにすると解決すると思われ。
0849nobodyさん2005/10/11(火) 11:59:20ID:???
たぶん printf "%n"; みたいなことになったんじゃ?
0850nobodyさん2005/10/11(火) 12:14:19ID:???
>>845
どうすればいいって、直した結果どうなったのよ?
相変わらず500エラーなん? >>842とか確認したん?
0851nobodyさん2005/10/11(火) 12:26:14ID:4r4FVZwb
相変わらず500です。
ヘッダーの足し方がいまいち不明で、
どこら辺に足せばいいのかがわからなくて、
ただいま格闘しておりました・・・。

ですが、ヘッダーがどんな物かはわかるんだけど、
やはり場所が不明で500になってしまいます。
0852nobodyさん2005/10/11(火) 12:30:16ID:8zYGlOye
すいません
質問があります。
foreach(sort @data){
としたいのですが@dataの中身はカンマ区切りで2番目と3番目のキー
でソートしたいのですが方法はありますでしょうか?
0853nobodyさん2005/10/11(火) 12:30:33ID:???
>>846
最後の print"\n"; が要らないんじゃないかなぁ。
Firefox以外のブラウザだとどうなのさ?
0854nobodyさん2005/10/11(火) 12:34:55ID:???
>>851
わかってないことをわかったように言うな。
#!/usr/bin/perl
print "content-type:text/plain\n\n";
$kexp= 200;
$pexp= 676;
$bexp= 267;
$a= $kexp;
$b= $pexp;
$c= $bexp;
$d= $a + $b + $c;
print $d;

これで動かなきゃあとは一行目だ。
0855nobodyさん2005/10/11(火) 13:18:47ID:???
「今度はダウンロードになってしまいます」、とか言ってきそうだ。
0856nobodyさん2005/10/11(火) 13:28:06ID:???
こういう輩に限って動き始めると事後報告そっちのけになるからな
08578462005/10/11(火) 15:16:03ID:???
>>853
print を抜いても
IE、Operaで試してみても駄目でした。

色々調べているのですが
どうにも手に負えそうにないので別な方法を考えようと思います。

ありがとうございました。
0858nobodyさん2005/10/11(火) 15:39:12ID:???
>>852
sort について調べなされ。
自分で条件を書けるから。
0859nobodyさん2005/10/11(火) 15:40:53ID:XkXcz5GJ
perlは、
$1と書かなければならないところで\1と書くとうまく動作しませんが、
\1をすべて$1と書きかえて問題が生じることはありますか?
0860nobodyさん2005/10/11(火) 15:45:22ID:???
>>859
あります。
08617962005/10/11(火) 19:28:50ID:???
皆様、遅ればせながらご返答有難うございました。

私のやりたかったことは、
if($form{read/([0-9a-zA-Z]+)/]}){ print $1; }
このような判定がかけられればと質問させていただいた次第です。
説明不足ですみませんでした。

順次試させていただきます。
有難うございました。
0862nobodyさん2005/10/11(火) 21:15:56ID:???
>>859
とりあえず簡単な例は "\\1" だな。
0863nobodyさん2005/10/11(火) 21:18:28ID:???
>>796
お前がそう書いたらどういう風に動くことを期待しているのか
説明してくれないと結局何がなんだかわからないわけだが。
08648202005/10/11(火) 21:49:41ID:???
みなさんご指導ありがとうございました。おかげさまで宿題無事にSubmitでけそうです・・・
一応できたの載せときます。
#!/perl
#ex2.plx
use warnings;
use strict;
print "Hexadecimal and Octal number converter\n\n Please enter the Hexadecimal number:";
my $hex = <STDIN>;
chomp($hex);
print hex $hex,;
print "\n Please enter the Octal number:";
my $oct = <STDIN>;
print oct $oct,;

一番まいったのが$と#の違いに気づくのに1時間近くかかったことでしょうか・・・
いや〜Perlって奥が深い
0865nobodyさん2005/10/11(火) 21:54:48ID:???
>>864
とりあえず、動きましたねw
おめでとう!
08668202005/10/11(火) 21:55:29ID:m+2zbTP9
質問です・・・・
Decimalを256以下の数字で聞いてきて、それをBinaryにコンバートするプログラムをつくっれ
っていうものなんですが・・・ヒントがあって、(bitwise operator 8回使用)
っていう問題なんです。
これって、IF使わないとだめなんでしょうか?それともIF使わないでもできるっぽいです?
まだIF習ってないのでもしかしてこれは誤問題じゃないか!?
って疑惑があがって来てるんですけど。。
できるんですか?教えて神様
0867nobodyさん2005/10/11(火) 21:57:37ID:???
>>864 バグありますよ
08687962005/10/11(火) 21:58:13ID:???
>>863
すみません。

existsってありますよね。
これの正規表現版のようなことをしたかった次第でございます。
そして可能であれば存在するキーの一部を後方参照できれば、と
先ほどの書き込みをさせていただきました。
0869nobodyさん2005/10/11(火) 22:06:58ID:???
>>796
つまりあるハッシュが与えられた正規表現にマッチするキーを
もってるかどうか判定したいということだろうか。
0870nobodyさん2005/10/11(火) 22:15:43ID:???
つまりgrepで十分なので既に回答はでてると。
0871nobodyさん2005/10/11(火) 22:30:14ID:???
>>866
とりあえずIF文はいらんよ。
つかネット環境まであるなら宿題は自分で調べようや。
0872nobodyさん2005/10/11(火) 22:32:14ID:???
まず>>1をよく読む
08737962005/10/11(火) 22:41:01ID:???
>>869
おっしゃるとおりです。
可能であれば、+後方参照もということでした。

>>870
帰宅後やってみたいと思います。

色々とご返答有難うございました。
0874nobodyさん2005/10/11(火) 23:03:18ID:C7OEkxia
$hoge = "運転中";
$hoge2 = "運転";

if($hoge =~ /$hoge2/){
print "ok";
}

マッチしないんですけど、なぜでしょうか。。
0875nobodyさん2005/10/11(火) 23:03:56ID:???
>>851
えーとな、sort サブルーチン以外の場所で $a と $b を使うのはやめれ。
俺が混乱するから。
0876nobodyさん2005/10/11(火) 23:08:27ID:???
>848
激しくありがとう!
0877nobodyさん2005/10/11(火) 23:25:44ID:???
>>874
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm#errors
の、「マッチするはずなのにマッチしない (1)」
0878nobodyさん2005/10/11(火) 23:28:54ID:???
>>874
quotemeta 使え
0879nobodyさん2005/10/11(火) 23:33:36ID:???
それよりもSJISやEUCの違いに触れてやった方が、
今後のためにもいいんじゃないのか
0880nobodyさん2005/10/11(火) 23:39:41ID:???
quotemetaが何をするかを調べれば自ずと分かるから、良い回答だと思うけど。。
今後は結局本人次第かと。
08818202005/10/12(水) 00:22:26ID:???
宿題は昔から自分でやれという決まりですよね。。。と、いうことで、一応できたので載せときます・・・念のため。。。
#!/perl
print "Please enther the decimal number which is between 0 and 255\n";
my $input = <STDIN>;
if ($input >= 127) {print "1";
$input = $input - 126;
}else{print"0";}
if ($input >=64){print"1";
$input = $input - 64;
}else{print"0"; }
if ($input >=32){print"1";
$input = $input -32;
}else{print"0"; }
if ($input >=16){print"1";
$input = $input -16;
}else{ print"0"; }
if ($input >=8){print"1";
$input =$input -8;
}else{print"0"; }
if ($input >=4){print"1";
$input = $input -4;
}else{print"0"; }
if ($input >=2){print"1";
$input =$input - 2;
}else{print"0"; }
if ($input >=1){print"1";
$input =$input -1;
}else{print"0"; }
IF使う方法しかどうしても解りませんでした・・・なにはともあれ御指導ありがとうござました。
0882nobodyさん2005/10/12(水) 00:23:12ID:???
久々に目がくらんだ
0883nobodyさん2005/10/12(水) 00:28:47ID:???
ビックリ!
0884nobodyさん2005/10/12(水) 00:38:54ID:???
>>881
俺が直してやるよ。
Please input a number between 0 and 255.
0885nobodyさん2005/10/12(水) 00:41:00ID:???
自分でやれってか友達いねーのかよと。
0886nobodyさん2005/10/12(水) 00:50:53ID:???
>>881
>>864のバグはわかったの?
0887nobodyさん2005/10/12(水) 00:52:30ID:???
>>886 優越感に浸りたいだけの馬鹿は嫌われるぞ。
08888862005/10/12(水) 00:55:45ID:???
>>887
(°Д°)ハァ?
バグがあるからあると指摘しているだけだけど…
優越感に浸りたいのはお前だろ!
0889nobodyさん2005/10/12(水) 01:11:03ID:???
>>888
わかったからその目がキモい顔文字を引っ込めてからまた来ような
0890nobodyさん2005/10/12(水) 02:02:11ID:???
>>881
ヒント:pack/unpackの"B"。
08918712005/10/12(水) 02:14:08ID:???
>>881
ちょwwwおまwwwwwビット演算子使えって言われてるのに
どうしてそういう答えになるんだよw ビットシフト使うんだよw
おまい授業ちゃんと聞いてないだろ。ちょと必死に基礎から勉強しなおせ
0892nobodyさん2005/10/12(水) 02:36:00ID:???
しかし if すら習ってないのに、あまり使わないビット演算なんか教えるんだ?
変わってる気がするのは俺だけか。
まあ hex や oct も習ってるしその延長かなあ。
perl なんだから、もっと目的があって作ってて楽しいことから教えればいいのに、って思っちゃう。
0893nobodyさん2005/10/12(水) 03:01:29ID:???
>>892
IFとかの基礎部分を習ったのに忘れてるだけだと思う
0894nobodyさん2005/10/12(水) 05:26:24ID:???
お手軽なperlを使ってbit処理の概念とかを学ばせようとしている希ガス
つかif文使うにしても>>881はあんまりだろw
0895nobodyさん2005/10/12(水) 11:38:44ID:???
確かに、ビット演算子を使わなくていいなら、これで決まりだよな。

my $input = <STDIN>;
printf ("\nbinary = %b", $input);
0896nobodyさん2005/10/12(水) 12:02:57ID:fQz+s6Mx
配列から特定の値をとりだすにはどうしたいいですか?

たとえば@dataの中にあいえおかきけこさしすせそ
が入ってるとします。「け」の文字だけ抜き出して$keにいれる
のはどうしたいいですか?順番が変わらないで$data[6]と添え字にすればいいかも
しれませんが、「け」の位置がいつもそことは決まってないんです。
先頭に来る場合もあれば、2番目にくる場合もあるんですね。

こういう場合、配列から取り出したい文字列を抜き出すのはどうやったら
いいのでしょうか?

ご教授お願いいたします。
0897nobodyさん2005/10/12(水) 13:00:06ID:???
>>896

@dataを使う必要はない。
$ke = 'け';
0898nobodyさん2005/10/12(水) 13:32:50ID:???
たしかに取り出したい文字列があらかじめわかっているなら
取り出す必要はないよなw
0899nobodyさん2005/10/12(水) 15:39:29ID:???
なななんだ!?>>896はつりだったのか!?
0900nobodyさん2005/10/12(水) 16:08:46ID:???
>>881
>宿題は昔から自分でやれという決まりですよね。。。

本来はそうなのだが、今回は特別だ。
教官が感激してくれるようなものを作ってやったぞ。

print "input number: ";
my $input = <STDIN>;
printf ("\n【照合用】 %08b", $input);

print "\nmybinary = ".binconv(0x80, $input);

sub binconv{
my ($binseed, $input) = @_;
return ($binseed ||"") && (($input & $binseed) && 1).binconv($binseed >> 1, $input);
}
0901nobodyさん2005/10/12(水) 16:19:17ID:???
>>900先生!
print "input number: ";
my $input = <STDIN>;
printf ("\n【照合用】 %08b", $input);
これだけでもいいかと思うんですが…
>>820の教官の問題にも問題があると思ってるのは漏れだけですか?
0902nobodyさん2005/10/12(水) 18:37:38ID:???
>>901

>>900 の回答は、>>866 の宿題に対するものだけど、
「ビット演算子を8回使う」という条件があるみたいだから、
printfの出力はあくまでも参考のみ。
09039012005/10/12(水) 18:55:56ID:???
>>902
>>900先生のコードはすばらしいと思うのですが…
なんでこんな問題を…と少し思ったしだいです。
>>820がどんな教科書で勉強してるのかも興味ありです。
0904nobodyさん2005/10/12(水) 19:14:52ID:???
ハッシュって値を格納した時点で箱の中のランダムの枠内に
入れられてしまうので、その後に入れた順番でソートをかける
ことは不可能という認識で間違いございませんでしょうか。
0905nobodyさん2005/10/12(水) 19:50:30ID:???
>>904
ハッシュを eash/keys/values/配列コンテキスト等で読み出した
際の順序は、人間にとっては一見ランダムだが、perl 自身に
とってはランダムではないし、何回呼んでも必ず同じ順序になる。

入れた順序に関係なく、目的の値を分かり易い名前で素早く取り
出せるように作られているのが今の perl の実装なので、入れた
順序が重要なら、それに適したデータ構造 -- 配列を利用するか、
Tie::IxHash のようなラッパーを使う。
09068202005/10/12(水) 22:09:26ID:???
>>900
すごいプログラムありがとうございます。
ですが宿題はすでに提出してしまいました。。
なので今後の参考にさせていただきます

>>903
使ってる教科書は学校でSubject毎に買わされる・・・なんていうんでしょう・・・。
70ページくらいのノートブック?っといったほうがいいかもしれません。

学校はオーストラリアのCollegeで日本で言う職業訓練校を低レベルにしたみたいなとこでしょうか・・・。
今回のSubjectの題名がNetwork Application Solution でこの教科書の2/3程がPerlについて、
残りがVBのDebuggingについてとか、あとはJAVAはなんだ、ActiveXはなんだProxyServerがどうとか
いう説明がちょちょってあるほんとにみすぼらしい構成になっております。
ちなみにこの教科書にはIFとかの説明は載ってません。
さらに今回のSubjectはALL Selfstudyなので先生はまったくと言ってイイほどなにも教えてくれません。
ここに書いた二つの問題はこのエセ教科書の”Acitivy"からの問題です。

以上の理由により、多少奇抜な内容になっています。>>903 さんが興味をもったのもうなずけます・・・。

なにはともあれPerlのセクションの宿題は今回ので無事全部終わりました。
レスくれた皆様ありがとです!
0907nobodyさん2005/10/12(水) 22:12:57ID:???
オーストラリアか。。
0908nobodyさん2005/10/12(水) 22:19:58ID:???
夜中の12時オーストラリアの地図を描く
0909nobodyさん2005/10/13(木) 00:17:06ID:???
NULL文字を正規表現で表すとどのようになるのでしょうか。

ご教示いただけますと幸いです。
09109032005/10/13(木) 00:29:57ID:???
>>906
なるほど。そうでしたか…何か妙な感じがしたんですよね。
お疲れ様でした&今後もがんばってください。
0911nobodyさん2005/10/13(木) 00:32:47ID:???
>>909
NULLという文字列?NULL定義された変数?
definedが知りたいのかな?
09129092005/10/13(木) 00:33:27ID:???
すみません。
やりたいことは、QUERY_STRINGの判定に
(\W|)c=3
このようなイメージの指定をしたいのですが、ようは英数字以外が
cの前にきた場合と「?c=3」と前に何もない場合を指定したいという
ことです。

説明下手ですみません。
0913nobodyさん2005/10/13(木) 00:34:52ID:???
>>911
Cの文字列のターミネータになるASCIIコード0のことじゃなかろか

ということで>>909
/\0/
0914nobodyさん2005/10/13(木) 00:37:18ID:???
>>912
ああ、失礼、それなら先読み否定アサーションを使うべし
(?<!\w)
0915nobodyさん2005/10/13(木) 00:40:44ID:???
>>820 のperlの勉強は終わったらしいが、まだ perl の p も始めてない気がするなあ。カワイソス。
0916nobodyさん2005/10/13(木) 00:42:22ID:???
CPU食わないで指定秒ストップさせることは出来ますか?
sleepだと5%ぐらい使ってしまってるみたいで・・・
09179142005/10/13(木) 00:43:52ID:???
後読み否定だったorzハズカシス
ついでだから>>912のようにやるならばという別解も書いとこう
(^|\W)
09189092005/10/13(木) 00:46:02ID:???
>>913-914
ご教示有難うございます。
ぐぐって調べてみましたが、どうやらこれは

(?<!...) ゼロ幅の否定後読み表明

みたいですね。
私には少し敷居が高そうなので、もう少し勉強してみます。
とにかく有難うございます。
09199092005/10/13(木) 00:52:49ID:???
>>917
すみません、行き違いになりました。
なるほど、と試してみましたが、なぜか引っかからなくなって
しまいました。

調べてみます。
09207662005/10/13(木) 00:53:02ID:???
>>777 766です。大変遅ればせながら
09219092005/10/13(木) 01:00:44ID:???
経過報告です。

× (^|\W)c=1
× (^)c=1
○ ^c=1

なんででしょうね。。
もう少し調べてみます。
09227662005/10/13(木) 01:07:08ID:???
↑Enterで書き込みになってた。。。スレ汚しすません

>>777
遅ればせながらレス有難うございます。
しかしながらいまだcsvへの書き込みが上手くいきません。。

やりたいのは、csv開いたときに

名前,Q1の回答,Q2の回答,Q3の回答。。。。
空欄,Q1の正解,Q2の正解,Q3の正解。。。。

と横並びにカンマ区切りで出したいのですがいろんなソースを入れてみても
上手くいきません。。泣
しかも名前を普通にFORM POSTからとりたいんだけど、どこにソース入れてもエラーになる。。

09237662005/10/13(木) 01:08:08ID:???
現在のソース要約はこんなのです。(.incのファイルはやめて普通にhtml→cgiにした。)

【question_1cgi】
# 質問の取得

&ReadParse;

if(open(IFILE,"question_1.tsv")) {
while(<IFILE>) {
chomp();
push(@question,$_);
}
close(IFILE);
}



09247662005/10/13(木) 01:09:22ID:???
# 回答の表示

my($qnum) = 0;
foreach (@question) {
($qval,$aval,@column) = split(/\t/);
next if($qval eq "");

$qnum++;
$key = "Q".$qnum;
$val = $in{$key};
if($val eq $aval) {
$check = "○";
} else {
$check = "×";
}

$anum = 0;
$answer[$anum] = " ";
foreach (@column) {
next if(!$_);
$anum++;
$answer[$anum] = $_;
}
09257662005/10/13(木) 01:09:56ID:???
# csv書き込み
open(WRITE_BBSDAT , ">> file.csv");
print WRITE_BBSDAT"ここがわかりません。。。";
print WRITE_BBSDAT"$val,$aval ←じゃ縦にならんじゃう。横にそれぞれ上下で表示したい。";
close(WRITE_BBSDAT);


どなたかお助けください。。お願い申し上げます。
0926nobodyさん2005/10/13(木) 01:12:17ID:???
何が × なんだ?

my $query = 'c=0&d=1';
とか
my $query = 'ac=1&c=0&dc=0';

c=0 だけにマッチさせたいんだよな?

if ($query =~ /(?:^|(?<=\W))c=0(?:(?=\W)|$)/) {
print 'ok?';
}
でない?
0927nobodyさん2005/10/13(木) 01:13:53ID:???
>>921
ありゃ、もしかしてPerlのバージョンが古いと動かなかったりするのかな
バージョンいくつか分かる?とりあえず5.6.1と5.8.7では動作したけど・・・
Perl4探してこよう・・・
09289262005/10/13(木) 01:14:07ID:???
>>921 ね
09299092005/10/13(木) 01:18:14ID:???
>>926
おっしゃるとおりの条件にマッチさせたいと思っております。
そしてご回答有難うございます。
ちょっと私にはもう少し理解する時間が必要になりそうですが、
一つ一つ勉強していきたいと思います。有難うございます。

>>927
v5.8.4ですので、バージョンは問題ないかと思います。
検証してみます。お手数おかけしましてすみません。
0930nobodyさん2005/10/13(木) 01:28:27ID:???
>>929
$query =~ /(?:^|(?<=\W))c=0(?:(?=\W)|$)/

分解すると

:^c=0 : $query の最初に c=0 があるとマッチ
(?<=\W)c=0 : c=0 の前に "[_0-9a-zA-Z] 以外" があったらマッチ
c=0(?=\W) : c=0 の後に "[_0-9a-zA-Z] 以外" があったらマッチ
c=0$ : $query の最後に c=0 があるとマッチ

(c=0(?=\W)) ってやらないで (c=0\W) ってやると、$1 に \W の文字が入ってしまうし、次のマッチの開始も \W の後の字からになってしまう。

つか正規表現スレにいくのはどうか。
0931nobodyさん2005/10/13(木) 01:37:50ID:???
>>766,920,922-925
相変わらず何やってるのかわからんw
もうちょっとソースの中に #コメント を入れてみたらどうか。
自分で見て何やってるか分かったとしても、他人はそうではないのだから。

csv なのに
split(/,/); じゃなくて split(/\t/); ってやってるのはいいんだっけ?

あと
> print WRITE_BBSDAT"$val,$aval ←じゃ縦にならんじゃう。横にそれぞれ上下で表示したい。";
わからん。
縦になったのなら 「それぞれ上下」 にはなったんではないのか。

$val,$aval
ってなりたいのか
$val
$aval
ってなりたいのか。

とりあえず入力されたデータに改行が入ってるままファイルに書き出したらアホなことになるから、
foreach my $k (keys %in) {
$in{$k} =~ s/\x0D?\x0A/<br>/g;
}
とか &ReadParse; の後にやってみたら?
0932nobodyさん2005/10/13(木) 01:47:35ID:???
>>922
ふう、やっとやりたいことがわかった
まず処理手順が問題。今の処理手順だと質問一つずるに対して出力処理をしようとしているけれど、
全ての質問を一つの行にまとめたいなら、保存しておいて後で出力しないと。

# 回答の表示
の頭で
my @vals = ();
my @avals = ();
の二変数を作ってforeachの最後で
push @vals, $val;
push @avals, $aval;
で、foreachを閉じてから、cvs出力で、
print WRITE_BBSDAT join(',', $in{name}, @vals);
print WRITE_BBSDAT join(',', '', @avals);
って感じ。
0933nobodyさん2005/10/13(木) 01:56:30ID:???
>>932 よくがんばったえらい
0934nobodyさん2005/10/13(木) 02:05:22ID:???
>>930
コレじゃダメなん?
(?:^|\W)c=0(?:\W|$)
09359092005/10/13(木) 03:20:42ID:???
>>930,934
すみません、色々と勉強してました。
試してみましたが、おかげさまでうまくいきました。

しかしながら私の知識がまだ追いついていないこともございますので、
これから精進していきたいと思います。

本当にご親切に有難うございました。
09367662005/10/13(木) 11:12:08ID:???


レス有難う御座います。勉強足らずで申し訳ないです。

教えていただいたとおりにやってみますた。
でもやっぱりcsvをexcelで開いた時に思う通りになつてなかた。。なんでだろう
もうわからん。。

最終的にはexcelで開いた時

$in{name} ←これはくり返さない。1回だけ表示(下のセルへ)
$val ←これはその問題数分だけ横にくり返し。excelの横セルはひとつずつ違うセルに。(下のセルへ)
$aval  ←同様。(下のセルへ)

次の人
$in{name}
$val 
$aval

てなっててほしいんです。
説明へたでごめんなさい。
09377662005/10/13(木) 11:16:18ID:???
現状ソース

# 回答の表示
my @vals = (1,2,3);
my @avals = (1,2,3);

my($qnum) = 0;
foreach (@question) {
($qval,$aval,@column) = split(/,/);
next if($qval eq "");

$qnum++;
$key = "Q".$qnum;
$val = $in{$key};
if($val eq $aval) {
$check = "○";
} else {
$check = "×";
}

$anum = 0;
$answer[$anum] = " ";
foreach (@column) {
next if(!$_);
$anum++;
$answer[$anum] = $_;

push (@vals, $val);
push (@avals, $aval);
}
09387662005/10/13(木) 11:17:24ID:???
# csvへ書き込み

open(WRITE_BBSDAT , ">> file.csv");
print WRITE_BBSDAT join(',', $in{name}, @vals);
print WRITE_BBSDAT join(',', '', @avals);
close(WRITE_BBSDAT);

すいません。。ここまで教えてもらったのに。。
0939nobodyさん2005/10/13(木) 17:05:23ID:tGcMLHwK
文字列の一部分を置き換える、という処理はどうすればいいでしょうか

入力されたデータによって、5文字目だったり12文字目の2文字分を
こちらで用意している(これも種類がいくつかある)2文字に置き換えたいんです

aaaaabbbbccddddeee → aaaaxxbbbccddddeee
aaabbbbcccdddddeef → aaabbbbcccddyydeef

一応
  ・置き換えたい位置を確認
  ・それより前をまず転記
  ・置き換え文字を転記
  ・置き換えたい位置よりあとを転記
という風にすれば可能だとは思うのですが、もう少しスマートな方法というのはあるのでしょうか?
0940ヽ(´ー`)ノ ◆.ogCuANUcE 2005/10/13(木) 17:12:57ID:???
>>939
substr() は?置換もできる。

my $str = 'foobarbaz';

substr($str, 1, 2) = 'OO';    # $str is 'fOObarbaz'
0941nobodyさん2005/10/13(木) 17:16:09ID:???
>>939
s/// か
substr() をあたりなされ。

aaaaabbbbccddddeee → aaaaxxbbbccddddeee
5文字目から2文字分を置換なら、

my $str = 'aaaaabbbbccddddeee';
substr($str, 4, 2) = 'xx';

お、先に書き込みが。
0942nobodyさん2005/10/13(木) 22:16:24ID:NiH4hrTC
ひさしぶりに掲示板を作ってます。
なんとか徹夜で終えて、明日の朝に間に合わせたいと思ってます。

思ったより疲れていて思い出せないのですが、
Text::CSV_XSの使い方何ですが、

「あいうえお
かきくえこ」

これってcombineを使えば改行をエスケープしてくれて、parseをしたときに自動で
元に戻してくれると思ってたのですが、勘違いですかね?
改行などその他すべての文字は必要に応じて自分でエスケープなどしないといけないのでしょうか?

でもそれだとこのモジュールの意味がないですよね・・・・;
CSVでのメタ文字?をエスケープしてくれた記憶があるのですが。。。。

どうぞよろしくお願いします。自分でも調べてみます。
0943nobodyさん2005/10/13(木) 22:19:27ID:???
>>942
>>1
http://search.cpan.org/~jwied/Text-CSV_XS-0.23/CSV_XS.pm
09449422005/10/13(木) 22:26:57ID:NiH4hrTC
>>943
英語は読めないので
http://www.perldoc.jp/docs/modules/Text-CVS_XS-0.23/Text-CVS_XS-0.23.pod
これは見ました。

ここに書いてないということは自分で<br>に変換するものでしたっけ?
よくよく考えたら別に自分でやっても大して面倒でもないレベルなのでどうでもいいですが。
"これだけかな?大丈夫なのは。
09459422005/10/13(木) 22:50:16ID:NiH4hrTC
返事がこないorz

もういいや

0946nobodyさん2005/10/13(木) 23:08:14ID:???
>>945
どのような高速返信処理をお求めで?
0947nobodyさん2005/10/13(木) 23:23:07ID:???
40分で返らないとだめなんかw
0948nobodyさん2005/10/13(木) 23:34:41ID:???
> 思ったより疲れていて思い出せないのですが、
ここワロタ
0949nobodyさん2005/10/13(木) 23:40:28ID:???
 徹夜するから3時ぐらいまででいいん…zzz
  <⌒/ヽ-、___
/<_/____/
0950nobodyさん2005/10/14(金) 01:39:33ID:???
>>936-938
入れる場所そこじゃなーいorz
配列の初期データはテストデータだろうから置いておくとしても…

foreach (@question) {
...
foreach (@column) {
next if(!$_);
$anum++;
$answer[$anum] = $_;
} # このforeachの中じゃない

push (@vals, $val);
push (@avals, $aval);
} # pushしたらforeach (@question)のブロックは終わり

# csvへ書き込み
...

だ。も一つ問題点。ログ出力するとき改行忘れてた。スマソ
print WRITE_BBSDAT join(',', $in{name}, @vals), "\n";
print WRITE_BBSDAT join(',', '', @avals), "\n";

> $in{name} ←これはくり返さない。1回だけ表示(下のセルへ)
> $val ←これはその問題数分だけ横にくり返し。excelの横セルはひとつずつ違うセルに。(下のセルへ)
> $aval  ←同様。(下のセルへ)
>>922といってることが違う気がするのだが。
名前を別の行にしたいなら、そこだけ出せばよろし

>>931が指摘してる点の修正もお忘れなく
> とりあえず入力されたデータに改行が入ってるままファイルに書き出したらアホなことになるから、
0951nobodyさん2005/10/14(金) 02:57:23ID:???
モジュールがどんな機能なのか一覧になっているとこはどこでしょうか。
日本語で。
0952nobodyさん2005/10/14(金) 06:40:23ID:???
>>951
>>11 >>13
09539392005/10/14(金) 12:01:06ID:???
>>940-941
ありがとうございました
もっとよく調べればよかった・・・orz
09547662005/10/14(金) 14:02:22ID:???
>>950

レス有難う御座います。ほんとうに感謝です。


やっぱり配列の初期データ違いますよね。。。orz


この場合は何をいれたらいいんでしょうか?
$valは自分の選択した解答番号、&avalは正解解答番号
なので、これでいいとおもったんですが。。。

oreach my $k (keys %in) {
$in{$k} =~ s/\x0D?\x0A/<br>/g;
}
とか &ReadParse; の後に。。。

ていうのもどこにそのそーすいれたらいいのか
わかりません。。

09557662005/10/14(金) 14:05:19ID:???
現状

# 回答の表示

  my($val) = ????; ←不明
   my($aval) = ????;  ←不明
my($qnum) = 0;
foreach (@question) {
($qval,$aval,@column) = split(/,/);
next if($qval eq "");

$qnum++;
$key = "Q".$qnum;
$val = $in{$key};
if($val eq $aval) {
$check = "○";
} else {
$check = "×";
}

$anum = 0;
$answer[$anum] = " ";
foreach (@column) {
next if(!$_);
$anum++;
$answer[$anum] = $_;
       }


09567662005/10/14(金) 14:06:55ID:???
push (@val, $val);
push (@aval, $aval);
} # pushしたらforeach (@question)のブロックは終わり

#csvへの書き込み
open(WRITE_BBSDAT , ">> file.csv");
print WRITE_BBSDAT join(',', $in{name}, @val), "\n";
print WRITE_BBSDAT join(',', '', @aval), "\n";
close(WRITE_BBSDAT);
0957nobodyさん2005/10/14(金) 20:23:06ID:???
がんばれ >>950
0958nobodyさん2005/10/15(土) 05:56:59ID:???
>>954-956
おまい…配列(@)とスカラ($)を混同してるだろ…
初期化のところは何も入れなくて良いんだよ。中身はpushのところで入れてるんだから
my @vals = ();
my @avals = ();
で。むしろ混乱しているならこの部分自体なくてもよろしい

> ていうのもどこにそのそーすいれたらいいのか
だから&ReadParse;の後だって。>>923のソースの一番最初にあるでしょ

ってか、そのソースなら間違ってるところもあるがとりあえずは動くはずなんだが…
ソース全体をうpして見たらどうだろう。期待する出力結果についても、$valとか使わず、
実際にどういう風に出力されて欲しいのかを具体的に書いてもらえないと多分みんな分かってない。
漏れの認識としては、
1問目の正解:1 1人目の回答:2 2人目の回答:3
2問目の正解:2 1人目の回答:3 2人目の回答:1
3問目の正解:3 1人目の回答:1 2人目の回答:2
なら
----------------------
1人目の名前,1,2,3
,2,3,1
2人目の名前,1,2,3
,3,1,2
----------------------
という感じなんだが…

漏れの説明能力も限界ですorz 誰か他の人に任...
0959nobodyさん2005/10/15(土) 13:04:17ID:???
乙w
とりあえず誰かが作ったほうが早いことはわかったw
0960nobodyさん2005/10/15(土) 14:18:15ID:???
phpからの移行かなぁ。
アレだと配列もスカラもハッシュも$だからなぁ。(あの仕様はどうかと思う)
0961nobodyさん2005/10/15(土) 14:28:17ID:???
他の言語は $ すらつかないのも多々あるけど、
どうせ $ つけるなら perl に合わせてくれてもいいのにな、とは思った。
0962nobodyさん2005/10/15(土) 15:59:18ID:vVuUdULb
CSV形式のログファイルで掲示板を作ったのですが、
改行をどうしようか悩んでます。

\nなどを見つけたら<br>にしてから書き込んで見ました。
しかし読込表示処理の法で、HTMLエスケープしてるので<br>がエスケープされてしまいました。

それで改行を<br>以外にちかんして、読み込むときにそれを<br>に戻してやろうと思いました。
で、何に置換するかで悩んでます。

いまのところ\tとかしかないかなと思ってますが、ほかにもっといいのはありますか?
09639622005/10/15(土) 16:19:46ID:vVuUdULb
返事ないか・・・
もういいや
0964nobodyさん2005/10/15(土) 16:27:50ID:???
&#13; とかオススメ。 今考えたけど。
つか最近こらえ性の無い人が多いですね。
0965nobodyさん2005/10/15(土) 16:33:09ID:???
いやそれ以前の問題でっしゃろ・・・二十分て
# 回答員はこのスレべったり張り付いてるわけじゃないということをry

phpBBに習った構造なんかもありだと思うよ。[br]みたいにしておいて出力時にtr/[]/<>/
こっちのほうがちと冗長だけど汎用性はある
0966nobodyさん2005/10/15(土) 16:51:14ID:???
次は10分だな。

ちなみに俺の回答は読み込み表示処理の見直しかな。
0967nobodyさん2005/10/15(土) 17:30:53ID:???
回答員ていいなw 点呼したら5人くらいしかいなさそうだが
エンティティは書き込み時に行うのが一番いいと思うなり
0968nobodyさん2005/10/15(土) 17:31:58ID:???
>964-966
掲示板とはどういうものかすらわかってない池沼はスルーで。
0969nobodyさん2005/10/15(土) 17:50:45ID:???
うむ、HTMLエスケープ → \n 直し → ログ書き込み → ログ読み込み ってやればそんなことおきないもんな
0970nobodyさん2005/10/15(土) 18:07:03ID:???
/\\/\\\\/g; /\r?\n/\\n/g;
もいいかもね。
0971nobodyさん2005/10/15(土) 18:38:22ID:???
>>970
そうすると 'hogehoge\n\\n<改行>' と書いたときに 'hogehoge\\n\\\\n\n' ってなるんだけど、
一発で '\\n' や '\\\\n' にマッチしないで '\n' だけにマッチするのって難しくない?
0972nobodyさん2005/10/15(土) 20:53:21ID:???
>>971
えっと、言ってる意味がよくわからないんだけど、コレじゃダメかな?

$txt = "hogehoge\\n\\\\n\n";
$txt =~ s/\\/\\\\/g; $txt =~ s/\r?\n/\\n/g; # escape
$txt =~ s/\\(.)/($1eq'n')?"\n":$1/ge; # unescape
0973nobodyさん2005/10/15(土) 23:27:59ID:???
例えば
<f\o\r\m \n\a\m\e="test" />
こうなってるHTMLタグから\を消そうと思い

$str = '<div>\\<f\o\r\m \n\a\m\e="test" />\\<br />';
$str =~s/(<[^>]*)?\\([^<]*>)/$1$2/g;

とやったのですがうまくいきません。結果として$strには

<div>\\<form name="test" />\\<br />

と、タグ内だけの\を省きたいのですがどのようにすればよいでしょうか?
0974nobodyさん2005/10/15(土) 23:41:42ID:???
>>973
ここでの問答や今やってる事を全て忘れて、
入門書を一冊買って読めばいいんじゃないかな。
もしくはつきっきりで教えてくれる人でも探すとか。
今の状態だと何スレ消費しても先に進まなそうだし。
0975nobodyさん2005/10/15(土) 23:43:09ID:???
Perlコーディングに関係ねーし
0976nobodyさん2005/10/15(土) 23:49:17ID:???
>>974
その反応待ってました。と言う事は難しく考えなければいいのか。
久々にやるから基本忘れてしまった・・・
0977nobodyさん2005/10/15(土) 23:51:09ID:???
時々でいいから正規表現道場の事を思い出してあげてくださいです・・・
http://pc8.2ch.net/test/read.cgi/php/1105930285/
0978nobodyさん2005/10/16(日) 00:09:56ID:???
>>973
タグ内だけ処理がしたいと。

my $str = '<div>\\<f\o\r\m \n\a\m\e="test" />\\<br />';
my @tag = ();
$str =~ s/(<.*?>)/push(@tag,$1);'<>';/eg;
foreach (@tag) {
s/\\//g;#好き勝手に処理
}
$str =~ s/<>/shift(@tag);/eg;

そもそもなんでそんな処理が必要なの?仕様の方を疑っちゃうよ。
0979nobodyさん2005/10/16(日) 00:33:05ID:???
>>978
サンキューです。
深い意味は無いですが、昔Perl使ってたの思い出してもう一度使おうかと思いとりあえず正規表現思い出すために自分で作った例題みたいな。
0980nobodyさん2005/10/16(日) 18:58:16ID:???
>>973
その正規表現で最初のキャプチャはこう
<div>\\<f\o\r\m \n\a\m\e="test" />\\<br />
     |←   $1   →| |← $2  →|
\e が最初なのは [^>]* が \ も食う最大マッチだからね
で、formタグ側は既にマッチし終えたから
(gオプションの)次はbrの方に行っちゃうのが一番大きい間違いだと思う
あとシングルクォート内でも \\ は \ に置き換えられるよ

gを使うならルックアラウンドアサーション使うか
1 while $str =~ s///; の形にするか
>>978のように2段階に分けて
sub myfunc { my $tmp = shift; $tmp =~ s/\\//g; $tmp; }
$str =~ s/(<[^>]*>)/ myfunc($1) /eg;
とかすればいいと思う
09817662005/10/16(日) 21:56:12ID:???
>>958

わけわかってなくてほんとうにゴメンなさい。。レス有難うございます。
csvに書き出して、それをDLしてExcelで開いたときに表示させたいのは、

1人目の名前: name1
その人の1〜3問目の回答番号: hoge1, hoge2, hoge3,
1〜3問目の正解番号: anser1,anser2,anser3

2人目の名前: name2
・
とすると

name1、hoge1, hoge2, hoge3,
”空欄”,anser1,anser2,anser3
name2、hoge1, hoge2, hoge3,
”空欄”,anser1,anser2,anser3
・
です。

現状は
name1、hoge1
”空欄”,anser1
name1、hoge2
”空欄”,anser2
name1、hoge3
”空欄”,anser3
・
て縦に並んでしましまいます。。


09827662005/10/16(日) 22:17:35ID:???

今の全ソースです。普通のFORM POST .htmlから飛ばしてます。
【question1.cgi】

#!/usr/bin/perl
require "cgi-lib.pl";
# 質問の取得

&ReadParse;
foreach my $k (keys %in) {
$in{$k} =~ s/\x0D?\x0A/<br>/g;
}

if(open(IFILE,"question_1.tsv")) {
while(<IFILE>) {
chomp();
push(@question,$_);
}
close(IFILE);
} else {
&Print_Error("質問設定ファイルを読み込めませんでした。");
}


09837662005/10/16(日) 22:18:42ID:???
# 回答ページの表示
print "Content-type: text/html\n\n";
print qq!
<HTML>
<HEAD>
<META Http-Equiv="Content-Type" Content="text/html;charset=EUC-JP">
<TITLE>回答</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<TABLE BORDER=1 WIDTH="800px" BGCOLOR="#ffffff">
<TR BGCOLOR="E2E2EE">
<TD WIDTH="60px"><FONT SIZE=2><B>質問番号</B></FONT></TD>
<TD><FONT SIZE=2><B>あなたの回答</B></FONT></TD>
<TD WIDTH="50px"><FONT SIZE=2><B>結果</B></FONT></TD>
</TR>
!;

09847662005/10/16(日) 22:19:34ID:???
# 回答の表示

my($qnum) = 0;
foreach (@question) {
($qval,$aval,@column) = split(/\t/);
next if($qval eq "");

$qnum++;
$key = "Q".$qnum;
$val = $in{$key};
if($val eq $aval) {
$check = "○";
} else {
$check = "×";
}

$anum = 0;
$answer[$anum] = " ";
foreach (@column) {
next if(!$_);
$anum++;
$answer[$anum] = $_;

}

push (@val, $val);
push (@aval, $aval);
0985nobodyさん2005/10/16(日) 22:23:39ID:???
何レスも使うんだったらどっかにうpしる
09867662005/10/16(日) 22:25:05ID:???
# csvへの書き込み
open(WRITE_BBSDAT , ">> file.csv");
print WRITE_BBSDAT join(',', $in{name}, $val), "\n";
print WRITE_BBSDAT join(',', '', $year), "\n";
close(WRITE_BBSDAT);

print qq!
<TR BGCOLOR="#ffffff">
<TD><FONT SIZE=2><B>$key</B></FONT></TD>
<TD><FONT SIZE=2>$val</FONT></TD>
<TD><FONT SIZE=2>$aval</FONT></TD>
</TR>
!;
}

print qq!
</TABLE>
</HTML>
!;

あとこれに名前がはいっていなかったら送信できないようにする機能も
つけたいです。。

csvの書き込みと名前はいってなかったらエラーが動いたら完成なんです。
perlとかこれがほんとに初めてで、なんとかここまでやりました。。
どうかご指導お願いいたします。。実は仕事なんです。助けてください。。泣
0987nobodyさん2005/10/16(日) 22:31:22ID:???
よもまつだな。
0988nobodyさん2005/10/16(日) 22:38:54ID:???
>>986
おまいのコードのデバッグをしてやるスレじゃないよ。

問題が再現する最短のコードを載せるべし。

> 今の全ソースです。

今の全ソースなど載せるなよ。
09897662005/10/16(日) 22:51:45ID:???
みなさんのおっしゃるとおりです。。スレの無駄遣いすいません。。
0990nobodyさん2005/10/16(日) 22:59:21ID:???
>>987の日本語が釣りであることを願う
0991nobodyさん2005/10/16(日) 23:04:21ID:???
>>990が釣りであることを願う
0992nobodyさん2005/10/16(日) 23:45:46ID:???
>>766
手伝ってやろうかとも思ったが「仕事」の二文字を見た瞬間にその気が失せた。
おまいもう少し考えて行動汁。
09937662005/10/16(日) 23:51:24ID:???
すません。。ここしかたよるところがなくて。。なんとかご指導願えませんでしょうか?ヒントだけでも結構です。後は自分でなんとかしたいと思っています。

何卒宜しくお願いいたします。。
0994nobodyさん2005/10/16(日) 23:56:43ID:???
ヒントならいっぱい出てるし。
がんばって勉強してください。
仕事ならなおさらです。
0995nobodyさん2005/10/16(日) 23:59:50ID:???
>>766
正直、このスレに完璧な答えが出てる。
これでわからないならもうその仕事は破棄しなさいな。
それが先方とお前の為だよ。
0996nobodyさん2005/10/17(月) 00:15:20ID:???
え、仕事をこのスレで質問?
よもまつですな。

ヒキがいうのもなんだけど。
0997932=950=9582005/10/17(月) 00:45:14ID:???
すまん、ソース全うpを提案したのは漏れだ。
>>766のところに上げて欲しかったんだけどな…

とりあえず次スレたててくる
0998nobodyさん2005/10/17(月) 00:48:33ID:???
Perlコーディング初心者質問スレ Part 44
ttp://pc8.2ch.net/test/read.cgi/php/1129477637/
0999nobodyさん2005/10/17(月) 00:48:38ID:???
仕事は今週中に   あと2日もあれば
やるぞ♪         余裕余裕         週末家で・・・        怒られればいいか・・・
  ∧∧    ∧∧      ∧∧  . .::::::::::::::::::::::::::┃::::::::::::::::::::::::::::::::::::::::::::  ∧||∧
 (・∀・)  ∩・∀・)   (・∀・)∩..::: ∧∧:::::::::::┃:::::::::::::::::::::::::::::::::::::::::::::::::(  ⌒ヽ
 / ⊃⊃ ヽ  ⊃ノ  /⊃  / .. :::('д` )::::::::┃::::∧ ∧::::::::::::::::::::::::::::::::::: ∪  ノ
 (  (    ヽ  )つ〜( ヽノ ...:::と  ヽ::::::::┃: ('д` )::::::(   )⌒ヽ;:::::::::: ∪∪
  (/(/'    (/     し^ J.. ...:::⊂,,_UO〜:┃:::(∩∩ ):::::|/.|/uと  )〜:::::::::::::::
      まだ2日間しか     残業すれば・・・    2chで聞けば・・・
                                         ↑
                                        今ここら辺
1000nobodyさん2005/10/17(月) 00:49:51ID:???
次スレたってる模様

Perlコーディング初心者質問スレ Part 44
http://pc8.2ch.net/test/read.cgi/php/1129477637/
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。