【Perl】初心者コーナー Part19
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/01/11 13:52ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
あとは>>2-10にまかせた。
0698nobodyさん
03/01/30 07:02ID:???として、$bufferと比較してみては
if($tmp eq $buffer){print "OK<br>";}
else{print "NG<br>";}
0700nobodyさん
03/01/30 14:28ID:NtdcRjvu変数名とかハッシュ名を変数で与えることって出来るんでしょうか?
for($i=0;$i<=$#avs;$i++) {
if ($avs[$i] =~ /^###(.+)_PROCESSING$/) {
$process_id = $1;
$process_id2 = "\L$process_id\E";
$avs[$i] = "${$process_id}{${$process_id2}}\n";
}
}
みたいな感じで、
###DEDOT_PROCESSING っていう行を、
$DEDOT{$dedot} で置き換えたいんですが、うまくいかないです。
何か根本的に勘違いしてますでしょうか?
jperl 5.005 です。
0701nobodyさん
03/01/30 14:45ID:???0702700
03/01/30 18:34ID:tRX1dMh1それだと $DEDOT{$dedot} っていう「文字列」にしかならんのでは...
私の書き方もアレでしたが、%DEDOT の $dedot の値で置き換えたいわけで....
0703679
03/01/30 18:46ID:???lengthで$bufferを調べてみたところ、
"./hoge.dat"だから10でなければいけないのに16になっていました。
chompを使ってみたのですが値は変わらなかったので、substrで1文字目を削ってみると
"2E/hoge.dat"という値が返ってきました。もしかしたらと思い4文字目までを削ると
"2Fhoge.dat"が、11文字目までを削ると"2Edat"が返ってきました。
どうも"."は"\2E"、"/"は"\2F"としてFLASHから送られていたようです(最初の文字が\かどうかは分かりませんが…)。
結局FLASHからは"hoge"だけを送り、CGIで
$buffer = "./$buffer.dat";
とすることで正常にファイルを読み込むことが出来ました。
本当にどうもありがとうございました。
0704nobodyさん
03/01/30 20:53ID:XHYONXXPCGIで行ってる処理が重すぎて処理が終わるまでに
ブラウザがタイムアウトしてしまいます。
そのためブラウザがタイムアウトしないように、
CGIで処理をしている間、ブラウザに30秒に1回データを送るとか
そんな方法でブラウザがタイムアウトするのを防げないですか?
0706nobodyさん
03/01/30 21:01ID:???処理が重いところってsystem関数でOSのコマンドを実行してて、
この1回のsystem関数を実行してる間にブラウザがタイムアウトするんです。
で、system関数でOSコマンド動かしながら同時にブラウザにデータ送れますか?
わかんないね!
0708nobodyさん
03/01/30 23:30ID:???$hashname="myhash";
$keyval="key1";
%myhash=( key1=>"key1value",);
$val = "${$hashname}{$keyval}\n";
print ":$val";
で
:key1val
と表示されたがこれじゃダメなのか?
0709nobodyさん
03/01/30 23:54ID:???シンボリックリファレンスを使いたいっていうことだね。
まず、これを理解しろ。
$a = 'DEDOT';
${$a}{key} = 1;
print $DEDOT{key};
で、本題に戻ると、$dedotが正体不明なんだけど、
$avs[$i] =~ s/^###(.+)_PROCESSING$/${$1}{lc $1}/;
もしかしてこうしたいとか?激しく意味不明だけど
0710nobodyさん
03/01/30 23:56ID:???それより気になるのがその処理内容なんだが……。
1つのハッシュに1つのキーしか入れないのでは、ハッシュの意味がないと思うんだけど。
あくまで例としてなら別にいいんだが、そうじゃないなら処理内容を見直したほうがいいかもよ。
日本語訳も記録して、日英かかわらず全ての投稿を母国語で閲覧でき、コミュニ
ケートできる、というような感じのものです。
で、掲示板スクリプト自体は簡単にできるのですが、やはり翻訳がネックとなって
います。自分で翻訳ソフト用意して、高価なサーバーをレンタルしたり、自宅で
専用線でサーバー立てたりすると、かなりの金額がかかってしまうと思うのです
(非商用の個人サイト運営程度には)。
できれば、オンラインの翻訳サービスを自分のスクリプト内で利用したいのですが、
個人で翻訳機能だけレンタルすると幾らくらいかかるんでしょう? 無料でウェブ
翻訳、テキスト翻訳を公開しているところもありますが、そういう用途に
使うのは断り書きを出してもやはり不味いですかね?
0712nobodyさん
03/01/31 06:28ID:/ObcG1bj全然Perlと関係ないじゃん。
AMIKAIが翻訳サービスOEMの老舗だけど相当高そうだね。
自分で翻訳ソフト買ってもサーバとして使うにはライセンス料が
えらく高くなる。
結局のところ掲示板を見てもらうときにexcite翻訳を通して見てもらう
しかないのでは?掲示板に入る時にexcite翻訳へのリンクを作るとか。
自作CGIで勝手にexcite翻訳を使って翻訳することも可能だけど、
exciteの広告が表示されない利用方法は問題があるからやめた方がいい。
0713nobodyさん
03/01/31 07:08ID:6uKSmBl3★こんなサイト見つけました★
すいません。掲示板自体はperlで作っていたもので。
私の方では無論、広告やそのサイトのバナーを掲示板に表示させることは
まったく構わないのですが、向こうの方でそういう利用法を了承するかは、
やはり難かしいですかね。
翻訳は、例えばフリーのテキスト翻訳サービスを利用すると、form getを
使ってurlに投稿文を含ませたのを送って(trans.cgi?text=$body&lang=....)、
帰って来た翻訳をまたPERLで処理して出力する、という感じです。
単なる個人サイトなので、値段が年1万円を超えるようだと少し辛いです…
好きな様に利用できる本当にフリーの翻訳サイトは何処かに無いでしょうかね。
企業が無料公開しているようなのではなくて、教育機関や個人がGNUライセンスで
作ったような…
0715nobodyさん
03/01/31 07:58ID:0xsv6W8Z↑
これってアリ?
0716nobodyさん
03/01/31 08:00ID:/ObcG1bjhttp://www.excite.co.jp/world/agreement/
他のサービスでもたぶん同じ規約でしょう。
韓日混在の掲示板というのは見たことあるから、英日混在っていいうのも
探せばあるかも。そこがどういうやり方でやっているか。
技術的には易しいけど、翻訳サービスを安く利用するというのが難しそう。
0717712
03/01/31 08:05ID:???>本サービスによる翻訳結果を公表、引用、改変等により使用する
>ことはできません。
勿論、「営利目的」ではないですが、個人サイトの掲示板で使用するというのは
「私的利用」の範囲を超えるのか…個人利用する分にはCDコピーはいい(?)けど、
Napsterとかで公開するのはまずい、という感じに近いのか…。
0718712
03/01/31 08:29ID:???あ、スタンフォード大学にもありますね。
教育機関だし、どんなもんかな、、、
0720nobodyさん
03/01/31 10:13ID:NKGtpjno&を&に変換したいんですよ。
でもそうすると、♥とわざわざ入力したときに
&hearts;となってしまいハートとかを出せなくなってしまう。
どういう変換方法にすれば、
&→&
>→>
<→<
♥→♥(変換されない)
こういういい感じになるんでしょうか?
ちなみに2ちゃんはどうなってるんのかわかりますか?
よろしくお願いします。
0723nobodyさん
03/01/31 10:21ID:???0724720
03/01/31 10:31ID:???あまりにスマートな回答に感動しました。
私はまだまだ修行がたりないようです。
またどうしてもわからなくなったら相談させてください。
0726nobodyさん
03/01/31 10:46ID:???2chの特殊文字変換に翻弄されまくっている私。
0727nobodyさん
03/01/31 11:16ID:5ww5eJFmhttp://www.salut.ne.jp/bf/wmh/seminar/c010/index.php3
この
http://www.salut.ne.jp/bf/wmh/seminar/c010/enquetesys.txt
このプログラムを動かしたのだが、シンタックスえらーがでて困ってます。
0728720
03/01/31 11:17ID:???じゃぁつまり、
$value =~ s/&[^([a-zA-Z].;)]/&/g;
でOKですか?
セミコロンはエスケープしなくていいんですよね?
聞く前にとりあえず試してみます。
0729720
03/01/31 12:10ID:???動きません。
これでは
$value =~ s/&[^([a-zA-Z].;)]/&/g;
エラーになります
&^([a-zA-Z].;)
だとエラーになりませんが変換されないし・・・
さっぱりです。
0730720
03/01/31 12:12ID:NKGtpjno$value =~ s/&(?![\#0-9a-zA-Z]+;?)/&/g;
でどぉだ?
$value =~ s/&(?![\#0-9a-zA-Z]+;?)/&/g;
エスケープ忘れスマソ
冒頭でour ($aaa,$bbb)って感じで大量に
global variablesを列記してるのですけど、
これってやる意味あるのでしょうか?
書かなくてもStrict外せばscript自体は動くのですが。
0734720
03/01/31 12:37ID:???完璧です。泣ける。
すでに私には理解できない正規表現になっちゃってますが・・・。
勉強してきます。
ついでに、こういうときって、不明な実体参照をいれても
もちろんそのままになりますよね。
これは掲示板の仕様として正しいのでしょうか?
それともちゃんとした実体参照なのかどうかのチェックをいれてあげる
べきなのでしょうか。
ちょっとスレ違い気味の質問かも。
「data」に書きこむ際に「http://〜」の文字を送ると「http//〜」のように「:」が抜けて
「data」に書きこまれるんですがなんでかわかりません。どうしてでしょう?
0740nobodyさん
03/01/31 14:14ID:???そもそも "data" って何だ?ファイル名か?ファイルハンドルか?
ファイルハンドルは大文字使ったほうがいいぞ。
ただし DATA ファイルハンドルは予約されてるから注意な。
とりあえずソース晒せ。
0741nobodyさん
03/01/31 14:20ID:???0742nobodyさん
03/01/31 14:27ID:Q0yPIF7uMy Documentsのようにスペースの入ったフォルダのなかまでglobでファイル一覧を得ることはできないのでしょうか?
なるべくならワークディレクトリを移動せずに相対パスで指定したいのですが。
print glob("dc\\My Documents\\*");
0744nobodyさん
03/01/31 14:48ID:???やってみましたが、WinMEなのでプロパティにはDOS形式のファイル名が表記されていませんでした。
あと、深いディレクトリまで自動探索していくバックアップ系ツール(のヘタレ品)なので、globで得たディレクトリ名を自動的にDOS形式のファイル名に変換するというのも漏れの技術では少々難ありです…
なんでか、ロングファイル名でglobに引っかかるんですよね。
0746744
03/01/31 14:56ID:???globでdirコマンドのオプションが使えるということでしょうか?
dir /? してみたところ、 /p w a o s b l v 4 の各オプションがあるようですが、旧ファイル名で表示するオプションは見当たりませんでした…。
0747nobodyさん
03/01/31 14:56ID:6uKSmBl3★こんなサイト見つけました★
ああ、つまりglobal関数は極力控える方が良いコーディングになる
ということなんですかね。
0749nobodyさん
03/01/31 15:03ID:???globじゃなくて、readdirでディレクトリ内を取得してみたら?
これでディレクトリを移動する処理を組んだけど、スペース入りディレクトリも
ちゃんと辿っていけたよ。
0750744
03/01/31 15:05ID:???さっそく試してみます。ありが沌でした!
0751nobodyさん
03/01/31 20:42ID:???すべて変換して実態参照を無効化する。必要なものは元に戻す。ってすればいい。
つまり、
s/</</g;
s/>/>/g;
s/&/&/g;
s/♥/♥/g;
&hearts(セミコロンを忘れたもの)は無効なものとして処理しておけばいいじゃろう。
0753nobodyさん
03/01/31 21:09ID:???そのぐらい工夫してよ。。
一番簡単で安全だと思ったから書いたんだけどー、
自分では分からなかったから悔しいのかな?
$text =~ s/</</g;
$text =~ s/>/>/g;
$text =~ s/&/&/g;
@allow = qw(hearts ... ...);
foreach my $str (@allow) {
$text =~ s/&$str;/&$str;/;
}
0755nobodyさん
03/01/31 21:27ID:???0756727
03/01/31 21:49ID:5ww5eJFm&ReadPlarse(*form);
require 'jcode.pl';
&jcode'convert(*form,'sjis');
$data = $form{'name'}\n$form{'mail'}$form{'sex'}\n$form{'ryori'}\n$form{'message'}\n\n
open(ENQ, ">>$enqdata.dat")||do{print "ERR";exit;};
#flock(ENQ, 2);
print ENQ $data;
#flock(ENQ, 8);
close(ENQ);
print "Content-type:text/html\n\n";
print >> "END_OF_HTML";
<HTML>
<HEAD>
<TITEL>有難う御座いました</TITLE>
</HEAD>
<BODY>
アンケートは送信されました!<BR>
またのお越しをお待ちしています
</BODY>
</HTML>
END_OF_HTML
これを動かしたらシンタックスえらーがでたけどなんで?
公開されているプログラムなのに。
http://www.salut.ne.jp/bf/wmh/seminar/c010/index.php3
0757nobodyさん
03/01/31 22:14ID:1gqujj9yまたおまえか。馬鹿かお前は。
エラーが出たんならどんなエラーがさらさんとわからんだろうが。
本気で答えて欲しいのならそれなりの情報を出せこの厨房が。
0758nobodyさん
03/01/31 22:17ID:???確か、&はいっさいCGI側で変換しない方がいいよ、
っていう文章を読んだことがある気がしたんだけどソース失念。
もし<r;のように封じたい文字参照があれば
狙い打ちでエスケープすれば済むし。
0759not754
03/01/31 22:25ID:???my %refchr = qw(hearts & clubs & diams & spades &);
$text =~ s/&(\w+?);/($refchr{$1} or '&')."$1;"/ge;
もちっとマシな書き方があるかも。
>>756
エラーをコピペ。
500 Inter(略は無意味だからね。
0760751
03/01/31 22:37ID:???有効だと思うんだけどなぁー
>>759
&aaaaaみたいなものの&がそのまま残る可能性があるから、ブラウザに拡大解釈
される可能性が残るので良くない。
これに対処しようとすると、その方法だと異常にやることが増えて、>>751に書いた(変だけど)
単純な置換の方が圧倒的に速くなる、はず。
0761759
03/01/31 22:49ID:???あちらを立てればこちらが立たず。
0762nobodyさん
03/01/31 23:32ID:???s/&(?!(?:amp|#(?:[Xx][0-9A-Fa-f]+|[0-9]+));)/&/g;
s/"/"/g;
s/</</g;
s/>/>/g;
# 便利
s/&(?!#(?:[Xx][0-9A-Fa-f]+|[0-9]+);)/&/g;
s/&(?:amp;)([0-9A-Za-z]+;)/&$1/g;
s/"/"/g;
s/</</g;
s/>/>/g;
0763nobodyさん
03/01/31 23:34ID:???# 安全
s/&(?!(?:amp|#(?:[Xx][0-9A-Fa-f]+|[0-9]+));)/&amp;/g;
s/"/&quot;/g;
s/</&lt;/g;
s/>/&gt;/g;
# 便利
s/&(?!#(?:[Xx][0-9A-Fa-f]+|[0-9]+);)/&amp;/g;
s/&(?:amp;)([0-9A-Za-z]+;)/&$1/g;
s/"/&quot;/g;
s/</&lt;/g;
s/>/&gt;/g;
0764nobodyさん
03/02/01 01:11ID:PH6PPkmG俺今までInternalServerErrorがでると1行1行チェックしてた・・・・
誰かアホな俺に教えてくれ。。
0765nobodyさん
03/02/01 01:21ID:???スクリプトの記述ミス発見したところだけ
これ以上はしらん。後は自分で探してくれ。
誤:&ReadPlarse(*form);
正:&ReadParse(*form);
誤:print >> "END_OF_HTML";
正:print <<"END_OF_HTML";
0766nobodyさん
03/02/01 01:33ID:???http://www.harukaze.net/~mishima/perl/cgi-debug-env/deb-tech.html
でも、ディレクトリ構造がばれるのでこあいです(w
♪なんだか & 処理が加熱しているねぇ、、、
そこまで何にも考えていなかった、、、スマソ
0768764
03/02/01 01:49ID:ofCxo2eiありがと〜
0769nobodyさん
03/02/01 02:27ID:???0770nobodyさん
03/02/01 11:59ID:E95fdX8sサブルーチンがなんたらかんたらと出ます。
なんでかな?
Subroutine main redefined at /usr/local/apache/perl/main.cgi line 16 (#1)
(W redefine) You redefined a subroutine. To suppress this warning, say
{
no warnings;
eval "sub name { ... }";
}
0771nobodyさん
03/02/01 12:16ID:0/Z0vaJ7http://pakopako.misty.ne.jp/enter.cgi?id=fdeai
0774nobodyさん
03/02/01 12:27ID:E95fdX8sやだ。
>>773
それはないです。
perl -c で実行してもOK。
CGIで起動した時もOK。
mod_perl環境の時にだけエラーでる。
0775nobodyさん
03/02/01 12:27ID:???やだ。
>>773
それはないです。
perl -c で実行してもOK。
CGIで起動した時もOK。
mod_perl環境の時にだけエラーでる。
0776nobodyさん
03/02/01 12:33ID:???0777nobodyさん
03/02/01 13:00ID:???0778nobodyさん
03/02/01 15:48ID:???$|=1;
としてバッファを・・・・
とか言われるのですが
そもそもバッファとはなんぞや?
と初心者の私は疑問をもつわけで・・
その辺をうまく説明していただけないでしょうか?
0779nobodyさん
03/02/01 15:51ID:???ダムだよ。ダム。
ちょろちょろとしか来ないデータをある程度貯めておいて一気に取り出したり、
速い流れを取りあえずせき止めておいて自分のペースでゆっくり処理したり。
そう言うことに使う入れ物だ。
0780nobodyさん
03/02/01 16:26ID:???「おーい、ちょっと倉庫からこけし100本持ってきてくれ。あ、一度に渡すのは1本でいいから」
倉庫に行って1本持って戻ってきて渡す。これを100回繰り返す。(バッファなし)
一旦倉庫から100本まとめて近くの机の上に持ってきて、そこから1本ずつ手渡す。(バッファあり)
この「近くの机の上」に相当するのがバッファ。
0781778
03/02/01 16:47ID:???プログラムを組む上で
バッファありとなしとでなんか変わりますか?
たとえばsysread()とread()で、
結局読み出すんなら一緒だと初心者の私は思ふ。
そこらへんプログラムを書く人はどのように
使い分ける必要があるんだろ?
0782nobodyさん
03/02/01 16:56ID:???こういうことに気をつけることをせずにプログラムを組んでいくと
いずれ、「遅いぜっ!ヴァニラアイス!」
という感じで、体中を串刺しにされる運命を辿ることになる。
0783nobodyさん
03/02/01 17:00ID:???速度が全然違うよ。
バッファなしなんて遅すぎて使い物にならない。
……っていうのは、8ビット時代のお話。
Perlの場合、既にプラットフォーム上(UNIXなりWinなり)でバッファリングしてくれて
いるので、Perl自身がバッファリングしなくてもそれほど体感的な差はないと思う。
でも、バッファの考え方自体は覚えておいたほうがいいと思うよ。
ファイルを一旦リストに読み込んで処理…なんてのもバッファ的なやり方だし。
0785nobodyさん
03/02/01 17:24ID:???しかたないからunbufferedにしちゃっているけど。
0786nobodyさん
03/02/01 17:56ID:???0787nobodyさん
03/02/01 18:17ID:???私も知りませんでした。
>>786
FileHandleモジュールで、いいでしょうか。
調べたところIO::Handle由来の機能っぽいですね。
(FileHandleのドキュメントに無かった…)
旧来の書き方なら flush FH; とかですか。
0788nobodyさん
03/02/01 18:49ID:???でも最近のFileHandleはIO::Fileを使うようになってるから、FileHandleでも使えるかも。
0792nobodyさん
03/02/01 21:32ID:DN2rKwgG掲示板スクリプトを自鯖にUPしたところ、bbs.cgiが表示されません。
真っ白です。なぜでしょうか?
ちなみに、管理モードに入るためのパスとログイン名入力のページは表示されます。
しかし、そこから、bbs.cgiに行っても、やはり真っ白です。
0793nobodyさん
03/02/01 21:40ID:???それにスレ違い。
ここはPerlのコーディングについてのスレッド。
0795nobodyさん
03/02/01 21:47ID:DN2rKwgGうっせぇぼけ。仕立てにでりゃ調子こいてんじゃねぇぞ。
答えれないだけだろ低スキル野郎。てめぇはチンカスほじって寝てろや。
0796nobodyさん
03/02/01 21:47ID:DN2rKwgG違げえよばーか。
■ このスレッドは過去ログ倉庫に格納されています