Perlコーディング初心者質問スレ Part 43
■ このスレッドは過去ログ倉庫に格納されています
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:???■ このスレッドは過去ログ倉庫に格納されています