Perlコーディング初心者質問スレ Part 43
レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん
2005/08/12(金) 01:26:47ID:mHnZWvqz【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
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:4W8j9IZT0005nobodyさん
2005/08/12(金) 01:29:40ID:4W8j9IZT0006nobodyさん
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:???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:???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:???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:???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プログラミング講座: 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/
0013nobodyさん
2005/08/12(金) 03:36:54ID:???ム板 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さん
NGNGPerlでCGIスクリプト群を作ってるんだけど、新しいバージョンを作る度にユーザー
にインストールしてもらうのが煩雑。そこで、ネットワークアップデート機能はできない
ものか? と思ってるんだけど。
----------------------------
・SuEXEC環境を前提で
・アップデート用CGIを動かすと、現在インストールされているCGIスクリプト群のversion
を、公式配布サイトの最新版と比較。
・古ければダウンロードしてアップデート。
・アップデートCGI自体のアップデート・・・はとりあえずおいておいて。
・ネットワークごしに持ってきた最新版が、そのWebサーバ環境で動くか?そこらへん
の設定はうまく別ファイルに隔離したりして対処するとして。
----------------------------
危険ですか? だとしたら理由を教えて欲しい。
もうすでにそういう仕組みある? あったら教えて欲しい・・・。
よろしくお願いします。
0015nobodyさん
2005/08/12(金) 04:06:17ID:4W8j9IZTそうだよ
急いで糞スレたてるの大変だったよー
0016nobodyさん
2005/08/12(金) 04:52:46ID:???その"公式配布サイト"が、最初はまともなスクリプトだったけど、
後で (アップするとき) 悪質なスクリプトを埋め込んだとしたら、君、潰れるよ?
0017nobodyさん
NGNG0018nobodyさん
NGNG0019nobodyさん
2005/08/12(金) 05:43:34ID:???漏れフリーでスクリプト配布しているけど
何かしらの改変をして運用してる場合が多いのでかえって迷惑鴨。
商用だとアップデートで動かなかった場合に責任問題で訴えられる鴨。
0020nobodyさん
2005/08/12(金) 06:01:01ID:???0021nobodyさん
NGNGユーザーが望めばクリック一発で最新版にアップデート!っていう感じなんですけどねえ。
0022nobodyさん
2005/08/12(金) 12:38:41ID:???0023nobodyさん
2005/08/12(金) 13:30:02ID:???配布元で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";
0028nobodyさん
2005/08/12(金) 18:50:28ID:???危険という話はおいておくとその機能は便利だね。
ファイルもってくる事自体はLWPもuse Socketも必要とせず出来る。bindする事を制限されていないのであれば。
スクリプト実行中に実行元のスクリプトファイルを書き換えても問題無いです。
上書きなら所有者、パーミッションは引き継がれる。
そもそもsuexecならファイル作成、chmodは問題なく行えます。
一番問題なのは折れない心
0029nobodyさん
2005/08/12(金) 18:56:39ID:???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/
0031nobodyさん
2005/08/12(金) 21:04:08ID:???0032nobodyさん
2005/08/12(金) 21:25:21ID:qS3bR1/B0033nobodyさん
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:???0037nobodyさん
2005/08/13(土) 18:42:30ID:Sjgh6/vt0039nobodyさん
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
0041nobodyさん
2005/08/13(土) 21:50:52ID:???$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」となってしまいました。
参考資料には
最初に#のある行はコメント行である。
また、コメント行にしたところはただの改行である。
とありました。
上記より文法として間違ってはいないと思いますが、
なにか誤っているところがあるのでしょうか?
0045nobodyさん
2005/08/13(土) 22:23:51ID:???その参考資料は捨てなさい。嘘が書いてあります。
最初の行は、コメント行ではありません。
コメントアウトした所は、ヘッダに必要な改行です。
0046nobodyさん
2005/08/13(土) 22:25:49ID:???回答は出たようなので補足だけ。
検索キーワードは「レスポンスヘッダ」とか。
あとhttpdのエラーログも見よう。
004742
2005/08/13(土) 22:30:43ID:???そうなんですか!
確かにそう考えるとコメントアウトしてエラーとなる原因がよく分かりました。
>>44
すみません。perlを用いたwebプログラミングの文法に関するものということで
ここで質問してしまいました。
スレ違いということであればどこが妥当でしょうか?
「CGIだけど、なんか質問ある? Part 12」は微妙に違うような気がしますし...
0049nobodyさん
2005/08/13(土) 23:05:20ID:???お騒がせしましたー・・・
0051nobodyさん
2005/08/13(土) 23:13:47ID:???もしdata.datの内容が以下のような場合でも、
きちんと展開されるには、どんな正規表現にすればいいでしょうか。
[data.dat]
a + b = $a + $b です。
005339
2005/08/13(土) 23:26:04ID:???\$.+$のままだと、「$a + $b です。」にマッチして、そのままevalかけるらしく、
正確な「30 です。」という結果にならないのです(´・ω・)
変数名のみ(演算子があればそれも)ってのは、やっぱり無理なんでしょうかね・・・
一応、例に出しているのはあくまでも例で、
実際は$data{name}といった内容がかかれているのです・・・。
0054nobodyさん
2005/08/13(土) 23:26:59ID:???正確に言えばそこだけど、
違いが分からないんだから初心者向けのこっちのスレが融通利かせてもいいと個人的には思う。
>>51
どの範囲を式として見るか不明瞭。
とりあえず変数と変数に挟まれた+を認識させるなら
s/(\$\w+([ +]+\$\w)*)/eval($1)/ge;
ただし $a + + $b なんてあっても無視。
式として見る範囲に記号付ける方が無難かもね。
「a + b = <$a + $b> です」
s/<([^>]*)>/eval($1)/ge;
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$BBS_TITLE="Fighter's BBS 戦士たちの会議室";
これを投稿フォームの上部に表示させているのですが、(投稿フォームのところに$BBS_TITLEと)
投稿すると$BBS_TITLEの部分だけ文字化けします。
"を'に変えてみたり、漢字をエスケープさせてみたりしましたが
直りません。
どこをどうしたら表示できるようになるでしょうか。
スクリプトはS_JISです。
0059nobodyさん
2005/08/14(日) 01:55:41ID:???HTMLソースから文字化けしている部分をさらすよろし。
よくあるShift-JISうんぬんの話じゃなさそうだから。
0060nobodyさん
2005/08/14(日) 02:30:51ID:RsCEyCku話はそれから。
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名前やレスを下さった方のお名前がわかりませんがお許しください。
>(化けたソースを)UP
・・・しろとのことでしたのでUPします。
Fighter's BBS 戦士達の会議室 となるべきところが↓
Fighter's BBS $B@o;NC#$N2q5D<<(B
このようになっております。
文字列内の'を消しても変化ありません。
投稿したときだけこのように表示され、掲示板へアクセスしただけの時は
正常に表示されます。
0063nobodyさん
2005/08/15(月) 02:48:09ID:???0064nobodyさん
2005/08/15(月) 08:24:12ID:I9dGlG0tあんがと。
shiftjis /\bshift.*jis$/i Shift JIS (aka MS Kanji)
適当に打っても通るから適当に打って投稿しますた。
0065nobodyさん
2005/08/15(月) 08:36:29ID:???文字コードの指定がないか、ばらばらなんでしょ。
自作掲示板ならソースのコードを統一する。
レンタルなら借りた先に文句を言う。
無料DLして設置したのなら作者のページで質問する。
0066nobodyさん
2005/08/15(月) 09:04:11ID:???ソースファイルの保存コードがおかしいのかも。
外部ファイルrequireして読み込んでね?
use encoding '****';してその文字コードにソースを統一しる
0067nobodyさん
2005/08/15(月) 17:51:57ID:???0068nobodyさん
2005/08/15(月) 18:54:55ID:VKc1C+7ucookieのセットを以下のように行い、\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:???この2つ。ちゃんと理解してる?
0070nobodyさん
2005/08/15(月) 22:44:30ID:VKc1C+7u68です。
ありがとうございます。
みようみまねでやっていたので、理解してませんでした。
おっしゃる通りにやったらうまく行きました。
0071nobodyさん
2005/08/16(火) 02:21:29ID:CqLOGoiCrequire は 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;
007675
2005/08/16(火) 13:33:31ID:???@{$favorites[++$#favorites]}{ @examplenames } = ("pc8.2ch.net", "php", "1123777607");
0077nobodyさん
2005/08/16(火) 14:04:58ID:9v1kpORvそれはシェルスクリプトだから、マニュアル引くならman。
それほど難しい所は無いから、cat,nkf,sedをググってみては。
>>75
こういうのを知りたかったのかなと思ったのだけど、
スライス使ってないから悩んだ。
push @favorites, {Server=>"pc8.2ch.net", Board =>"php", Key=>"1123777607"};
0078nobodyさん
2005/08/16(火) 14:08:50ID:???0079nobodyさん
2005/08/19(金) 14:41:46ID:E8nv73TYHTML::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でまわせば?
008179
2005/08/19(金) 15:00:33ID:???「HTML::Templateを使え」とは言われていないのですが、
H T M L 部 分 は 必 ず 外 部 フ ァ イ ル に し ろ
というお達しがあるので、CGI側で丸ごと<option>〜</option>を吐き出すことができません。
これができれば簡単なのですが・・・。
・デザインはデザイナーがやる
・デザイナーにはCGIの部分は「一切」触らせない
・だからCGIからHTMLを丸ごと吐き出すような作りにはできない
で、HTML::Templateに行き着いたわけでして。
0082nobodyさん
2005/08/19(金) 15:10:03ID:???ループをかけているといっているがどこにもループないし、例がないといっているが
HTML::TemplateのTMPL_LOOPのところの例はそのものズバリだと思うのだが。
なんか違う世界が見えてる人?
008379
2005/08/19(金) 15:13:01ID:???ありがとうございました。
008479
2005/08/19(金) 15:17:04ID:???ごめん。
<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の例は読んでんだけど、ハッシュの例しかなく。
008579
2005/08/19(金) 15:56:39ID:???<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:???それは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:???$ret = open (FILE, "hoge.txt");
ファイルオープンに失敗した場合、undefが返ってくるらしいのですが、
オープンに失敗したかどうかの判定をする際に
if ($ret == undef) {
と記述するべきなのか
if ($ret eq undef) {
とするべきなのか悩んでいます。
どちらも正常に判定はされているらしいのですが。
open (FILE, "hoge.txt") || &error("File open failed.");
などと書くのもありなのは知っていますが、
オープンに失敗して&errorを呼ぶ前にいくつかの処理を実行させたいので、
if文での判定を行いたいのです。
008887
2005/08/20(土) 23:52:58ID:???if(!open (FILE, "hoge.txt")) {
処理1;
処理2;
&error("failed.");
}
と記述すれば問題なさそうですね・・・
0089nobodyさん
2005/08/21(日) 00:00:39ID:???open FILE, "hoge.txt"
or do{ 処理1; 処理2; error("failed.") };
とかどう?
0090nobodyさん
2005/08/21(日) 00:29:16ID:???解決してるみたいなので、ちょっとした補足です。
undefは未定義値ではなく、未定義値を返す関数undef()です(無引数の場合)。
未定義値との比較は、==, eq ではなく defined() を使うと良いでしょう。
0092nobodyさん
2005/08/22(月) 18:49:38ID:IX9Ccu2Qforeach $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時間ルーン' ) {
009392
2005/08/22(月) 18:52:53ID:IX9Ccu2Q} 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番目に入ってしまいます。
どこが原因か教えていただけないでしょうか?
0096nobodyさん
2005/08/22(月) 22:43:42ID:???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:???全然追ってないけど、とりあえず $in{'mons'} と $in{'timeh'} は
ループの外へ出して別変数に入れようよ。
0098nobodyさん
2005/08/22(月) 23:19:39ID:???$sizeという数値が入る変数があり、これをヒアドキュメントで出力したいのですが、
print <<"EOF";
log file size $sizeKB
EOF
などと書くと、$sizeとKBではなく$sizeKBという変数として認識されてしまうのですが、
ヒアドキュメンド内で変数の直後に半角英数字を続けて書く方法はないでしょうか。
0101nobodyさん
2005/08/23(火) 00:16:13ID:???いいんじゃない?
私は頭の部分をこう書くかな。
my @tempmons = qw{dummy 城内2時間キングアッピー 城内10時間キングアッピー ...};
my %mons_to_index;
@mons_to_index{@tempmons} = 0..$#tempmons;
0102nobodyさん
2005/08/23(火) 00:49:00ID:???んじゃ、その %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:???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:???うは、正規表現を使いますか。
(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:???>>102 です。
どうも元のコード読む限り、置換は一ヶ所だけなんだよね。elsif で繋いであるし。
正規表現の作製コストと、splitかけてjoinするコスト
どっちが良いかは、この場合かなり微妙…。もしかしたらsplit, joinのが安いかも。
0110nobodyさん
2005/08/23(火) 12:04:31ID:???最近見かけた名言を贈ろう。
「推測するな。計測しろ」
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 @moge = (1, 2, 3, 4);
my @foo = (\@hoge, \@moge);
@fooを使って、$hoge[2]の値を取得するにはどうすればよいですか?
\@hogeは必ず$foo[0]にあります。
0113nobodyさん
2005/08/23(火) 13:57:40ID:???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
0114108
2005/08/23(火) 14:42:04ID:???一回だったら微妙かもですね。
>>110
ベンチなら正規表現の方が2倍速かった。(@hourlist=10で計測)
ただ、ベンチは繰り返し実行するから、
正規表現のコンパイルコストなど測れない部分がある。
大抵は無視できるけど、一回こっきりの話だと無視できない可能性も。
細かい話だけどね。
0115102
2005/08/23(火) 17:55:10ID:???ありがとう。その通りです。
ベンチ鬼のようにやってたから、目測でコスト見積るようになった。
「スカラ変数宣言で◯バイト消費。数値入力でヘッダ部分にビットが立つ。ボディーが追加されて数値設定。文字列として使っちゃったから、ヘッダ部のビット変更。ボディーの数値構造体切り離して、両用の構造体に変更。」
とか、気にしてた頃はスクリプト見ながらここまで考えてた(あほです)。
>>114
わざわざベンチありがとう。やっぱり1回だと微妙ですよね…。m/<>/go がリニアサーチだし。
0116nobodyさん
2005/08/23(火) 21:09:27ID:???そこら中のサイトで「セキュリティーホールだ!クリップボードの内容が盗見られる!」
と騒ぎ立ててんだけど、もちろん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:???while (<IN>) {
chomp;
my @tmp = split /,/;
$name2age{$tmp[0]} = $tmp[2];
}
close IN;
print $name2age{'健太'};
ハッシュのキーに漢字ってキモいな
0119nobodyさん
2005/08/23(火) 21:28:56ID:???みたいなハッシュを別に作って解決
(゚∀。)アリャ?
0123nobodyさん
2005/08/24(水) 01:11:31ID:???0124nobodyさん
2005/08/24(水) 01:11:32ID:???いずれにせよバレバレっぽいなぁ
0126nobodyさん
2005/08/24(水) 01:16:54ID:???0127nobodyさん
2005/08/24(水) 04:39:31ID:???板違い。
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"あたりに問題があるように思うのですが行き詰まってしまいました。
どこをどのようにすれば携帯から書き込めるようになるでしょうか?
0129128
2005/08/24(水) 05:37:30ID:???ttp://namihei.zone.ne.jp/upup/up/44694.txt
0130nobodyさん
2005/08/24(水) 06:19:55ID:???原因わかってるならenctype="multipart/form-data"を消せばいいやん
それはファイル添付するときのenctypeだし
どうしてもenctype書きたいならenctype="x-www-form-urlencoded"で
0133nobodyさん
2005/08/24(水) 08:47:43ID:???0134nobodyさん
2005/08/24(水) 09:45:36ID:???ファイルを開いて読んで配列に入れてから書き込むを永遠と繰り返すしかないんでしょうか。
0136nobodyさん
2005/08/24(水) 11:04:23ID:ephPxiIZ0137nobodyさん
2005/08/24(水) 11:15:53ID:???他の方法お願いします。
0138nobodyさん
2005/08/24(水) 11:24:30ID:???ファイルを開いて書き込むのを繰り返すのが普通。ただし
配列に入れるのは無駄なので読んだらどんどん書き出せ。
.
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
ログファイルには他にも商品の投票データがあり、パラメータで渡した商品のみ、カウントアップさせる企てです。
ごちゃごちゃして申し訳ありません。どうぞよろしくお願いします。
0144nobodyさん
2005/08/24(水) 15:56:30ID:???一行の長さが不定なテキストデータを、読み出しながら書き出すのは無茶。
得票数が 9 => 10 になったらまずいよね。
全部読み込んでから全部書き出すのが無難じゃないかな。
0146nobodyさん
2005/08/24(水) 16:10:26ID:???chomp;がないのに¥nつけると改行だけ増える罠。
根本的に流れがおかしい希ガス。
0147141
2005/08/24(水) 16:15:29ID:???なんとか頑張ってみます(; ;)
0148141
2005/08/24(水) 17:33:40ID:???大まかな構想を練っているのですが、アドバイス頂けますでしょうか。
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:???大まかな流れはそんな感じで良いと思う。
あと、得票数のデータは配列にするんじゃなくてハッシュにするとやりやすいと思う。
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);
ファイルの内容を丸まる配列に入れちゃうのは初心者の処理だけど、まぁ後は理解して改造してくれ。
0153141
2005/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:???例えば、こんな感じで。
$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:???0156154
2005/08/24(水) 20:09:36ID:???$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:???$opt = "or";
eval "print 'OR: OK' if 1 == 1 $opt 2 == 1";
0160154
2005/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:???ダブルクオテーション囲んでるから、evalが解釈するのは
hogehoge =~ m/hoge/ or ...
になってる。
0163nobodyさん
2005/08/24(水) 22:06:32ID:???0166nobodyさん
2005/08/24(水) 23:13:17ID:PXiCgge7csvを読み込んで、表示するというプログラムを
書いていますが、データは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:???にしても5.0はねぇだろ。ちゃんと調べろ
0168nobodyさん
2005/08/24(水) 23:52:46ID:???0169nobodyさん
2005/08/24(水) 23:55:26ID:???0170nobodyさん
2005/08/25(木) 00:08:57ID:PZEhiYYsjcode.plはUTF-8未対応
分かってて書いてると思うがw
0171nobodyさん
2005/08/25(木) 01:32:53ID:???0172nobodyさん
2005/08/25(木) 08:22:01ID:???1. コピーで突っ込んだことが無いので、よく分からないけど、
最低でもJcode::*の辺りも必要だと思う。
2. それは無い。
3. UTF-8変換すると、かなり遅くなるはず。
telnet/sshが使える環境なら、そっちからきちんとインストールしたほうがいい。
>>167
5.004から動くはず。
5.005_03で動作してるよ。
0173nobodyさん
2005/08/25(木) 15:17:31ID:???そもそも166が使ってるサーバのPerlのバージョンがわからんと話にならん。
さらにサーバ会社も晒せば同じ環境に居る人が答えてくれるかもしれん。
0174nobodyさん
2005/08/25(木) 16:09:06ID:???>にしても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:???Encodeでいろいろやってみたもののうまくいきませんでした。
例えば、
while(<c:/bin/jane/Logs/2ch/ネット関係/WebProg/*.dat>) { }
みたいに、あるフォルダの下の全ファイルをさらうとかしたいのですが、
日本語が含まれているとうまくいきません。
どうすればよいのか、お願いします。
0176nobodyさん
2005/08/25(木) 18:01:49ID:???シフトJISでスクリプトを書くと、
use encoding "shiftjis";
を入れるとうまくいかず、入れないとうまくいきます。
(ただし、それを入れないと今度は他の日本語を扱う部分がおかしくなってしまいます)
0179nobodyさん
2005/08/25(木) 19:02:49ID:ZmEBADhu↓こんな感じ
こんにちは、Perlスクリプトについて質問があり・・・[長文のため省略しました。続きはこちら]
↑こんな感じで文章を省略したいんですけど、
区切ったバイトが2byte文字か判定する方法ってありませんか?現状文字化けしてます。。。
0181nobodyさん
2005/08/25(木) 19:57:49ID:???$str= = Jcode->new($str)->jfold($width);
で\n区切り。ただし途中の\nは無視する。
0182nobodyさん
2005/08/25(木) 20:00:24ID:???$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レスありがとうございます。自分はjcode使ってないのですが、それでうまくいくのなら試してみたいと思います。
>>183
この手のやり方を求めていました。
実際にやってみたのですが、うまくいきませんでした。
Shift-JIS限定のプログラムなのですが、Shift-JISではどのようにして日本語のフラグを立てているのでしょうか?
色々と検索しているのですが見つかりません。
0185nobodyさん
2005/08/25(木) 20:48:56ID:???0186nobodyさん
2005/08/25(木) 20:49:51ID:???文字列はEUC前提。
この場合なら、一回jcodeで$bodyをEUCに変換してから。
で、$strが完成したら、それをSJISに戻せば解決
0187nobodyさん
2005/08/25(木) 20:57:13ID:???0188nobodyさん
2005/08/25(木) 20:57:34ID:???でsjisでも正規表現がうまく動くと聞いているが俺は試してない。
だとしても>>183並にめんどくさいルーチンを通さなきゃいけない。
出力する文字コードがsjis固定でよいのなら
use Jcode;
$str = Jcode->new($str)->jfold($width)->sjis();
だ。
0189nobodyさん
2005/08/25(木) 20:59:29ID:???$str = Jcode->new($str)->jfold( $width, "<br>" )->sjis();
だ。
0190nobodyさん
2005/08/25(木) 21:47:57ID:ZmEBADhuところで、jcode通すと、半角カタカナが文字化けしますよね?
0191nobodyさん
2005/08/25(木) 22:06:41ID:???とかだけだと文字化けするケースがある
&jcode::convert (\$str, "euc", "sjis");
のように、変換前の文字コードを渡すことで解決できる場合もある
0192nobodyさん
2005/08/25(木) 22:37:57ID:ZmEBADhuなるほど!
0194nobodyさん
2005/08/25(木) 22:49:28ID:???スクリプトの文字コードをShift_JISにするか、
そのフォルダを示す文字列の文字コードをShift_JISに変換する。
0195193
2005/08/25(木) 22:58:37ID:???0196187
2005/08/25(木) 23:29:04ID:???0197197
2005/08/25(木) 23:39:21ID:???0198193
2005/08/26(金) 00:10:46ID:???うん、ごめん、了解してる。
どうでもいいけど、質問者は回答に何らかのリアクション取って欲しい。
「ワケワカラン(AA略」とかでもいいからさ、
と思う初秋の夜。
回答者たち、お疲れさま。
>>197もおつ。
0199175
2005/08/26(金) 01:24:12ID:???ありがとうございます。
とりあえず下のような感じでうまくいきました。
スクリプトはシフト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);
}
}
もっとスマートな書き方があればいいんですが…。
0201nobodyさん
2005/08/26(金) 04:16:07ID:0igOMeuLところで、jcodeを通すと半角カタカナが文字化けする件ですが、”場合もある”ということは、やっぱり完全解決は無理っぽいですね。
商用のサイトではどのようにやってるんでしょう?半角カタカナを使いつつ、日本語を省略しているサイトをよく見ます。
0202nobodyさん
2005/08/26(金) 04:25:58ID:???0203nobodyさん
2005/08/26(金) 07:19:22ID:???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:???みんなが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が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:???$bが正しいucs2じゃないからじゃないだろうか。
$b = '%u3042%u0061%u3044%u0062'; # あaいb
となるはずだと思うのだが。
0208nobodyさん
2005/08/26(金) 10:57:46ID:???\x00を補う方法も考えられる。ブラウザなどからその形で送られて
くるので手出しできないとするとこの方法の方がいいかもしれん。
$b =~ s/(?:%u([a-fA-F0-9]{4})|(.))/($1 ne '')? pack('H4', $1): "\x00$2"/ge;
0209206
2005/08/26(金) 11:46:38ID:???ありがとうございました。うまくいきました。
正しいucs2ではなかったのですね。
アドバイス通り修正することで、Jcodeによる文字コードの
自動判別も使えるようになりました!
print jcode($b)->euc, "\n"; # OK!
0210nobodyさん
2005/08/26(金) 13:56:08ID:0igOMeuLありがとうございます!
$body =~ /^([\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])*$/ or chop $body;
↑こっちのやりかたで完璧でした。ShiftJISのままできました。
>>202
うーん。まぁ今となっては確かにeucでやった方がいいのかなぁ?
サイト上でテキスト(HTML)がSJISでCGIだけEUCだとチグハグ感がありますので。
0213nobodyさん
2005/08/27(土) 11:09:24ID:???うーん。そうですよねぇ。真摯に受け止めます。
>>212
それも手間じゃないですか?
そうそう、jcodeを使うと半角が化ける以外に、処理が遅くなるっていうのがありました。
最近はハードのスペックが上がったから問題ないとも思うのですが。
0214nobodyさん
2005/08/27(土) 11:54:37ID:???2、チ、网簗ムエケ、キ、ハ、、、キ。」
0215nobodyさん
2005/08/27(土) 12:25:45ID:???ロジックが甘いか、工夫が足りないだけ。
EUCだと正規表現で楽できることもあるけど、クライアントのほとんどはSJISの住人だから。
SJISの住人相手にはSJISで組んだほうがメリットになることも多いよ。
そもそも、最近はjcodeの出番がめっきり減った気がする。
0216nobodyさん
2005/08/27(土) 13:01:28ID:???オススメしないけどな。入り口と出口で変換する方が楽。
中身は古い人はEUCで、イマドキの人はunicodeが良いでしょう。
0217nobodyさん
2005/08/27(土) 14:53:32ID:???0218nobodyさん
2005/08/27(土) 19:10:26ID:???0219nobodyさん
2005/08/27(土) 19:25:06ID:???grep等のツールが使えなくなるのがちと痛いんだよなぁ。
新しめのLinux環境だと使えるのかな。。?
0220nobodyさん
2005/08/27(土) 22:05:10ID:???0221nobodyさん
2005/08/28(日) 16:08:49ID:???use encodingやuse Encodeをソースに記述し起動させると、「問題が発生しました。ご迷惑をおかけして(ry」が出てPerlが強制終了してしまいます。
Encode.pmをコマンドラインで直接立ち上がげても同じでした。
何が原因でしょうか?
0222nobodyさん
2005/08/28(日) 16:11:45ID:AszUkSZsEncode.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:???とりあえず、アンインストールして、ディレクトリも全部消してから、再インストール。
できれば、最新のバージョンのものを。
>>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:???ここスルーでつか?
0225nobodyさん
2005/08/28(日) 17:05:14ID:???0226nobodyさん
2005/08/28(日) 18:08:27ID:AszUkSZsどうもありがとうございました。
参考にさせてもらったところ無事問題が解決できました。
0227nobodyさん
2005/08/29(月) 02:19:20ID:???$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:???0229nobodyさん
2005/08/29(月) 02:32:27ID:???0230nobodyさん
2005/08/29(月) 02:35:14ID:???改行コードが残っていて、改行のみの行が存在し、それ以降が本文扱いにされているのでしょうか。
有難う御座います。早速試してみたいと思います。
0231nobodyさん
2005/08/29(月) 02:39:07ID:???うまくいきました。有難う御座いました。
>>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:???その環境でDB使わないで、あくまでcsvで行くのですね…。
すべて配列に入れるよりも、
正規表現で「公民」にマッチする行だけsplitして書き換えては。
0234nobodyさん
2005/08/29(月) 23:06:26ID:???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
0235232
2005/08/29(月) 23:36:34ID:2Z/c1c0/ありがとうございます。mysqlもpostgreも使えない環境です。。
仰るとおりの方法にしたいのですが、
splitして該当の行だけ書き換えるという処理がわかりません。
もしよろしければ、ヒント下さい。
>>234
ありがとうございます。
読んでみましたが、私が232で試そうとしている
方法のようです。確かにこれが一番簡単で
私のような初心者にもわかりやすいのですが、
書き換える箇所が何箇所もあると
同じファイルを1回の処理で何回も上書き保存しないと
いけない重たい処理になってしまいます><
0236nobodyさん
2005/08/29(月) 23:36:40ID:???扱うファイルが小さいなら、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:???0238232
2005/08/30(火) 00:03:14ID:x5m98we0ありがとうございます。
その方法でやってみます。
確かめていないのでうごくかはわかりませんが、
取次ぎお礼まで!
ありがとうございました。
0239nobodyさん
2005/08/30(火) 01:18:03ID:???0241nobodyさん
2005/08/31(水) 14:49:41ID:2aj3BZHt0242nobodyさん
2005/08/31(水) 14:56:42ID:???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:???多次元配列のエミュレーション用の機能で
$foo{$a,$b,$c}
は
$foo{join($;, $a, $b, $c)}
と同じ。詳しくはperlvar(1)の$;の項などを参照されたい。
0245nobodyさん
2005/08/31(水) 18:22:07ID:???また、逆にコードを文字に戻したりもしたいのです。
0246nobodyさん
2005/08/31(水) 18:23:01ID:???0247nobodyさん
2005/08/31(水) 18:30:58ID:???pack、unpack、ordあたり調べてきな。
# 実際に '\x' も付けて表記してるならevalで戻せるけどな。
0249nobodyさん
2005/08/31(水) 19:01:48ID:???あまりきれいに書けてないけど。例を。
for ('A', 'a') {
print '\x' . unpack('H2', $_);
}
for ('\x41', '\x61') {
/\\x(..)/;
print pack('H2', $1);
}
0250nobodyさん
2005/08/31(水) 19:11:24ID:4hPwGNyx日本語使うと文字化けしちゃって読めません。
# どうやら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:HyyIksuTif( $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:ihFBKKnRTIMTOWDI
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:???if ( 0 <= $a && $a <= 10 ) { }
elsif ( 11 <= $a && $a <= 20 ) { }
elsif ( 21 <= $a && $a <= 30 ) { }
0255251
2005/08/31(水) 22:24:49ID:???>254
すみません、なんかこの処理を他に変える方法が今の自分にはわからなくて…
スキル不足ですね。勉強します。
0256nobodyさん
2005/08/31(水) 22:28:33ID:ihFBKKnR10ごとに区切る前提なら
my $flag = int $a / 10;
if ( $flag = 0 ) {}
...
if ( $flag = 3 ) {}
は?
0257nobodyさん
2005/08/31(水) 23:09:37ID:???if ($a =~ /1[0-9]/) {}
if ($a =~ /2[0-9]/) {}
0258nobodyさん
2005/08/31(水) 23:15:40ID:???どこか設計が間違ってると疑った方がいい。
0259nobodyさん
2005/09/01(木) 09:17:57ID:???$flag という変数名を使う習慣は捨てたほうがいい。
(そもそも割り算の商はフラグじゃないし)
もし意味がフラグだったとしても何のフラグなのかあらわす単語を名前にしる。
0260250
2005/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:???下記のようなやり方だと出来ません
どのようにしたらよいのでしょうか?
$b = system("vuserinfo -l $a");
print $b;
0262nobodyさん
2005/09/01(木) 14:37:00ID:???$b = `vuserinfo -l $a`;
print $b;
systemはコマンドの戻り値が返されるのかな。
あと、openかsystem関数かでパイプを使う方法等もあったと思う。
0266nobodyさん
2005/09/01(木) 18:37:12ID:???0268nobodyさん
2005/09/01(木) 21:28:02ID:???0269nobodyさん
2005/09/01(木) 21:29:53ID:???0270nobodyさん
2005/09/02(金) 01:43:26ID:5yfALZxBpush(@tmp, $line);
}
close(FILE);
で、
print @data;
とすると、2行目以降、各行の先頭に半角スペースが入ってしまうのですが、
何が原因でしょうか?
0271nobodyさん
2005/09/02(金) 01:48:22ID:???0272270
2005/09/02(金) 01:50:31ID:5yfALZxBそれはないです。。。
1行ずつ
while($line = <FILE>) {
print $line;
}
close(FILE);
とすると大丈夫なので。
0274nobodyさん
2005/09/02(金) 01:54:19ID:???0275270
2005/09/02(金) 01:54:19ID:5yfALZxBとやっても変化無しです。
0276nobodyさん
2005/09/02(金) 01:54:50ID:???0277270
2005/09/02(金) 01:55:26ID:5yfALZxBすみません、
open(FILE, $file);
が抜けてましたorz
0279270
2005/09/02(金) 01:57:14ID:5yfALZxBすみません、書き込む時に間違えました。
手元のは大丈夫です。
あぁ、もうだめぽ。
0280nobodyさん
2005/09/02(金) 01:58:11ID:???0281nobodyさん
2005/09/02(金) 02:00:22ID:???print "@temp";
以上の違いを説明せよ
0282民主党
2005/09/02(金) 02:36:21ID:9iT1X8+f韓国大手テレビ局の8月15日番組「日本軍731部隊の生体実験」が、実は真っ赤なウソ、中国映画の盗用でっち上げだった。
韓国マスコミは反日番組で、この種のでっち上げ「歴史歪曲(わいきょく)」をよく行うが、今回の事件で 「日本糾弾ならウソも平気」 という腐敗体質が改めて確認された。
番組では実験の様子を「白黒の記録フィルム風」に紹介したが、視聴者から「映画の場面と同じだ」との声が上がり、悪質なでっち上げが露呈した。
この中国映画はカラー作品だが、テレビでは本物に見せかけて「白黒」に変えられており、意図的なでっち上げであることは明白。
日本の 民 主 党 【岡田党首】 は、日本国内に数十万人もいる反日的な在日韓国・朝鮮人に、日本の選挙権を与え、 民 主 党 に投票させようと画策している。
在日韓国・朝鮮人の大部分は、戦後のドサクサで勝手に密入国した不法滞在者とその子孫だが、「強制連行された」とウソをつき、被害者のフリをして日本国内に居座っている。
収入があっても税金は一切払わず、さらに毎月二十数万円の生活保護をもらい、日本人の悪口を言いながら遊び暮らしている。
0283nobodyさん
2005/09/02(金) 10:04:13ID:???% perl -e '@temp=("a\n", "b\n"); $,=" "; print @temp;'
a
b
0284nobodyさん
2005/09/02(金) 12:41:24ID:???Perlのバージョンは?
それから、問題が再現する最小のコードを作ってそのまま貼ってもらえると
アドバイスしやすいかな。
おれは昔(1〜2年ほど前)、print @hoge; とすると最初の行だけ先頭に
半角スペースが入ったことがあった。
print にスカラーやリストを渡した場合等は大丈夫なんだが、配列1つだけ
(もしくは先頭に配列変数だったかな)を渡すとそうなった。
(270さんと逆だなぁ。)
今、win & Linux 上で試してみたけど、そういう現象は起こらなかった。
もしかすると、Perl の、print あたりの実装上の問題かも。
# 今試して再現しなかったと書いたけど、なにぶん昔のことなので
# 方法を間違えているだけかも。
0285nobodyさん
2005/09/02(金) 12:56:58ID:???どうやらおれが書いた問題は
>>281さんが指摘したことだったみたいだ。
多分、自分の場合は、ヒアドキュメントの中で変数展開を使おうとして
先頭に改行が入っていたのだった。
print <<END;
@hoge
END
これだと改行が入るので、苦し紛れにリファレンスとデリファレンスを
使って次のように回避していたのを思い出した。
print <<END;
${ \join('', @a) }
END
>>281
文字列中での配列変数の展開では、要素間に半角スペースを入れて
結合されるのかな。
一方、引数として配列変数を指定した場合(前者)は、最初にリストに展開される
ため期待通りに処理される、と。
0286nobodyさん
2005/09/02(金) 14:02:12ID:???文字列中での変数展開では$"が間に挿入される。デフォルト値は空白。
printでは要素間に$,が挿入される。デフォルト値は空文字列。
0287nobodyさん
2005/09/02(金) 23:01:28ID:???「ひょっとして、ダブルクォート文字列の中に、chomp していない配列を入れていませんか?」
というやつだね。
0288nobodyさん
2005/09/03(土) 03:59:11ID:???0289nobodyさん
2005/09/03(土) 05:05:43ID:???あれはいったいどうやってtor経由か判断しているのでしょうか
0290nobodyさん
2005/09/03(土) 15:37:23ID:???スレ違い
0291nobodyさん
2005/09/03(土) 15:49:52ID:???これでも参考に
風呂敷確認君 弐式 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意味がわかりません。
「$v1 . hex(09) . $v2」というように項目の区切りとしてhex関数
を指定してみましたが、エラーが出てしまいます。
質問すると怒られるので焦ってます、、
ご教示いただけますと幸いです。
0294nobodyさん
2005/09/04(日) 04:03:51ID:???本当に有難うございます。
「受付データの区切りはタブ(\t)を入れており、
項目区切りはHex(09)となってますので」
と言われた意味がようやくわかりました。
Hex(09)=\tということなんですね。
勉強になりました。
0295nobodyさん
2005/09/04(日) 04:45:50ID:???えーと、まぁ正確には
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:???0297nobodyさん
2005/09/04(日) 12:20:52ID:???ありがとうございます
見たところ単純にリストと照合してるだけのようですが
そのリストをどうやって作ってるのかがなぞですね
0298nobodyさん
2005/09/04(日) 13:47:14ID:???勉強になるお話、ありがとうございます。
なぜ指示した人は「Hex(09)で」といったのでしょうかね。
「\x09で」と自然に結び付けていったつもりだったのでしょうか。
言い方は間違ってないかと思いますが、少しおかしいとも思いました。
というか僕が混乱しているせいもありますが。。
素直に\tを使うことにします。
0299nobodyさん
2005/09/04(日) 13:58:15ID:???一般的に hex は 16進法の という意味で(語源の英語 hexadecimal がそういう意味)、
担当の人は 16進表記での09 というつもりで Hex(09) と書いたのかもしれないね。
でもまぁ、開発言語がPerlと限定されてるなら、hex と chr 関数を間違えた可能性も。
おれも普段はそこらへんは曖昧だしなぁ。
Perlでhex(09)で と指定されたら、あまり慣れてない人なら少々誤解してもある程度無理ない罠。
開発&上達ガンガレ。
0301nobodyさん
2005/09/04(日) 22:22:16ID:???そこで次のサブルーチンを作成してみました
[ $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:???とりあえずすぐに気づくのは、$size に値が代入されずに return されてることだなぁ。
1. 各 .trafick ファイルの役割
2. どういうふうに うまくいかないのか
を書いてもらえれば、アドバイスしやすいかも。
0303nobodyさん
2005/09/04(日) 22:57:53ID:???トラフィックの綴りはtraffic
0304nobodyさん
2005/09/04(日) 23:10:18ID:???真剣に綴りミスしてました。忠告サンキューです。
>>302
えと、今もう一度プログラム書き直しているので>>301の物はおいとかしてください。
今やろうとしているのは、 n 秒間に m バイトのデータが転送されたら n 秒経過するまで転送量エラー画面で止めておくプログラムを組みたいと思っています。
0305304
2005/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
というのは何を表しているのでしょうか?
ぐぐって見たのですが、見つかりませんでした。
(あまりにも単純すぎて、検索するのが意外と難しい)
0308nobodyさん
2005/09/05(月) 00:19:28ID:???0310304
2005/09/05(月) 00:24:11ID:???日転送量が3GBぐらい行ってるらしくて。普通の鯖なら蹴られて当然な数値ってことはすぐ分かりました。
まだ許してくれてるので早急に対応したいなと。とりあえず今は画像の表示にsleepで時間差を付けて耐えております。
0311nobodyさん
2005/09/05(月) 00:39:15ID:???とりあえず最後のif文で、$Traffic_now(ファイル名)と
$Traffic_min_limit(バイト数)を比較してるのはおかしいだろ。
$ntrafficじゃないのか?
あと$ntrafficがリセットされるのが、リクエスト間が$Traffic_Timeout秒
あいたときだけなんだが、これはそういう仕様なのか? $Traffic_Timeout秒
以下の間隔でリクエストが来続けるといったん制限かかったらかかりっぱなし
になりそうだが。
0312nobodyさん
2005/09/05(月) 00:55:25ID:???すっゲー間違いしてました。サンキューです。
修正してみましたがまだ正しく動かないっす・・・。
とりあえずできるまで粘ってみます。
0313nobodyさん
2005/09/05(月) 01:20:29ID:???>>311が書いてるけど、各秒ごとの転送量を保存しないと、
指定時間内の転送量が出せないね。
↓文法チェックもしてないけど。ファイルロック処理等も無し。
0314nobodyさん
2005/09/05(月) 01:21:54ID:???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:???GDインストール解説サイトに5.8はまだPPMが使えないのでActivePerlは5.6をインストールするように書いてありました
その解説は2004年9月に書かれたものですが
現在も5.8ではPPMは使えないのでしょうか
0316nobodyさん
2005/09/05(月) 08:41:06ID:???rep add theoryx5 http://theoryx5.uwinnipeg.ca/cgi-bin/ppmserver?urn:/PPMServer58
としてから
search GD
で見つかると思う
0318304
2005/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:???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同時に書き込むような仕組みでなにかよい方法はございます
でしょうか。
この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:???<A>のリンクでhrefにアドレスを設定するのではなく、
onClickでJavascriptのfunctionよんで、そこでsubmitさせる
0323nobodyさん
2005/09/07(水) 20:50:14ID:???CGIを動かしてる鯖以外に、ファイルサーバを導入する。しかないような…。
しかも、Resource temporarily unavailableのメッセージはhttpdが出してるやつでしょ?
単なるアクセス制限だからCGIのコーディングと関係ない。
0324nobodyさん
2005/09/07(水) 20:53:03ID:???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:???ご返答有難うございます。
アクセス制限ですか。
とくに認証等はかけてないのですが、接続数制限という意味でしょうか。
0326nobodyさん
2005/09/07(水) 23:59:39ID:???他で管理している鯖ですか?
認証は関係ありません。
制限自体は、その鯖の設定によりけりです。
単位時間あたりの接続数、ヒット数、転送量、など
いろいろな情報を元に制限をかけることが可能です。
制限がヒット数になっていて、そのページに画像が多い場合、
すべてヒットとカウントされて制限に引っかかることもあります。
0327nobodyさん
2005/09/08(木) 00:24:20ID:???あれ?ちょっと変じゃないですか??
ロードバランサ入れてるんですよね。
一方のCGIが叩かれた時に、もう一方のCGI叩いたらダメでしょ。
負荷分散してる意味が無いような…。
0328nobodyさん
2005/09/08(木) 01:46:08ID:???CGI側ではどうすることもできないんですね。
サーバの設定を見直してもらいます。
>>327
一部だけファイルを同期する必要があるので、この手法を
とりました。
0329nobodyさん
2005/09/08(木) 03:24:01ID:vnFPn7Ff2 => '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
にしたいのですが、
ご教示いただけますと幸いです。
0331nobodyさん
2005/09/08(木) 04:24:19ID:???sort { $a cmp $b }
でいいんじゃね?
0332nobodyさん
2005/09/08(木) 04:27:51ID:???0333329
2005/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ログをどうするか悩んでいます。
プレインテキストで数千件の登録を管理するのは可能でしょうか。
また不可能だとすればどういう方法があるでしょうか。
是非ご教示願います。
0337nobodyさん
2005/09/08(木) 19:09:08ID:vnFPn7Ffsub 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:???単に負荷と言われても、どこに注目するかによって違うので、一概には比べられない。
上のは、スクリプトの部分が多い。
下のは、プロセスをforkしてる。
0339nobodyさん
2005/09/08(木) 20:26:41ID:???100アクセス/secくらいのキャンペーンサイトで後者を使用
するのですが、非常に不安で胃がいかれそうです。。
何かアドバイス等ございましたら何でもよいのでいただけ
ますと幸いです。
0340nobodyさん
2005/09/08(木) 21:12:24ID:???コケそうな感じですね…。
どうしても後者なら、キャンペーン中だけでも
鯖で起動できるプロセス数を引き上げておかないと…。
0341nobodyさん
2005/09/08(木) 21:29:41ID:???前者だったらいけそうなのでしょうか。
まだ半日くらい猶予があるので、違いがあるのであれば
前者を検討してみたいと思います。
アドバイスいただけますと幸いです。
0342nobodyさん
2005/09/08(木) 21:51:45ID:???偉い人に聞いてみたところ、「uname -nで分かるノード名を使って通信して、
2台のサーバのファイルの同期を取れ」といわれたのですが、一体Perlで
どのようにしてこのような通信ができるのかが全く思い浮かびません。
これ以上何も教えてくれそうもないので調べてみたのですが、これといった
答えも見つからず呆然としております。
2台は同ネットワーク上にあるものです。
ご教示いただけますと非常に助かります。
0343nobodyさん
2005/09/09(金) 00:20:57ID:???$BB = 10;
$CC= '$AA' . "$BB" . "[0]";
$CC を表示させると $AA10[0] となってしまいます。
どうしたら $BB などの文字を変えずに「0」と表示できるのでしょうか?
よろしくお願い致します。
0346nobodyさん
2005/09/09(金) 01:35:56ID:DzBAr2beタグ内部まで変換されてしまって困っています。
<font size="7"> ほげほげ </font>
$text =~ s/ / /g;をすると
<font size="7"> ほげほげ </font>
~~~~~~~
になってしまいます。
タグ内部を除いた部分だけを置換するにはどうしたらいいでしょうか?
0347nobodyさん
2005/09/09(金) 01:41:53ID:???正規表現道場@2ch Part4
http://pc8.2ch.net/test/read.cgi/php/1105930285/
0348329
2005/09/09(金) 04:28:01ID:???たしかに
%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:???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";
}
まあもっといい方法あるかな?
0350349
2005/09/09(金) 06:28:21ID:???0351nobodyさん
2005/09/09(金) 06:44:26ID:???print map { "$_\n" } sort {
$a !~ /^\d+$/ <=> $b !~ /\d+$/ ||
$a <=> $b ||
$a cmp $b
} keys %test;
0352nobodyさん
2005/09/09(金) 08:09:10ID:???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:???半日っていうともう猶予は過ぎてるかも知れないけど、>>338は
Perl始めたばかりのド素人のようだから無視するように。
mod_perlを使っていないのなら下の案はwgetを子プロセスとして起動する分、
サーバー負荷は無条件に高い。
単純計算で1アクセスにつき無条件にperlとwgetで計2プロセスが起動される
ことになる。wgetの中で上のコードと同じようなことをやっているのだから、
上の案のほうが負荷は半分になると考えていいだろう。
しかしそんなにアクセス数が見込まれるサイトがHTTP経由でデータ取得を行う
なんていうアホな設計になっているところが信じられん。
0354348
2005/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:???有難うございます。
あれから実はソケット通信をやってみたのですが、エラーが出てしまったんです。
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:???なんか予想の斜め上をいく展開だな。
とりあえずその偉い人に
同一セグメントのサーバ同士のファイルの同期をとるのが目的なら
いっそのことNFSかsambaかWebDAVでディレクトリを共有したらどうですか?
と進言してみたら?
リアルタイム性を要求されないのならrsyncとかも使える。
0358nobodyさん
2005/09/09(金) 17:56:17ID:???数じゃない文字列を <=> で比較すると use warnings 下では
Argument 〜 isn't numeric in numeric comparison (<=>) at 〜
が出ることをいってるんじゃないだろうか。
0359nobodyさん
2005/09/09(金) 18:18:45ID:???NFS等の導入は一番初めに提案させていただきましたが、
上から許可がおりないとか何とかであっさり却下されました。。
もうどうしたらよいのやら。。
0361nobodyさん
2005/09/09(金) 20:40:27ID:???プロジェクト全体が腐ってるっぽいな。
404になる件はノード名を/etc/hostsに登録すれば
なんとかなるだろうが…
0362nobodyさん
2005/09/10(土) 10:54:03ID:???ヘッポコ上司に連座させられたくなかったら、
ちゃんとしたプロマネつれてこないとポシャルと、
上司を飛び越してその上の上司に進言しなさい。
>>361
> 404になる件はノード名を/etc/hostsに登録すれば
> なんとかなるだろうが…
ならない。
0363nobodyさん
2005/09/10(土) 11:15:29ID:???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:???0365nobodyさん
2005/09/10(土) 11:19:09ID:???ファイルのサイズではなく、行数をカウントしてるのでは。
ちなみに
open(LOG, $logfile);
の方が良いと思います。余計な変数展開がなくなります。
0366363
2005/09/10(土) 11:22:57ID:???行数でした。
C言語しか知らないもので、while(条件){実行する内容}
という形式は理解できるのですが、perlではwhile文はどのように展開されるのでしょうか?
0367nobodyさん
2005/09/10(土) 11:34:44ID:???while を後置しているだけです。スクリプティング言語では多く見られます。
以下と同じ意味です。
while (read(LOG, $_, 1024)) {
$count+= tr/\n//; # trは置換に成功した数を返す。
}
0371nobodyさん
2005/09/10(土) 15:15:07ID:???0372名無しさん@そうだ選挙に行こう
2005/09/11(日) 16:20:19ID:yhvSpEP/サーバー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;
}
0373348
2005/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:???@hoge = (1 ,2, 3);
↓
$hoge[0] == 1
@_ = (1 ,2, 3);
↓
$_[0] == 1
ok?
0378374
2005/09/11(日) 23:22:07ID:???レスありがとうございます。
>377の例、わかりやすかったです
特に個別に名前はつけてないけどこーゆー配列(変数)だよ、っていう事なんでしょうか。
もしかしてすごくアホな事聞いてるかもしれないんですが、さっきの
if ($_[0] eq 'bye')
コレ、いきなり出てきたんです。>377で言う@_ = (1 ,2, 3); みたいなのがなくて。
@_ = (1 ,2, 3); がないのに、一体何と比較してるんだろう???となってしまったんですが…
0379名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:29:33ID:???サブルーチンの引数は、勝手に @_ に入ります。
というか、基本なんだからマニュアルか、本を読もうよ…。
0380374
2005/09/11(日) 23:37:29ID:???すみません。実は本読んでもよくわかりませんでした。
もうちょいスクリプトいじってみて、悩んでみます…
0381名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:41:56ID:???その本、巻末に索引付いてませんか?
そこで、$_ と @_ を探しましょう。
0382nobodyさん
2005/09/12(月) 17:57:25ID:???-----
$classname = 'bar'
return "foo::".$classname->new();
-----
みたいに、変数に入ってる値でクラスを呼び出すことはできないのでしょうか?
(この例だと、foo::barを呼び出したいです)
foo::??の??の部分を変数にして動的に変えたいですが、何かやり方はありますか?
0383nobodyさん
2005/09/12(月) 18:25:32ID:???0384nobodyさん
2005/09/12(月) 20:53:06ID:???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:???$obj = "foo::$classname"->new();
もできるんじゃないかな。
0388nobodyさん
2005/09/12(月) 22:46:32ID:Giee4nr4print table(TR,(td("")));
この書き方だとエラーになるようなんですが
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:???その例ならwhileの方が普通は早そうでベンチとも一致する。
my @getlist = <FILE>;
でファイル全体を一行ずつにばらした配列を作るのが余計な
手間になるからね。
ただ一般的には往々にして直観はあてにならないのできちんと
ベンチをとって評価するのが正道。
0392nobodyさん
2005/09/13(火) 12:28:09ID:???0393nobodyさん
2005/09/13(火) 14:15:39ID:???0394382
2005/09/13(火) 14:15:41ID:???386さん
うまくいきました。ありがとうございました。
0396nobodyさん
2005/09/13(火) 20:13:08ID:???掲示板CGIなどで、特定の投稿を編集をするとき、一括読み込みをしないでデータを書き換える方法はありますか?
0397nobodyさん
2005/09/13(火) 21:19:34ID:???0399390
2005/09/14(水) 00:52:53ID:???>>393
ありがとうございます。
会社の人が言うように、whileよりforeachのほうが速いケースってあるんだろうか・・・
と思う今日この頃。
0401nobodyさん
2005/09/14(水) 23:20:56ID:???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:???0403401
2005/09/14(水) 23:57:54ID:???$fhはファイルハンドルじゃないってことですか?
でも
read($fh, $buf, 1024);
という風にできるから・・・
0404nobodyさん
2005/09/15(木) 01:10:00ID:???PerlMagickと組み合わせて使ったことはないのでよくわからんが、
ファイルハンドルがほしいのなら
$fh = $cgi->upload('picFile');
を使う方がいいんじゃないかと。(ただしCGIモジュール2.47以降)
詳しくはCGIモジュールのPODの「CREATING A FILE UPLOAD FIELD」を
をよく読むといいだろう。
0405nobodyさん
2005/09/15(木) 13:41:48ID:3HNHstcis/ba/ば/g;
s/bi/び/g;・・・・みたいに何十行もえんえん続けるようなのでなく、
もっと効率的に動いて効率的に書けるような方法ありますか?
0406nobodyさん
2005/09/15(木) 14:12:50ID:???そおんなもんとっくに誰かが作ってるだろうと思い検索したらあったよ
ttp://pitecan.com/OpenPOBox/romakana/
0407401
2005/09/15(木) 15:53:13ID:???uploadとは盲点でした。が、状況は変わらず・・・。
ファイルハンドルを渡す時は
$i->Read(¥*fh);
とするとリファレンスあったので、これも試してみました。
PerlMagickにこだわるあまりCGIの方が疎かになっているようなので、
色々可能性を模索したいと思います。
0409401
2005/09/15(木) 17:18:27ID:???あ、ほんとだ。リファレンスにも書いてあるし、何故見落としてたんだろう・・・orz
おかげさまでうまく行きました。ありがとうございました。
0410nobodyさん
2005/09/16(金) 08:23:19ID:0dogEF/n本当に申し訳ないです
知らない方がいらっしゃるのであれば申し訳ないのですがネットゲーム「罪と罰」のようなCGIを利用し、
複数のプレーヤーの様々な数値(ステータスなど)を参加者全体で共有するどういった内容で行なわれているのでしょうか?
ついでにもう一つの質問を。スレ違いな感はありますがどうか答えてやってください。
PerlとPHPが多くのCGIで利用されているようですが二種類の言語が存在するということは各々に得手不得手があるということですよね?
その得手不得手及び私が制作しようとしているCGIゲームではどちらが向いているのか、初心者ではどちらが学びやすいか教えてもらえるとかなり光栄です。
よろしくお願いします。
自分の質問…あまりにも馬鹿なのか基本的すぎるのか検索にすらHitしないんです…orz
0411nobodyさん
2005/09/16(金) 08:31:10ID:???もう少しちゃんと調べような。
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:???う〜ん…
自分は船乗りなので海の上でできる趣味が無いかな?と思ったんですけどねぇ…。
本で勉強してからまた書き込みます。まずは罪と罰と同じPerlから購入してみようと思います。
オススメの書籍があるならばお教えください。
レス無くとも言われたとおりROMっているので気を悪くしないでください。
0414413
2005/09/16(金) 10:03:47ID:???私に出てきてほしい場合は(限りなくそんな場合無いとは思いますが…)乗船期間以外であれば「あの時のゲームCGI初心者」や「誤爆犯」など分かりやすく呼んでいただけると出てきます。
おそらく自分から出てくるのは仕事もあるので4ヵ月〜半年後になると思います。
0415nobodyさん
2005/09/16(金) 11:06:01ID:???次の質問ドゾー
0416nobodyさん
2005/09/16(金) 11:44:27ID:???>>410
まあ初心者的には php のが楽かもね、と。
0417413
2005/09/16(金) 21:00:27ID:???>>416さん
レスありがとうございます。
PHPですか。HTMLと一緒に記述できる点が初心者向きということですか?
本屋でPerl関連の本を探してもあまり見つからない(一冊しか無かった…)のは何故でしょう?
素人調べで悪いのですがUNIXと記述方法が似ていると言う事なのでUNIXを学べば良いのでしょうか?
でもUNIXってかなりレベルが高いような…
0418nobodyさん
2005/09/16(金) 21:05:55ID:???>本屋でPerl関連の本を探してもあまり見つからない(一冊しか無かった…)のは何故でしょう?
これはありえないと思われます。事実ならその本屋・・・品揃え悪すぎだと・・・
0420nobodyさん
2005/09/16(金) 21:30:04ID:???0422nobodyさん
2005/09/17(土) 00:01:30ID:???>>417
php は関数が最初から腐るほど用意されてあるから、
perl みたいに自分で書いたりモジュール用意したりする手間が省けることが多いのだよ。
そこが perl の楽しいところでもあるんだけど、初心者には荷が重いかもとか。
結構Web上でも初心者から学べる解説サイトがいくつかいくらでもあるので、そういうの見てもいいかもね。
まあ、ここは perl コーティングの質問スレだから、これ以上はここではきかないでね。
0423nobodyさん
2005/09/17(土) 00:24:53ID:???そう?妄想なら日記に書いておいてよ。
0425nobodyさん
2005/09/17(土) 04:40:43ID:???$funcs = get_defined_functions();
print count($funcs["internal"]);
?>
このスクリプトで組み込み関数の数を調べられるわけだが
うちの環境(PHP4.4.0+mb_string)では
826という数字が出て来た。
0426nobodyさん
2005/09/17(土) 07:33:55ID:???php5.1.0b2
1084
腐るほどかどうかは不明だが妄想とはいえないだろ
0427nobodyさん
2005/09/17(土) 07:58:14ID:???数えるのマンドクセ('A`)
0428nobodyさん
2005/09/17(土) 08:32:46ID:???こんな関数がある時点ですでに腐っている。
0429nobodyさん
2005/09/17(土) 09:10:30ID:???0430nobodyさん
2005/09/17(土) 10:05:17ID:???0433nobodyさん
2005/09/17(土) 15:15:36ID:???また、組み込み関数とやらにバグがあった場合、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:ceziuPlebiglobeでMIME::BASE64使うにはどうしたらいいの?
0436nobodyさん
2005/09/17(土) 16:07:42ID:Oc8EoCio無理じゃない?キーの頭に値を入れてソートするとか
0438nobodyさん
2005/09/17(土) 16:41:27ID:???それができるモジュールがあったと思う。
モジュール名は失念。
>>435
MIME::BASE64 を cpan あたりからダウンロードして biglobe の自分の
ディレクトリに置き、
use lib qw(path/to/MIME::BASE64);
でOK。
0439nobodyさん
2005/09/17(土) 16:44:02ID:???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:???> MIME::BASE64 を cpan あたりからダウンロードして biglobe の自分の
http://search.cpan.org/src/GAAS/MIME-Base64-3.05/
xs とかあるけど、どーやってコンパイルするんだろう。
0441439
2005/09/17(土) 16:45:43ID:???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:???pure perl 版はどうでしょう?
http://search.cpan.org/~gaas/MIME-Base64-Perl-1.00/lib/MIME/Base64/Perl.pm
0447nobodyさん
2005/09/17(土) 17:14:41ID:???へー。pure perl なのあったんでつね。
>>446
がんばってコンパイラの使い方を説明してあげてくれ。w
0448439
2005/09/17(土) 17:15:38ID:???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:???0451nobodyさん
2005/09/17(土) 17:55:00ID:9NJ0Gho0どうもありがとうございます。
用途は、、確かに配列でも代用できそうなんですけど、
キー指定して、値を引っ張るて事をしたく、
たまに、決まった順番でまとめて出力したかったからです。
0453nobodyさん
2005/09/17(土) 18:09:57ID:???PHPは配列とハッシュ(連想配列)の区別がないから、そのはず。
(じゃないと、キュー/スタックとして使えなから。)
$hoge = array('aaa' => 3, 'ccc' => 2, 'bbb' => 1);
foreach($hoge as $key => $value){
echo "$key => $value ";
}
結果
aaa => 3 ccc => 2 bbb => 1
0455nobodyさん
2005/09/17(土) 18:18:20ID:???0456nobodyさん
2005/09/17(土) 18:29:36ID:???0457nobodyさん
2005/09/17(土) 18:45:39ID:???0458nobodyさん
2005/09/17(土) 18:47:37ID:???それだったら
@hoge = ('aaa', 3, 'ccc', 2, 'bbb', 1);
こうやっといてから
%hogehash = @hoge;
って2つつくれば済むような。
0461nobodyさん
2005/09/17(土) 19:00:26ID:???0462nobodyさん
2005/09/17(土) 20:19:55ID:???0463nobodyさん
2005/09/17(土) 20:25:16ID:???0464nobodyさん
2005/09/17(土) 21:02:52ID:EwuItVJ4疑似ハッシュって今ダメなんだっけ?
>>440
MIME::Base64ならローカルにコンパイルしてFTPでコピーしても動くよ。
0465nobodyさん
2005/09/17(土) 21:16:29ID:???put 先の環境がわからない場合は、手が出せないと思うのだけど。頭大丈夫?
0466nobodyさん
2005/09/18(日) 01:36:06ID:???やってるやつは1人か2人だと思うけど。
マジレスすると
>>452
そういうニーズがあって別に問題ないだろう。
>>465
もう少し知識をつけてから書き込みましょう。
0467nobodyさん
2005/09/18(日) 02:17:25ID:???> もう少し知識をつけてから書き込みましょう。
何の知識だろう?説明して欲しいなら正直に言えばいいのに。
pure perl 版でない MIME::Base64 を動かす場合、xs をコンパイルしないとけない。
biglobe で動くようにバイナリを作らないといけないので、
> put 先の環境がわからない場合は、手が出せないと思うのだけど。頭大丈夫?
0468nobodyさん
2005/09/18(日) 02:21:44ID:???> そういうニーズがあって別に問題ないだろう。
頭が大丈夫か否か確認しているだけで、問題であるとは言ってないのでは?
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:5XfzNwGp0477nobodyさん
2005/09/18(日) 03:03:29ID:???0478nobodyさん
2005/09/18(日) 03:08:31ID:???小学生とか2回もウザいし。
0479nobodyさん
2005/09/18(日) 06:58:08ID:???擬似ハッシュは5.10.0以降無くなるから、お勧めしない。
perlrefのPseudo-hashes: Using an array as a hash、NOTE参照。
0480nobodyさん
2005/09/18(日) 15:30:34ID:tUMS1QFu…ということをレンタルサーバーでやりたいんですが、あまり大きくない画像(試した画像は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);
0482nobodyさん
2005/09/18(日) 15:37:23ID:???ローカルで一度試してみ。
0483480
2005/09/18(日) 16:03:16ID:???とりあえず使ってるレンサバではシェルが使えるのでシェル上で
適当に画像を置いてやってみたら、ちゃんと縮小されました…
0485nobodyさん
2005/09/18(日) 16:21:18ID:???ローカルのテスト環境は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はあるべき場所にありますし、エラーの出る行数を見ても}
があるだけで、行き詰まっております。
0486480
2005/09/18(日) 16:22:26ID:???which cronでパスが表示されるので入ってるみたいです。
ただ、恥ずかしい話ですが私は使ったことがないので使い方を知りません。
0487nobodyさん
2005/09/18(日) 17:10:35ID:???ttp://www.coolbrain.net/cron.html
知らない事については、勉強すればいいと思う。
いろいろ試してみて理解不能だったら、また質問すると良いよ。
0492485
2005/09/18(日) 17:39:42ID:???0493nobodyさん
2005/09/18(日) 17:42:06ID:???なんで、それだけで動くと思う?
http://perldoc.jp/docs/modules/DBD-mysql-2.1026/DBD/mysql/INSTALL.pod
0494485
2005/09/18(日) 17:57:30ID:???Perlモジュールスレがあったみたいなので、そちらで勉強してきます。
0495nobodyさん
2005/09/19(月) 19:07:11ID:beipsuRn共通の設定定義ファイルを読み込み、それがシステムで使いまわされる感じを
考えています。
*パス構成*
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)の宣言が反映されません。
どなたか、お知恵をお貸しいただければ幸いです。
0497nobodyさん
2005/09/19(月) 21:36:55ID:???問題が発生する最も短いソースを作ってみることが大切だね。
そうすると、質問しなくても自分で解る場合も多い。
一番ありそうなのは、変数のスコープが違っているということだろうけど。
0498nobodyさん
2005/09/19(月) 21:45:40ID:uGVzhqRv0499nobodyさん
2005/09/19(月) 21:49:45ID:???全然試してないけど
my $file = 'hoge.txt';
my $line = 12;
open(FH, $file) || die "$file : $!\n";
while (<FH>) {
next if ($. < $line || $line < $.); # skip
print $_; # 目的の行
}
close(FH);
0500495
2005/09/19(月) 21:55:20ID:???レスありがとうございます。
二重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:???同じファイルに対してrequire を二重に実行すると、2回目は読み込まれない。
BBSthread.pm とcounter.cgi とで変数のスコープが違っているなら、
先にrequire した方にのみ、settings.plの内容が反映されることになる。
手っ取り早く解決するなら、require を eval に変更すればいいのだが、
このような使い方は感心しないね。
settings.pl の内容を、システムに共通な定数のリストを返す「関数」
にして、各モジュールはこの関数を呼び出すのが常道だと思われるが。
0503nobodyさん
2005/09/20(火) 02:27:35ID:jMPX6Q/fSQLで取得したデータをHTMLでテーブルにして表示しているのですが、
よくフリーメールであるような各行にチェックボックスがあって、
それにチェックを入れたデータだけCSVに書き出すといったものを作りたいのですが、
ロジック的にはどういったものになるのでしょうか??チェックボックスでCGIに渡せるパラメータは
○○=on とかってなりますよね。どうやって、データを識別したらよいでしょうか???
0505nobodyさん
2005/09/20(火) 03:50:56ID:???決してバカにするつもりで聞くわけじゃないけど、今までにCGIのプログラムを
書いて、ブラウザからフォームのデータを受け取ってみたことある?
いや、もしかして、そのレベルでつまづいているんじゃないかと思ったんで。
0506nobodyさん
2005/09/20(火) 04:20:05ID:???そういうひねくれた質問の仕方すると何かいいことある?
いや、もしかして、初心者いじって喜んでるんじゃないかと思ったんで。
0507nobodyさん
2005/09/20(火) 06:54:46ID:???0508nobodyさん
2005/09/20(火) 07:07:20ID:???0509nobodyさん
2005/09/20(火) 07:19:44ID:???<input> には name と value に任意の文字列が指定できる。
チェックボックスの場合、チェックがオンになっているときだけ
name=value という形式の文字列が送られてくる。
従って name が同じでも value が違えば識別できる。
順序は保証されないので、順序に依存してはいけない。
0510nobodyさん
2005/09/20(火) 08:49:48ID:???試してみてから質問してもらえるか。
> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
0511505
2005/09/20(火) 11:54:43ID:???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:???0514nobodyさん
2005/09/20(火) 18:28:07ID:???> <form action="hoge.cgi?getval=ggg" method="post">
自分で method="post" て書いてるじゃないですか…。GET引数は渡りません。
hiddenで渡してください。
0515512
2005/09/20(火) 18:42:00ID:???>514
故意にPOSTを指定してるんです。
actionに「acton=hoge.cgi?getval=ggg」としてるんで、GETの値も渡るかなと思ったんですが、
ダメなんですかね?
そういうものなんでしょうか?
0516nobodyさん
2005/09/20(火) 18:53:02ID:???それでは、なぜGETとPOSTがあるのかを説明してください。
また、メソッドになぜ両方指定するものがないのかも考えてください。
0517nobodyさん
2005/09/20(火) 18:53:22ID:???(undef, $getval) = split /=/, $ENV{QUERY_STRING};
でOK。
0519nobodyさん
2005/09/20(火) 19:06:19ID:???0520512
2005/09/20(火) 19:12:18ID:???えっと、分かりません(汗
なんでなんでしょう?
私の中では、ブックマーク可能なページはGETにしとく、、くらいの認識しかないです。
あと、URL直接叩かれるとまずいページはPOST、、とか。そんな認識でごめんなさい。
>517
CGI.pmに頼らず、自分でパースしなくてはならない、ということですね。
これならできそうです。
で、
POSTのときってURLでパラメータ渡しちゃダメなんでしょうか?それが普通?
php書くときは結構普通にやってたけど、これって考えを改めたほうが良いですか?
0521nobodyさん
2005/09/20(火) 19:15:09ID:???> POSTのときってURLでパラメータ渡しちゃダメなんでしょうか?それが普通?
お行儀は良くない程度と思っておけばいいんじゃない?
CGI.pmはmethodを見るから受け取れなかっただけ
0522nobodyさん
2005/09/20(火) 19:22:09ID:???> 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;
}
0526nobodyさん
2005/09/20(火) 22:23:57ID:???不愉快な思いをさせてしまい、本当に申し訳ありませんでした。
今のところ不具合はないのですが、もしもアドバイス等いただ
ければと思い書かせていただいた次第です。
悪気はありませんのでお許しください。
すみませんでした。
0527nobodyさん
2005/09/20(火) 22:29:15ID:???CGIモジュールではPOSTメソッドのときにurlのquery stringで渡した
パラメタはurl_paramっていう別のインタフェースでとるようになって
いるのよ。詳しくはCGIモジュールのマニュアル嫁。特にMIXING POST
AND URL PARAMETERSという見出しのところ。
0528512
2005/09/21(水) 00:16:24ID:???なるほど、安心しました。
>527
ごめんなさい。おもいっきり書いてましたね。
どうもありがとうございます。ものすごく助かりました。
精進します。
0529nobodyさん
2005/09/21(水) 02:03:43ID:???0530nobodyさん
2005/09/21(水) 11:00:47ID:???自作CGIを評価するスレ
http://pc8.2ch.net/test/read.cgi/php/1049514428/
0531nobodyさん
2005/09/21(水) 11:41:12ID:AdBzR2Q9perlで作成したcgiの質問があります。
HTML側で
<input type=file name="aaa">
<input type=file name="bbb">
とファイルを指定して
perlのcgi側で受け取りたいのですが
やり方がわかりません。
色々ネット上を調べたり「とほほ」を見ていたけど
二つ以上ファイルを受け取る方法がわかりません。
なにか情報をいただけますと幸いです。
0533531
2005/09/21(水) 13:22:54ID:AdBzR2Q9今の所
use CGI;
my $cgi = new CGI;
my $comment = $cgi->param('comment');
上記のようにして取得しています。
だたファイルの場合はどうすれば取得できるのか不明だったため
質問させていただきました。
0534nobodyさん
2005/09/21(水) 13:51:44ID:???これが原因じゃなかったら他の回答者のレスに期待してくれ。
0535531
2005/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="送信">
うーむ 助けて偉い人ー
0537531
2005/09/21(水) 15:56:07ID:AdBzR2Q9INPUT TYPE=file
のデータの取得方法が分からないのです、、、
説明不足で申し訳ありません
0538531
2005/09/21(水) 15:58:18ID:AdBzR2Q9ひとつだけだったら
http://web.archive.org/web/20010210200144/wakusei.cplaza.ne.jp/twn/cgi-bin/wwwupl2.txt
で取れるとわかったのですが。
0541531
2005/09/21(水) 17:13:23ID:AdBzR2Q9えーっとそのCGIモジュールを使用した際の
取得方法をお教えいただきたいのです。
わがままなのは十分承知しておりますが
ヒントではなくズバリッお教えいただけますと幸いです。
0542nobodyさん
2005/09/21(水) 17:21:41ID:???CGIモジュールの使い方をどうやって調べるか?
下記の順序でお試しください。
1.マニュアルを読む
2.和訳がないかググる
3.分かりやすく説明したサイトがないかググる
4.使っている他のスクリプトがないかググる
5.開き直ってにちゃんねるで聞く
0543531
2005/09/21(水) 17:36:51ID:AdBzR2Q9use 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:???0545nobodyさん
2005/09/21(水) 23:07:53ID:???0546nobodyさん
2005/09/22(木) 02:02:03ID:???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:???↓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さん
NGNGPerl5.8以降のサーバーで動作しなくなったのですが
使えなくなった関数などがあるのでしょうか?
わかる方いましたら教えてください。
0557nobodyさん
2005/09/22(木) 20:37:31ID:???0559nobodyさん
2005/09/22(木) 20:56:13ID:???そのやり方ではだめ。const.pmが最初にuseされるときにカレントの
パッケージでFOOが定義されて、それ以後のuseでは既に読み込まれている
ので無視されている。test.plのuseをコメントアウトすると動くのは
それによってfunc.pmでのuseが最初になるからだ。
で、こういう用途には定数をexportするモジュールにするのが普通。
perlmod読んでパッケージとモジュールについて勉強するのがいいだろう。
0560nobodyさん
2005/09/22(木) 21:04:17ID:???なら関数とかいうんじゃなくて鯖独自の問題のような希ガス
0561556
NGNGsub NewsChange {
for ($NC = $NewsMax; $NC >= 2; $NC--) {
$News[$NC] = $News[$NC - 1];
}
$News[1] = $_[0];
$GFyear++;
}
ここらへんが誤動作してそうです・・・。
0562556
NGNGsub NewsChange {
for ($NC = $NewsMax; $NC >= 2; $NC--) {
$News[$NC] = $News[$NC - 1];
}
$News[1] = $_[0];
$GFyear++;
}
ここらへんが誤動作してそうです・・・。
0566556
NGNGまったく別なんですが3つのサーバーで試してずっと前から使ってた1つ目のサーバーは大丈夫で
2つ目、3つ目の新しいサーバーが同じようなバグが出て使い物にならなかったので
新しい仕様だから使えないのではないかと思いました。
0567nobodyさん
2005/09/22(木) 22:54:51ID:???0568556
NGNGエラーメッセージは出ません。
まったく同じスクリプトをまったく同じ手順で設置しているんですが
正常にゲームができるサーバーと、ゲーム開始直後に
同じログがずらりと並んでゲームができなくなるサーバーがあります。
0569nobodyさん
2005/09/22(木) 23:15:47ID:???願うしかないような希ガス。
0571nobodyさん
2005/09/23(金) 00:46:02ID:???ログってあんたが勝手に考えた仕組みだろう。
そのログを取る部分、そしてログの意味とか晒してもらわにゃ何とも言えん。
ていうか、変数の流れを追えばちゃんとエラーを特定できるはずだから。
0573エスパー回答者
2005/09/23(金) 01:51:44ID:???FORTRAN に対する郷愁が無いのなら、@Newsは0番目の要素から使うようにすべきだろう。
unshift @News, $new_element;
splice @News, $NewsMax-1;
$GFyear++;
とすれば、誤動作していたサブルーチンNewsChange を削除することができる。
これで問題は全て解決する(......はずだよな)。
0574nobodyさん
2005/09/23(金) 10:48:25ID:???0575nobodyさん
2005/09/23(金) 11:41:48ID:???とか、言ってみたりする。
0576nobodyさん
2005/09/23(金) 11:47:00ID:???JavaScript にしとけ。
0577nobodyさん
2005/09/23(金) 12:07:02ID:???0579nobodyさん
2005/09/23(金) 16:12:52ID:NELxQvyQここのアクセスカウンターって改造されてね?
0580nobodyさん
2005/09/23(金) 16:20:20ID:???0582nobodyさん
2005/09/23(金) 20:49:12ID:???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");
みたいな事です。
0587nobodyさん
2005/09/26(月) 02:22:09ID:???なぜゆえ・・・
0588nobodyさん
2005/09/26(月) 02:59:24ID:???0589nobodyさん
2005/09/26(月) 04:43:37ID:???0591nobodyさん
2005/09/26(月) 17:53:48ID:???チェックボックスでデータを受け取って
HTMLの確認画面に反映させるプログラムを作っているのですが
行き詰まりました。
例えば、course1,course2,course3とあってcourse1とcourse3がチェックされたら
course2のところが空白で反映されます。
ex.)HTML出力画面
course1
course3
こんな感じになります。
この空白を詰めて
course1
course3
みたいな風に出力したいのですがどのようにすれば良いでしょうか?
0592591
2005/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:???>>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:???思うにそれは空白をつめて表示させるためにはどのようなHTMLであるべきか
という問題であって、それさえわかってしまえばその通り出力するプログラムを
書けばいいだけだから、まずHTMLに詳しい人がいるところで質問するのが
スジってもんじゃないだろうか。ここにもいるかもしれないけどさ。
0595591
2005/09/26(月) 18:19:54ID:???ありがとうございます、無事に動きましたw
エスパーですね!
すみません、情報不足で・・。>>594さんが書いた通りです。
>>594
すみませんでした。 orz
0596nobodyさん
2005/09/26(月) 18:27:36ID:???変数以外で同じ文字を出力する場合とかは、とりあえずループにかければ問題点は見つかる。
コピペしたつもりでも、うっかりで変わってたりするから。
0598nobodyさん
2005/09/26(月) 21:18:44ID:Q7jBJFo3<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:fXbmUf3O0600nobodyさん
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:???その集めた情報の意味がわからないなら、ここで聞いても意味がないと思います。
クッキーの保存と呼び出しの勉強をしてきてください。
ついでに、ブラウザの戻る進むでは意味がないのであしからず。
0602nobodyさん
2005/09/26(月) 22:44:25ID:???ブラウザのバックは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:???レスありがとうございます。
最近cookieの勉強を始めたばかりなので、ほんとに基本しか知らないのですが、
この場合は、NAME= 値(たとえば1)、 print "path=", "/page2 "; でpage2に値を持たせて。。
戻ったときにエラーを出す方法がよくわからないのですが。。。勉強不足ですいません。
0606nobodyさん
2005/09/26(月) 23:45:44ID:???いやいや、俺始めてクッキーを知った日に応用は出来なかったけどそれぐらいの事は出来たが・・・・
まぁ>>601氏の言うようにブラウザの戻るはキャッシュがほとんどなので(略
0607nobodyさん
2005/09/27(火) 09:58:18ID:???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;
こうした場合、「%」1つの入力であれば正常にエスケープされるように
なってのですが、「%%」と入力するとなぜか\\%%になってしまいます。
ご教示いただけますと非常に助かります。
0609nobodyさん
2005/09/27(火) 23:41:28ID:???$sql =~ tr/\'%,/\\\'\%\,/;
それと安易にエスケープするな\Q使え
0610nobodyさん
2005/09/27(火) 23:56:08ID:???早速のご返答有難うございます。
しかし、「\\\\\'''''%%%%%」と入力したところ、
「\\\\\\\\\\'''''%%%%%」となりました。
前の\のみエスケープされているみたいです。
0611nobodyさん
2005/09/28(水) 00:02:13ID:???$sql =~ s/\Q(\\|'|%|,)\E/\\$1/g;
これですと
「\\\\\'''''%%%%%」は「\\'''%%%%%,,,,,」になってしまいました。。
0612nobodyさん
2005/09/28(水) 00:07:50ID:???0613584
2005/09/28(水) 00:12:25ID:???LWP・・・。
プロレス団体みたいですね。
0614nobodyさん
2005/09/28(水) 00:14:48ID:???0615nobodyさん
2005/09/28(水) 00:46:08ID:???よくわかりませんが、
$sql =~ s/(\\|\'|\\%|\,)/\\$1/g;
にすることによって解決しました。
お騒がせしました。
0616nobodyさん
2005/09/28(水) 00:47:05ID:???0617nobodyさん
2005/09/28(水) 01:02:47ID:MTwQib0M15桁(1÷3の場合は小数第14位)までしか計算出来ないようです。
例えば、1 / 3 を計算すると、
0.33333333333333 となってしまいます。
例えば、1 / 3 の結果を 100桁で出力させたい場合は、
小数第5000位で割り切れる割り算の答えを正確に (= 小数弟5000位まで) 出力したい場合には
どのようなコードにすれば良いでしょうか?
ご教示お願いします。
0618nobodyさん
2005/09/28(水) 01:03:41ID:???正) 例えば、1 / 3 の結果を 100桁で出力させたい場合や、
間違えました。申し訳ありません。
0620nobodyさん
2005/09/28(水) 08:23:08ID:???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";
0621617
2005/09/28(水) 17:07:26ID:???ご教示ありがとうございます。
実際にやってみたら正常に動作しました。
div_scale(); で無限に計算を続けるようになるとおもったら
数百桁までしか計算されていないようなので、
div_scale(1000000000000000000) みたいに馬鹿でかい数をいれたら
期待通りに動作しました。
0622nobodyさん
2005/09/29(木) 09:36:51ID:???<head><title>test</title></head>
<body>test</body>
</html>
上のようなHTMLファイルを読み込んで、
gzip圧縮してブラウザにかえすCGIを作っています。
gzip圧縮する部分はネットの記事を参考に出来たのですが
HTMLを読み込んでCGIに出力させるにはどうすればよいでしょうか。
0624nobodyさん
2005/09/29(木) 10:05:50ID:???質問の意味がよく分からんが、
print <<END;
<html>
<head><title>test</title></head>
<body>test</body>
</html>
END
でいいのでは?
0625nobodyさん
2005/09/29(木) 10:16:37ID:???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:???http の レスポンスヘッダを返さないと。
>>622
print "\n", `cat hoge.html`;
0628nobodyさん
2005/09/29(木) 13:45:10ID:???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 でソース丸見えです。
他も同じように作ってるつもりなのに、なぜこれだけ失敗するのかわかりません。
何か勘所ありましたらお教えくださいませ。 よろしくお願いします。
0634nobodyさん
2005/09/29(木) 14:20:46ID:???HTMLがテキストで見えるのなら、Content-typeが上手く出力されてないと思われ。
出力されてるヘッダを確認。
0635nobodyさん
2005/09/29(木) 14:21:56ID:???その次に、確認方法きぼんぬ。とかね。
0636nobodyさん
2005/09/29(木) 14:49:09ID:???perlをローカルにインスコしてるなら、lwp-requestコマンドが使えるので、コマンドラインから
lwp-request -e -d http://example.net/
という感じでアクセス。
0637nobodyさん
2005/09/29(木) 14:50:07ID:???演算部分をカットしても表示変わらず。
もっかいよく見てみます どうもありがとうございました。
0638nobodyさん
2005/09/29(木) 15:14:00ID:???0639nobodyさん
2005/09/29(木) 19:45:41ID:???0640nobodyさん
2005/09/29(木) 20:02:55ID:???0641nobodyさん
2005/09/29(木) 20:33:30ID:???p2 とか見てると、芸術的なすぱげっちーだし、
> たくさん cgi ファイルがある設計がどうかしていると思われ。
って感じだしなぁ。
0642639
2005/09/29(木) 21:56:36ID:???ほらほら、いちいち噛み付かない。
「みんな」ってのは、「ダメなやつはみんな」という意味だ。
そう書けば満足かな?
もっとも、新規にダメなやつが参入してくるから、あんまり
状況は変わってないが。
> たくさん cgi ファイルがある設計がどうかしていると思われ。
うん。一つ一つは正しそうに動くのに、全体を流すとつじつまが
あわなかったりしてね。まあ、きちんと管理できるなら、小分けに
したほうがいいという考えもありだとは思うけど。
0643nobodyさん
2005/09/29(木) 22:00:27ID:???あわなかったりしてね。まあ、きちんと管理できるなら、小分けに
したほうがいいという考えもありだとは思うけど。
テキストエディターのスクロールバーがちっこくなって、
編集時のスクロールでドラッグしにくいので、
用途や動作内容に分けて分割してる。
0644nobodyさん
2005/09/30(金) 00:31:42ID:???手前で$!を見てみたところ、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:EO7sC93p0646644
2005/09/30(金) 01:20:52ID:???しかしBad file descriptorが出たままなので気味が悪いです。一体何が問題なのでしょうか。
0647nobodyさん
2005/09/30(金) 03:16:19ID:???一般的にどのようなコーディング方法がありますか?
0648nobodyさん
2005/09/30(金) 03:56:57ID:???>>647
携帯でPerlを動かすのは聞いたことがないのでCGI用途とすると、
スクリプトはサーバ側の環境に依存するから自由にコーディングできる。
あとは問題なるかも知れないHTTP(リクエスト/レスポンス)ヘッダと問題になりそうなキャリア特有のhtml(chtmlとかhdml)。
前者はPerlに限ったことじゃないし、後者は板が違うね。
0649nobodyさん
2005/09/30(金) 08:41:28ID:???> ほらほら、いちいち噛み付かない。
>>641 を噛み付ついている状態であるとみなしているくせに、
どーして、そんな噛み付いているやつに、噛み付くのだろう。
> うん。一つ一つは正しそうに動くのに、全体を流すとつじつまが
> あわなかったりしてね。まあ、きちんと管理できるなら、小分けに
> したほうがいいという考えもありだとは思うけど。
ちゃんとした設計してれば、「小分け」の状態が良いと思われ。
>>648
> 優勝記念マジレス
板が違うね。
0650647
2005/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:???フレームワーク厨が暴れる前の発言では、
小分け == cgi たくさん
が成り立ってるっぽいので、何とも言えないのでは?
0655nobodyさん
2005/09/30(金) 17:05:31ID:kGP+cAoIいちいち噛み付かない。
0656nobodyさん
2005/09/30(金) 17:12:02ID:???ちゃんとした設計をしているなんて前提条件なかったじゃん。
後出しジャンケンっぽくて、ちょっとイヤーンだぞ。
そもそも、
> ちゃんとした設計してれば、
という前置きがつけば、何でも正当化できる。
『ちゃんとした設計をしていれば、○○の状態がよい』は、
無敵であるがゆえに、何も語っていないのと同じ。
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:ue8bjOg50661nobodyさん
2005/09/30(金) 21:04:35ID:???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何日考えても歯が立たない問題にぶち当たったので、詳しい人の知識をお借りしたいです!!
私がやりたいことは、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:???0676nobodyさん
2005/10/01(土) 12:54:48ID:???0677nobodyさん
2005/10/01(土) 14:07:37ID:3dTdip7r以下のように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:???0679nobodyさん
2005/10/01(土) 23:13:02ID:???遅レスだが、$!(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:???そういうのは一行で書く必然性が無ければ
二行に分けた方が読み解き易く美しい。
"STR" =~ /(REGEX)/;
op $1;
> ${\("STR" =~ /REGEX/g)};
REGEX にマッチした部分文字列の*リスト*を返した上で
無理矢理一つだけを利用しているのが無駄と混乱を招く。
どうしても /g を使いたければ
op +("STR" =~ /REGEX/g)[0];
とでもした方がいいだろう。
0684nobodyさん
2005/10/02(日) 11:53:28ID:???おそらく /g を付けているのは問題回避のためだろうから、
値1つを取れればいいなら
op +("STR" =~ /REGEX/)[0];
0685682
2005/10/02(日) 12:38:08ID:???ありがとうございます。確認しました。
/gはラクダ本(日3版175P)に「リストコンテキストでm//gを使って…」とあったので両方必須なのだと勘違いしていました。
実際のコーディングは2文でやってみようと思います。
0686nobodyさん
2005/10/02(日) 14:19:35ID:???みたいに引数を渡す場合がありますがコマンドラインからこのような
引数を渡すにはどうしたらよいでしょうか?
#>perl test.pl 「ここの部分?」
0687nobodyさん
2005/10/02(日) 14:35:59ID:???値は @ARGV に入る。
0688686
2005/10/02(日) 15:14:12ID:???サンクス。
if($#ARGV >= 0){ $buffer = join'&',@ARGV; }
デコードに付け加えて何とかなりますた。
0691nobodyさん
2005/10/02(日) 16:49:19ID:???0692nobodyさん
2005/10/02(日) 17:19:24ID:???0693ヽ(´ー`)ノ ◆.ogCuANUcE
2005/10/02(日) 17:35:02ID:???@ARGV が空リストなら $buffer は空文字になるわけだし。
使うんなら $buffer = join('&', @ARGV) if @ARGV; かな。
0694nobodyさん
2005/10/02(日) 17:51:48ID:???0695680
2005/10/03(月) 01:39:26ID:???別に確認画面を作成してそのでーたをメールを送るCGIに渡すようにしました。
ありがとうございました。
0696もな
2005/10/03(月) 02:21:03ID:???書き込みボタンを押すとエラーが出るわけでもなく画面が遷移して、また再表示というふうにはなるのですが・・・。
どうかご教授願います。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:???$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:???&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:???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:???0701nobodyさん
2005/10/03(月) 02:34:33ID:???0702nobodyさん
2005/10/03(月) 02:46:02ID:hN7oOpvnそれだとオブジェクト指向サポートしてないから書き込めないよ
0703nobodyさん
2005/10/03(月) 02:51:30ID:???0704もな
2005/10/03(月) 02:51:39ID:???です。おねがいしますm(__)m
0706もな
2005/10/03(月) 03:04:26ID:???オープンモードですか?
+>や>>などですか。調べてみましたが、もはやどうにも;;
>>705
初歩的なミスですね、ありがとうございます。
その部分を registと書き直しましたが
改善しません。
0707nobodyさん
2005/10/03(月) 03:33:27ID:???入力画面の表示の部分に
<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:AwkrNdbsCGIの改造を考えていますが、この内容が素人に出来そうでしょうか?
パールの解説のHPを見つけたのと、大昔、BASICをやっていました。
「掲示板に親記事を投稿した人間以外にレスを付けれなくする。」
1、親記事の入力フォームに記事ロックの選択肢を追加。ログデータに
この項目を追加。
2、ロックマーク表示。
3、レス投稿時に親記事番号のログデータを読み込んで、ロックであれ
ばパスワード判定。パスワードは投稿時の物を使用、判定はそのサブル
ーチン流用。
4、エラー処理。(サブルーチンから流用)。
0710nobodyさん
2005/10/03(月) 05:36:42ID:???0713709
2005/10/03(月) 22:58:15ID:y4rbqtg0ログファイルの読み込み、書き込みが強敵です。なにせ、BASICには無い
概念なので。あとは、他の部分からの流用、小改造でなんとかなりそうなんで
すが。
0714nobodyさん
2005/10/03(月) 23:16:50ID:???0715709
2005/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:???ハッシュにいれて調べるのが常套手段。
@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} = ();
こんな書き方あるのか。
0720716
2005/10/04(火) 15:10:49ID:ibcAkGb+30は@list4の間違いです。申し訳ありません。
ハッシュを使うのですね。
ありがとうございました!!
0721nobodyさん
2005/10/04(火) 15:12:11ID:???$dummy = '/^';
$dummy .= join'$/ || /^',@list2;
$dummy .= '$/';
@list3 = grep(eval $dummy,@list1);
@list4 = grep(!eval $dummy,@list1);
0722721
2005/10/04(火) 15:16:47ID:???0723nobodyさん
2005/10/04(火) 15:21:32ID:???スライスはやりすぎのような気がするので、
$list1{$_} = 1 foreach @list1;
ぐらいの方が見やすいんじゃないかねぇ。これだと値が1だから
exists使わずに
@list3 = grep {$list1{$_}} @list2;
みたいに書けるし。
0724nobodyさん
2005/10/04(火) 15:45:08ID:???my %flag = map { $_ => 1 } @list1;
0725709
2005/10/04(火) 15:46:59ID:16WUnnwbまずは入力フォームを追加して、ログデータの項目を追加。
掲示板に投稿して入力値が入っているかテスト。・・・FTPで開いて
みるが、入っていない。試行錯誤するがダメ。もう止めようと思う。
第一夜続き。お風呂でぶくぶくしていると、使っていないname値を流用すれ
ば全部済むことに気がつく。
俺って天才!! さっそく試す。ダメ。
0728709
2005/10/04(火) 15:50:20ID:16WUnnwbよ〜〜〜く見たら、formのnameに「"」がついてないことに気がつく。
再度、投稿してFTPでファイルを開く。
入ってる〜〜〜〜〜!!!!!
新たにログデータの項目を追加した状態で試す。
入ってる〜〜〜〜〜!!!!!
0730nobodyさん
2005/10/04(火) 16:56:19ID:???0731709
2005/10/04(火) 17:13:56ID:0ZPYmA+sところでローカルということは、サーバーに上げなくてもCGIは動く
のですか?
第二夜続き。
過去ログの処理が入っているので、安全を考えてname値の流用の方に決
定。とりあえずクッキーを外したいので、そこだけ消去。動作確認。
レスロック判定をしてロックなら投稿記事にマークを出す。ログデータ
はもともと読み込まれているので、if文を書いてみる。
原文から「!」が逆の判定になるのだろうと推測。
if ((!$reno)&&($sub_color eq "1")) {
print "[ロック] ";
}
出た〜〜〜〜〜!!!!
0733nobodyさん
2005/10/04(火) 18:20:23ID:???> ローカルサーバ
あの 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かますと機種依存文字が「?」になるんですね…
なんでだろ。
0737734
2005/10/04(火) 19:49:55ID:???まじですか?
ちなみに環境は、
・FedoraCore 3
・Perl 5.8.5
・内部エンコードUTF8(あまり関係ない気がするけど)
です。
0738nobodyさん
2005/10/04(火) 19:54:18ID:???0739709
2005/10/04(火) 20:09:01ID:5HGueAp3はあ。プログラマーさんは真面目なんですね。
では、さようなら。アドバイスありがとうございました。
0740nobodyさん
2005/10/04(火) 20:51:20ID:???エディターで使用してるフォントと結果表示のフォントが違うんじゃない?
同じ文字コードでも後者のフォントには含まれてない文字だとか。
0741nobodyさん
2005/10/04(火) 21:16:41ID:???Jcode::convertにかける前と後で表示させていて、かける前のは
ちゃんと表示されてるというんだからそれは違うんじゃないかと。
print qq(${char}\n);
のかわりに、
print unpack('H*', $char), "\n";
にして文字コード表示させるとなにかヒントがつかめるかもしれず。
ちなみにうちの環境ではどちらも普通に丸1が表示されてコードは
ada1だった。
0742nobodyさん
2005/10/04(火) 21:27:51ID:???PerlバージョンとJcodeのバージョンによって動作が違うと考えられるけど。
0743nobodyさん
2005/10/04(火) 21:47:32ID:???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";
かな
0747nobodyさん
2005/10/05(水) 01:00:16ID:???open (FH, "<hoge.txt");
print FH "�I";
close FH;
これを実行してエディタで開くと、文字コードがEUCになってしまう
0748nobodyさん
2005/10/05(水) 02:26:59ID:???ここは独り言書き込みスレじゃねえ
0749nobodyさん
2005/10/05(水) 03:23:07ID:???キーに指定不可能な文字列というものはあるものなの
でしょうか。
ご教示いただけますと幸いです。
0751734
2005/10/05(水) 12:48:09ID:???コード出力試したんですが、
見事に
(1) → ada1
? → 3f
でしたw
3fってもろに ? のコードなんだよなぁ…
となるとJcodeの変換テーブルに無い文字は
全部 ? に変換しちゃってるとしか考えようが…
ちなみに Jcode.pm のバージョンは 2.3 でした。
一応現在の最新版を入れたんだけど…
>>742, 743
それは痛い…
まだまだJcode使わざるをえないようですね
>>744, 745, 746
大抵 print するときはPerl変数と通常の文字列が混ざるんで、
qq() でくくって ${} で変数を切り分ける癖が付いてるみたいです。
逆に , や . で結合する方が気持ち悪いと感じてる…
(もちろん、単純な文字列の場合はその限りじゃないですが)
0753nobodyさん
2005/10/05(水) 13:51:44ID:???たぶん勘違いしてると思うのだが、新しめのJcode.pmはperl5.8以降と
組み合わせるとコード変換部分をPerlがもともと備えている機構を
使うようになるので、
0755nobodyさん
2005/10/05(水) 14:06:45ID:???とJcode.pmのHPから落としてきた2.03との組み合わせでで確かに'?'になった。
unstableでJcode.pmのパッケージはいまだに0.88なのはその辺を嫌ってるの
かもしれんな。
0759nobodyさん
2005/10/05(水) 16:29:09ID:???0760nobodyさん
2005/10/05(水) 16:35:30ID:???いきなり convert じゃなくて、getcode で文字コード取得してから自分で判別してやれば「いいじゃない
0761nobodyさん
2005/10/05(水) 17:13:12ID:???>---------- ソース(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コードを返せ、ということになるが、そんなものが無いために「?」が
返されるのではないだろうか。
0763nobodyさん
2005/10/05(水) 18:06:34ID:???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:???なるほど。
ということはEncodeを使うコード変換(Perl5.8以上のJcode含む)に
機種依存文字を渡してはいけないってことですね。
※5.8以下のJcodeとjcode.plは不明
うーん、、機種依存文字の判定はしんどいなぁ…
0765nobodyさん
2005/10/05(水) 21:14:51ID:???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の正解番号
・ ・ ・
・ ・ ・
という形に修正したいです。ここまでやってどうしてもうまくいきません。。。
どなたかお助けお願い申し上げます。
0767766
2005/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);
}
です。お願い申し上げます。。
076976
2005/10/05(水) 21:52:03ID:???こんな具合でございます。。
# 質問の取得
&ReadParse;
if(open(IFILE,"question_1.tsv")) {
while(<IFILE>) {
chomp();
push(@question,$_);
}
close(IFILE);
0770767
2005/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!;
}
0771767
2005/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:???つながってきた相手のIPアドレスは必ずわかるけど、
ホスト名はIPアドレスからDNSで逆引きしないと
出ないので、出そうとするとその分鯖の負荷になる。
なので、特に共用の鯖では逆引きしない設定にして
あることが多い。多分それじゃないかと。
0774nobodyさん
2005/10/05(水) 23:15:07ID:???0775nobodyさん
2005/10/06(木) 03:58:29ID:???0776nobodyさん
2005/10/06(木) 11:31:35ID:???> 機種依存文字
Shift_JIS だけど、
どこかに
/([\x85-\x87][\x40-\xff]|\x88[\x40-\x9e]|[\xeb-\xfc][\x40-\xff])/;
って書いてあった。
0777nobodyさん
2005/10/06(木) 11:54:16ID:???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$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:???PPクラスのdbメソッドの返値が代入されている$dbに対して
prepareメソッドを一つの引数とともに呼び、その返値を$stに代入してる。
引数は普通の文字列で、$C{sqlbase}が変数展開される。
SQL文の一部かどうかはそのプログラムを書いた人じゃないので知らん。
0780778
2005/10/06(木) 21:47:25ID:Zoab/OuC0781nobodyさん
2005/10/07(金) 04:33:20ID:7A4FQYqdでname=valueというクッキーを発行して
http://foo.jp/に渡したいんです。
domain="http://foo.jp/";
path="/";
name="value";
というクッキーを作ったんですが受け取ってもらえませんでした。
どうすればいいんでしょうか。
0782nobodyさん
2005/10/07(金) 07:25:00ID:???ただし、ピリオドが2つ以上含まれないといけないらしいが・・・
0784nobodyさん
2005/10/07(金) 11:40:23ID:???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:???0786nobodyさん
2005/10/07(金) 12:11:20ID:???$dbはPPクラスのオブジェクトじゃないの?
推測だけど。
>>781
他所のCookieを読み込みたいのですが
http://pc8.2ch.net/test/read.cgi/php/997686085/
ほんと、古いスレがあるよなぁ。
>>785
それは、コンテンツに第三者のコンテンツを埋め込んで、
そこでクッキーを発行する方法っしょ。
0788nobodyさん
2005/10/08(土) 11:15:59ID:???0790nobodyさん
2005/10/09(日) 12:58:13ID:???500 エラーになります。試しに nph-redir.cgi という名前にすると 503 になります。
使ってるのは、apache2 です。よろしくおねがいします。
my $x = CGI->new();
print $x->redirect(
-location => $url,
-status => 301,
);
0791790
2005/10/09(日) 13:04:30ID:???0792nobodyさん
2005/10/09(日) 20:13:06ID:20mFB5Hkmは各行ごとに^や$が使えるようになるみたいですが。
どなたかおしえてください。
0793nobodyさん
2005/10/09(日) 20:25:55ID:???http://search.cpan.org/dist/perl/pod/perlre.pod
0794nobodyさん
2005/10/09(日) 20:32:38ID:???その説明を読んでいる可能性が高いのではないでしょうか。
マニュアルページを読むだけで、解決する質問がかなり多いような気がします。
ぐぐるだけではなく、手元のマニュアルページも調べてみましょう。
0795nobodyさん
2005/10/09(日) 20:38:17ID:???0796nobodyさん
2005/10/09(日) 22:47:29ID:???0798nobodyさん
2005/10/09(日) 22:56:16ID:???0801nobodyさん
2005/10/10(月) 00:11:38ID:???で正規表現で複数マッチしたら何を取り出すつもりだ
0802nobodyさん
2005/10/10(月) 00:12:41ID:???正規表現でキーを表現したいということでしょ。
$hash{/^ab/} = 3;
とか。
実際には tie して
$hash->{'^ab'} = 3;
みたいになるんだろうけど
0804nobodyさん
2005/10/10(月) 00:22:16ID:???0805nobodyさん
2005/10/10(月) 00:23:35ID:???0807nobodyさん
2005/10/10(月) 01:54:54ID:???> 正規表現でキーを表現したい
それだけなら 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/ };
のように取り出したいというのなら、ラッパーを
探すなり書くなり、という話になると思うが。
0809nobodyさん
2005/10/10(月) 03:50:32ID:???print map { $hash{$_} } grep { /$regex/ } keys %hash;
0810nobodyさん
2005/10/10(月) 09:58:24ID:???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:???0814nobodyさん
2005/10/10(月) 13:58:02ID:???0815811
2005/10/10(月) 16:13:54ID:gKZw7BFlなっています。どうしてでしょうか?
お願いします。
0816nobodyさん
2005/10/10(月) 16:18:09ID:???何が欲しいのか分からない状態で使って
結果が正しいのかどうかも分からないって…
それは質問なのか?
0817nobodyさん
NGNG0818nobodyさん
2005/10/10(月) 22:40:59ID:???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:???分からないエラーが出たときには、そのエラーメッセージでぐぐると良いですよ。
$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:???つttp://www.site-cooler.com/cgi-bin/kansuu.cgi?lang=perl
0822nobodyさん
2005/10/10(月) 23:52:46ID:???それさ、そこに書いてある部分が問題文、
というか「これを拡張して書け」みたいな感じなんじゃない?
変換しろって言うんだから、変換しなよ。簡単だぞ。
がんばれよ。
0823820
2005/10/11(火) 00:01:28ID:ydWxrZ97んー。。
変換する式みたいなもんがあるんでしょうか?
print 0xFF,;
って書くと勝手にPerlが普通の数字に変換してくれますが、内部でどのように変換してるんでしょか?
なんか、三角形の面積を求める公式みたいな計算式があればできるっぽいんですけど。。
もう一度一から教科書読み直して勉強してみます・・・。
0824nobodyさん
2005/10/11(火) 00:02:58ID:???書いてもらいたいんだろうなぁ。
0826820
2005/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:???う〜ん。怒られないと思うけど、初歩的な悪い例として取り上げられるかもw
0828nobodyさん
2005/10/11(火) 00:39:23ID:???0829820
2005/10/11(火) 00:44:24ID: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,;
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に・・・
もうちょいがむばってみます・・・
0831827
2005/10/11(火) 01:01:39ID:???>>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:???0833nobodyさん
2005/10/11(火) 01:12:39ID:???いや、お前よりかはみんな知ってると思うが・・・^^;
0834827
2005/10/11(火) 01:22:05ID:???馬鹿め!>>820宛に書いた文章だぞ。俺だってchompぐらい知ってる。
chomp関数とはなんぞや?(その下の行に簡単にわかるリンク先)
ttp://www.site-cooler.com/cgi-bin/kansuu.cgi?lang=perl&method=chomp
俺ってなんて優しいんだw
0835nobodyさん
2005/10/11(火) 01:26:50ID:???× print oct #oct,;
〇 print oct $oct;
って教えてやれよw
0837nobodyさん
2005/10/11(火) 01:45:08ID:???テキストエディタだったらすぐ気づきそうな。
0838nobodyさん
2005/10/11(火) 02:14:26ID:???0839nobodyさん
2005/10/11(火) 10:24:06ID:4r4FVZwb$kexp= 200;
$pexp= 676;
$bexp= 267;
$kexp= $a;
$pexp= $b;
$bexp= $c;
$a + $b + $c= $d;
print $d;
何がいけないのかな?
0841nobodyさん
2005/10/11(火) 10:33:04ID:4r4FVZwbそれを、cgiとして使うと500になるんです。
数字の200とかは、適当に使ってるやつで、
ただのテストCGIなんだけど、上手く動かないorz
どこを改善すればいいんだ・・・。
0843842
2005/10/11(火) 10:45:14ID:???「=」の左辺に右辺の結果が代入されるんだぞ。
ちょっと勉強しなおして来い。一発で見抜けなかった俺も修行してくるから。
0844nobodyさん
2005/10/11(火) 10:49:14ID:4r4FVZwbじぇんじぇん頭が回ってなかったなw
よ〜し、では修正に逝ってきますw
0845nobodyさん
2005/10/11(火) 10:53:23ID:4r4FVZwb$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:iD4ymnU6Image::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:???0848nobodyさん
2005/10/11(火) 11:26:44ID:???>原因が分からないのですが何かの切っ掛けでこの部分がたまにエラーを吐いてきます。
>
>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:???0851nobodyさん
2005/10/11(火) 12:26:14ID:4r4FVZwbヘッダーの足し方がいまいち不明で、
どこら辺に足せばいいのかがわからなくて、
ただいま格闘しておりました・・・。
ですが、ヘッダーがどんな物かはわかるんだけど、
やはり場所が不明で500になってしまいます。
0852nobodyさん
2005/10/11(火) 12:30:16ID:8zYGlOye質問があります。
foreach(sort @data){
としたいのですが@dataの中身はカンマ区切りで2番目と3番目のキー
でソートしたいのですが方法はありますでしょうか?
0854nobodyさん
2005/10/11(火) 12:34:55ID:???わかってないことをわかったように言うな。
#!/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:???0857846
2005/10/11(火) 15:16:03ID:???print を抜いても
IE、Operaで試してみても駄目でした。
色々調べているのですが
どうにも手に負えそうにないので別な方法を考えようと思います。
ありがとうございました。
0859nobodyさん
2005/10/11(火) 15:40:53ID:XkXcz5GJ$1と書かなければならないところで\1と書くとうまく動作しませんが、
\1をすべて$1と書きかえて問題が生じることはありますか?
0861796
2005/10/11(火) 19:28:50ID:???私のやりたかったことは、
if($form{read/([0-9a-zA-Z]+)/]}){ print $1; }
このような判定がかけられればと質問させていただいた次第です。
説明不足ですみませんでした。
順次試させていただきます。
有難うございました。
0863nobodyさん
2005/10/11(火) 21:18:28ID:???お前がそう書いたらどういう風に動くことを期待しているのか
説明してくれないと結局何がなんだかわからないわけだが。
0864820
2005/10/11(火) 21:49:41ID:???一応できたの載せときます。
#!/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って奥が深い
0866820
2005/10/11(火) 21:55:29ID:m+2zbTP9Decimalを256以下の数字で聞いてきて、それをBinaryにコンバートするプログラムをつくっれ
っていうものなんですが・・・ヒントがあって、(bitwise operator 8回使用)
っていう問題なんです。
これって、IF使わないとだめなんでしょうか?それともIF使わないでもできるっぽいです?
まだIF習ってないのでもしかしてこれは誤問題じゃないか!?
って疑惑があがって来てるんですけど。。
できるんですか?教えて神様
0868796
2005/10/11(火) 21:58:13ID:???すみません。
existsってありますよね。
これの正規表現版のようなことをしたかった次第でございます。
そして可能であれば存在するキーの一部を後方参照できれば、と
先ほどの書き込みをさせていただきました。
0870nobodyさん
2005/10/11(火) 22:15:43ID:???0873796
2005/10/11(火) 22:41:01ID:???おっしゃるとおりです。
可能であれば、+後方参照もということでした。
>>870
帰宅後やってみたいと思います。
色々とご返答有難うございました。
0874nobodyさん
2005/10/11(火) 23:03:18ID:C7OEkxia$hoge2 = "運転";
if($hoge =~ /$hoge2/){
print "ok";
}
マッチしないんですけど、なぜでしょうか。。
0876nobodyさん
2005/10/11(火) 23:08:27ID:???激しくありがとう!
0877nobodyさん
2005/10/11(火) 23:25:44ID:???http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm#errors
の、「マッチするはずなのにマッチしない (1)」
0879nobodyさん
2005/10/11(火) 23:33:36ID:???今後のためにもいいんじゃないのか
0880nobodyさん
2005/10/11(火) 23:39:41ID:???今後は結局本人次第かと。
0881820
2005/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:???0885nobodyさん
2005/10/12(水) 00:41:00ID:???0891871
2005/10/12(水) 02:14:08ID:???ちょwwwおまwwwwwビット演算子使えって言われてるのに
どうしてそういう答えになるんだよw ビットシフト使うんだよw
おまい授業ちゃんと聞いてないだろ。ちょと必死に基礎から勉強しなおせ
0892nobodyさん
2005/10/12(水) 02:36:00ID:???変わってる気がするのは俺だけか。
まあ hex や oct も習ってるしその延長かなあ。
perl なんだから、もっと目的があって作ってて楽しいことから教えればいいのに、って思っちゃう。
0894nobodyさん
2005/10/12(水) 05:26:24ID:???つか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番目にくる場合もあるんですね。
こういう場合、配列から取り出したい文字列を抜き出すのはどうやったら
いいのでしょうか?
ご教授お願いいたします。
0898nobodyさん
2005/10/12(水) 13:32:50ID:???取り出す必要はないよなw
0900nobodyさん
2005/10/12(水) 16:08:46ID:???>宿題は昔から自分でやれという決まりですよね。。。
本来はそうなのだが、今回は特別だ。
教官が感激してくれるようなものを作ってやったぞ。
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:???print "input number: ";
my $input = <STDIN>;
printf ("\n【照合用】 %08b", $input);
これだけでもいいかと思うんですが…
>>820の教官の問題にも問題があると思ってるのは漏れだけですか?
0902nobodyさん
2005/10/12(水) 18:37:38ID:???>>900 の回答は、>>866 の宿題に対するものだけど、
「ビット演算子を8回使う」という条件があるみたいだから、
printfの出力はあくまでも参考のみ。
0903901
2005/10/12(水) 18:55:56ID:???>>900先生のコードはすばらしいと思うのですが…
なんでこんな問題を…と少し思ったしだいです。
>>820がどんな教科書で勉強してるのかも興味ありです。
0904nobodyさん
2005/10/12(水) 19:14:52ID:???入れられてしまうので、その後に入れた順番でソートをかける
ことは不可能という認識で間違いございませんでしょうか。
0905nobodyさん
2005/10/12(水) 19:50:30ID:???ハッシュを eash/keys/values/配列コンテキスト等で読み出した
際の順序は、人間にとっては一見ランダムだが、perl 自身に
とってはランダムではないし、何回呼んでも必ず同じ順序になる。
入れた順序に関係なく、目的の値を分かり易い名前で素早く取り
出せるように作られているのが今の perl の実装なので、入れた
順序が重要なら、それに適したデータ構造 -- 配列を利用するか、
Tie::IxHash のようなラッパーを使う。
0906820
2005/10/12(水) 22:09:26ID:???すごいプログラムありがとうございます。
ですが宿題はすでに提出してしまいました。。
なので今後の参考にさせていただきます
>>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:???0909nobodyさん
2005/10/13(木) 00:17:06ID:???ご教示いただけますと幸いです。
0912909
2005/10/13(木) 00:33:27ID:???やりたいことは、QUERY_STRINGの判定に
(\W|)c=3
このようなイメージの指定をしたいのですが、ようは英数字以外が
cの前にきた場合と「?c=3」と前に何もない場合を指定したいという
ことです。
説明下手ですみません。
0916nobodyさん
2005/10/13(木) 00:42:22ID:???sleepだと5%ぐらい使ってしまってるみたいで・・・
0918909
2005/10/13(木) 00:46:02ID:???ご教示有難うございます。
ぐぐって調べてみましたが、どうやらこれは
(?<!...) ゼロ幅の否定後読み表明
みたいですね。
私には少し敷居が高そうなので、もう少し勉強してみます。
とにかく有難うございます。
0919909
2005/10/13(木) 00:52:49ID:???すみません、行き違いになりました。
なるほど、と試してみましたが、なぜか引っかからなくなって
しまいました。
調べてみます。
0921909
2005/10/13(木) 01:00:44ID:???× (^|\W)c=1
× (^)c=1
○ ^c=1
なんででしょうね。。
もう少し調べてみます。
0922766
2005/10/13(木) 01:07:08ID:???>>777
遅ればせながらレス有難うございます。
しかしながらいまだcsvへの書き込みが上手くいきません。。
やりたいのは、csv開いたときに
名前,Q1の回答,Q2の回答,Q3の回答。。。。
空欄,Q1の正解,Q2の正解,Q3の正解。。。。
と横並びにカンマ区切りで出したいのですがいろんなソースを入れてみても
上手くいきません。。泣
しかも名前を普通にFORM POSTからとりたいんだけど、どこにソース入れてもエラーになる。。
0923766
2005/10/13(木) 01:08:08ID:???【question_1cgi】
# 質問の取得
&ReadParse;
if(open(IFILE,"question_1.tsv")) {
while(<IFILE>) {
chomp();
push(@question,$_);
}
close(IFILE);
}
0924766
2005/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] = $_;
}
0925766
2005/10/13(木) 01:09:56ID:???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:???ありゃ、もしかしてPerlのバージョンが古いと動かなかったりするのかな
バージョンいくつか分かる?とりあえず5.6.1と5.8.7では動作したけど・・・
Perl4探してこよう・・・
0929909
2005/10/13(木) 01:18:14ID:???おっしゃるとおりの条件にマッチさせたいと思っております。
そしてご回答有難うございます。
ちょっと私にはもう少し理解する時間が必要になりそうですが、
一つ一つ勉強していきたいと思います。有難うございます。
>>927
v5.8.4ですので、バージョンは問題ないかと思います。
検証してみます。お手数おかけしましてすみません。
0930nobodyさん
2005/10/13(木) 01:28:27ID:???$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:???相変わらず何やってるのかわからん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:???ふう、やっとやりたいことがわかった
まず処理手順が問題。今の処理手順だと質問一つずるに対して出力処理をしようとしているけれど、
全ての質問を一つの行にまとめたいなら、保存しておいて後で出力しないと。
# 回答の表示
の頭で
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);
って感じ。
0935909
2005/10/13(木) 03:20:42ID:???すみません、色々と勉強してました。
試してみましたが、おかげさまでうまくいきました。
しかしながら私の知識がまだ追いついていないこともございますので、
これから精進していきたいと思います。
本当にご親切に有難うございました。
0936766
2005/10/13(木) 11:12:08ID:???レス有難う御座います。勉強足らずで申し訳ないです。
教えていただいたとおりにやってみますた。
でもやっぱりcsvをexcelで開いた時に思う通りになつてなかた。。なんでだろう
もうわからん。。
最終的にはexcelで開いた時
$in{name} ←これはくり返さない。1回だけ表示(下のセルへ)
$val ←これはその問題数分だけ横にくり返し。excelの横セルはひとつずつ違うセルに。(下のセルへ)
$aval ←同様。(下のセルへ)
次の人
$in{name}
$val
$aval
てなっててほしいんです。
説明へたでごめんなさい。
0937766
2005/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);
}
0938766
2005/10/13(木) 11:17:24ID:???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:???substr() は?置換もできる。
my $str = 'foobarbaz';
substr($str, 1, 2) = 'OO'; # $str is 'fOObarbaz'
0941nobodyさん
2005/10/13(木) 17:16:09ID:???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:???>>1
http://search.cpan.org/~jwied/Text-CSV_XS-0.23/CSV_XS.pm
0944942
2005/10/13(木) 22:26:57ID:NiH4hrTC英語は読めないので
http://www.perldoc.jp/docs/modules/Text-CVS_XS-0.23/Text-CVS_XS-0.23.pod
これは見ました。
ここに書いてないということは自分で<br>に変換するものでしたっけ?
よくよく考えたら別に自分でやっても大して面倒でもないレベルなのでどうでもいいですが。
"これだけかな?大丈夫なのは。
0945942
2005/10/13(木) 22:50:16ID:NiH4hrTCもういいや
0947nobodyさん
2005/10/13(木) 23:23:07ID:???0948nobodyさん
2005/10/13(木) 23:34:41ID:???ここワロタ
0949nobodyさん
2005/10/13(木) 23:40:28ID:???<⌒/ヽ-、___
/<_/____/
0950nobodyさん
2005/10/14(金) 01:39:33ID:???入れる場所そこじゃなーい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:???日本語で。
0954766
2005/10/14(金) 14:02:22ID:???レス有難う御座います。ほんとうに感謝です。
やっぱり配列の初期データ違いますよね。。。orz
この場合は何をいれたらいいんでしょうか?
$valは自分の選択した解答番号、&avalは正解解答番号
なので、これでいいとおもったんですが。。。
oreach my $k (keys %in) {
$in{$k} =~ s/\x0D?\x0A/<br>/g;
}
とか &ReadParse; の後に。。。
ていうのもどこにそのそーすいれたらいいのか
わかりません。。
0955766
2005/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] = $_;
}
0956766
2005/10/14(金) 14:06:55ID:???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);
0958nobodyさん
2005/10/15(土) 05:56:59ID:???おまい…配列(@)とスカラ($)を混同してるだろ…
初期化のところは何も入れなくて良いんだよ。中身は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
0960nobodyさん
2005/10/15(土) 14:18:15ID:???アレだと配列もスカラもハッシュも$だからなぁ。(あの仕様はどうかと思う)
0961nobodyさん
2005/10/15(土) 14:28:17ID:???どうせ $ つけるなら perl に合わせてくれてもいいのにな、とは思った。
0962nobodyさん
2005/10/15(土) 15:59:18ID:vVuUdULb改行をどうしようか悩んでます。
\nなどを見つけたら<br>にしてから書き込んで見ました。
しかし読込表示処理の法で、HTMLエスケープしてるので<br>がエスケープされてしまいました。
それで改行を<br>以外にちかんして、読み込むときにそれを<br>に戻してやろうと思いました。
で、何に置換するかで悩んでます。
いまのところ\tとかしかないかなと思ってますが、ほかにもっといいのはありますか?
0963962
2005/10/15(土) 16:19:46ID:vVuUdULbもういいや
0964nobodyさん
2005/10/15(土) 16:27:50ID:???つか最近こらえ性の無い人が多いですね。
0965nobodyさん
2005/10/15(土) 16:33:09ID:???# 回答員はこのスレべったり張り付いてるわけじゃないということをry
phpBBに習った構造なんかもありだと思うよ。[br]みたいにしておいて出力時にtr/[]/<>/
こっちのほうがちと冗長だけど汎用性はある
0966nobodyさん
2005/10/15(土) 16:51:14ID:???ちなみに俺の回答は読み込み表示処理の見直しかな。
0967nobodyさん
2005/10/15(土) 17:30:53ID:???エンティティは書き込み時に行うのが一番いいと思うなり
0968nobodyさん
2005/10/15(土) 17:31:58ID:???掲示板とはどういうものかすらわかってない池沼はスルーで。
0969nobodyさん
2005/10/15(土) 17:50:45ID:???0970nobodyさん
2005/10/15(土) 18:07:03ID:???もいいかもね。
0971nobodyさん
2005/10/15(土) 18:38:22ID:???そうすると 'hogehoge\n\\n<改行>' と書いたときに 'hogehoge\\n\\\\n\n' ってなるんだけど、
一発で '\\n' や '\\\\n' にマッチしないで '\n' だけにマッチするのって難しくない?
0972nobodyさん
2005/10/15(土) 20:53:21ID:???えっと、言ってる意味がよくわからないんだけど、コレじゃダメかな?
$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:???ここでの問答や今やってる事を全て忘れて、
入門書を一冊買って読めばいいんじゃないかな。
もしくはつきっきりで教えてくれる人でも探すとか。
今の状態だと何スレ消費しても先に進まなそうだし。
0975nobodyさん
2005/10/15(土) 23:43:09ID:???0977nobodyさん
2005/10/15(土) 23:51:09ID:???http://pc8.2ch.net/test/read.cgi/php/1105930285/
0978nobodyさん
2005/10/16(日) 00:09:56ID:???タグ内だけ処理がしたいと。
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:???サンキューです。
深い意味は無いですが、昔Perl使ってたの思い出してもう一度使おうかと思いとりあえず正規表現思い出すために自分で作った例題みたいな。
0980nobodyさん
2005/10/16(日) 18:58:16ID:???その正規表現で最初のキャプチャはこう
<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;
とかすればいいと思う
0981766
2005/10/16(日) 21:56:12ID:???わけわかってなくてほんとうにゴメンなさい。。レス有難うございます。
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
・
て縦に並んでしましまいます。。
0982766
2005/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("質問設定ファイルを読み込めませんでした。");
}
0983766
2005/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>
!;
0984766
2005/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:???0986766
2005/10/16(日) 22:25:05ID:???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:???おまいのコードのデバッグをしてやるスレじゃないよ。
問題が再現する最短のコードを載せるべし。
> 今の全ソースです。
今の全ソースなど載せるなよ。
0989766
2005/10/16(日) 22:51:45ID:???0993766
2005/10/16(日) 23:51:24ID:???何卒宜しくお願いいたします。。
0994nobodyさん
2005/10/16(日) 23:56:43ID:???がんばって勉強してください。
仕事ならなおさらです。
0995nobodyさん
2005/10/16(日) 23:59:50ID:???正直、このスレに完璧な答えが出てる。
これでわからないならもうその仕事は破棄しなさいな。
それが先方とお前の為だよ。
0996nobodyさん
2005/10/17(月) 00:15:20ID:???よもまつですな。
ヒキがいうのもなんだけど。
0997932=950=958
2005/10/17(月) 00:45:14ID:???>>766のところに上げて欲しかったんだけどな…
とりあえず次スレたててくる
0998nobodyさん
2005/10/17(月) 00:48:33ID:???ttp://pc8.2ch.net/test/read.cgi/php/1129477637/
0999nobodyさん
2005/10/17(月) 00:48:38ID:???やるぞ♪ 余裕余裕 週末家で・・・ 怒られればいいか・・・
∧∧ ∧∧ ∧∧ . .::::::::::::::::::::::::::┃:::::::::::::::::::::::::::::::::::::::::::: ∧||∧
(・∀・) ∩・∀・) (・∀・)∩..::: ∧∧:::::::::::┃:::::::::::::::::::::::::::::::::::::::::::::::::( ⌒ヽ
/ ⊃⊃ ヽ ⊃ノ /⊃ / .. :::('д` )::::::::┃::::∧ ∧::::::::::::::::::::::::::::::::::: ∪ ノ
( ( ヽ )つ〜( ヽノ ...:::と ヽ::::::::┃: ('д` )::::::( )⌒ヽ;:::::::::: ∪∪
(/(/' (/ し^ J.. ...:::⊂,,_UO〜:┃:::(∩∩ ):::::|/.|/uと )〜:::::::::::::::
まだ2日間しか 残業すれば・・・ 2chで聞けば・・・
↑
今ここら辺
1000nobodyさん
2005/10/17(月) 00:49:51ID:???Perlコーディング初心者質問スレ Part 44
http://pc8.2ch.net/test/read.cgi/php/1129477637/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。