Perl 初心者コーナー Part24
■ このスレッドは過去ログ倉庫に格納されています
0001 ◆fBgbHI04bQ
03/06/07 22:30ID:GbQKLcPE【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0161nobodyさん
03/06/11 02:09ID:???0162152
03/06/11 02:10ID:b6wCYV2Gたびたびすいません、ネタじゃなくてまじわからんです。
$fname = '名無し';
if($FORM{'mode'} eq 'enter') {
InputPage();
}
elsif($FORM{'mode'} eq 'result'){
ResultPage();
}
これだと$fnameに「名無し」がはいちゃうし・・
0163nobodyさん
03/06/11 02:14ID:???myやlocalをつけなければグローバルになるはずだから、そのままでも受け継がれるはずだけど・・・
サブルーティンを呼び出す順番は正しい?
0164nobodyさん
03/06/11 02:15ID:???入っちゃいけないの?(´・ω・`)
そういう風に自分で設定してるんだよ(´・ω・`)マジデ マジデ
$fname = $FORM{'name'};
if($FORM{'mode'} eq 'enter') {
InputPage();
}
elsif($FORM{'mode'} eq 'result'){
ResultPage();
}
これじゃだめなの?(´・ω・`)
0165nobodyさん
03/06/11 02:18ID:???0166nobodyさん
03/06/11 02:22ID:???<strong>$FORM{'name'}</strong>さん<br>
0167nobodyさん
03/06/11 02:29ID:???InputPage()とResultPage()は一度に両方とも呼ばれることはないんでしょう?
0168152
03/06/11 02:42ID:b6wCYV2G感激しております。
if($FORM{'mode'} eq 'enter') {
InputPage();
}
elsif($FORM{'mode'} eq 'result'){
ResultPage();
}
else {
EntryPage();
}
exit;
EntryPage()のフォームで読み込んだものをInputPage()で表示し、
その後、InputPage()でボタンを押すと、ResultPage()に移って表示
って感じなんです。
やっぱり表示されないです・・・
何かうまい方法ないですかねぇ
0169nobodyさん
03/06/11 02:45ID:???0170152
03/06/11 02:59ID:b6wCYV2GInputPageは入力のページですよ。
名前を表示してその下に入力フォーム
0172nobodyさん
03/06/11 03:01ID:???0173_
03/06/11 03:03ID:???0174nobodyさん
03/06/11 03:04ID:???こんな初歩的なことで躓いてるようじゃ全部晒したほうが早いわ
0176152
03/06/11 03:10ID:b6wCYV2G試しましたよー
>>172
分ける必要は無いんだけど、その方がわかりやすいかなーと思って
やっぱり、ひとつのページにまとめる事にしました。
ご迷惑をおかけしました。
考えてくださった方々ありがとうございました。
0180nobodyさん
03/06/11 03:20ID:???そのままの意味。
perlccはPerlのソースをCのソースに変換するものだから、実行可能なものにするためにはCコンパイラが必要。
一連の処理をまとめてやってくれるから(実はPerlスクリプトやバッチファイルだったりする)Perlのソースを直接実行可能な形式にしているようにみえるけど。
Windowsの場合はVC++6.0ならOKだった。他のコンパイラは試していない。
0183nobodyさん
03/06/11 03:39ID:???>perlcc hello.pl
>a.exe
Hello World.
0184nobodyさん
03/06/11 06:42ID:u2aqyjyIすみません、一つ質問させてください。
HTMLファイル内のアンカータグで指定されているURLを全てエンコードして返すコードを書きましたが、どうも思う
ように動いてくれません。問題のコードは下記となっております。
-----------------------------------------------------
while(<FH>){
if($_ =~ /\<a.*?href.*?\=.*?\>/ig){
my $tmp = $_;
while($tmp =~ /(.*\<a.*?href.*?\=)(.*?)(\>.*?)(\<|\n)/ig){
my $tmp1 = $1; my $tmp3 = $3;
my $tmp2 = main::url_encode($2);#エンコードルーチン
$tmp2 =~ s/\%20//g; $tmp2 =~ s/\%22/\"/g;
$index_file .= $tmp1 . $tmp2 . $tmp3;
}
}
else{
$index_file .= $_;
}
}
-----------------------------------------------------
1行に2つ以上のアンカータグがあった場合を考えてwhileを使用しておりますが、その部分の正規表現に問題が
あるというところまでわかっていながら、全く前進せぬまま朝になってしまいました。情けないです。
ここの正規表現の区切りとなるものが曖昧なことから、うまく認識してくれず、整形後のHTMLファイルがおかしく
なってしまっているのだと思われます。
もし宜しければ、教えてください。
すみませんが宜しくお願いいたします。
0185nobodyさん
03/06/11 07:22ID:???正規表現道場@2ch Part2
http://pc2.2ch.net/test/read.cgi/php/1038146241/432-n
このへんでグダグダやっているようだが
0186nobodyさん
03/06/11 11:58ID:???}
と、
for ($i=0;i<=$#tmp;$i++){
}
って、何が違うのでしょうか?
0187nobodyさん
03/06/11 12:20ID:???前者は@tmpの中身を順番に参照する。
後者は0から$#tmpまで$iがカウントアップしていく。
前者は数字とは限らないが、後者は確実に数字。
0188nobodyさん
03/06/11 12:47ID:???したら、
glob failed (child exited with status 127) at index.cgi line 863.
といわれてしまったのですが、
どうすればいいのでしょう?
glob関数は使ってないはずなのですが・・・
0191nobodyさん
03/06/11 16:26ID:???スマートな方法はありませんか?
今はこんなやり方をしてるんですけど…
$_="0123aa456789";
m/([a-z]+)/;
$str = $1;
0193nobodyさん
03/06/11 16:40ID:Gw/QAyIn($str) = /([a-z]+)/;
0195_
03/06/11 17:19ID:???0196194
03/06/11 18:07ID:???0198nobodyさん
03/06/11 19:14ID:???処理系依存の関数ってけっこうあるし。
0199nobodyさん
03/06/11 20:11ID:fefOLsV8送れる(どっちを表示するかはメーラーがきめる)と聞いたのですが
sendmailにどういう風に渡したらいいんでしょうか?
Content-Type: multipart/alternative;を使うらしいとこまでは
わかったんですが…
(プログラムを動かそうとしているサーバには、モジュールは入れられないみたいです)
どなたか御存じの方がいらっしゃったら、よろしくおねがいします。
0201nobodyさん
03/06/11 20:16ID:???$a = "あ";
print $b;
このとき、当然ですが「いうえお」しか表示されません。
「あいうえお」と表示したい場合はどうすればいいですか?
$aを$bの前に持ってくるというのはナシで。置換しかないですかね?
0202YUIS
03/06/11 20:28ID:oL0No0ho↓↓↓
http://www.dvd-yuis.com/
0203nobodyさん
03/06/11 20:35ID:???print eval($b);
$aや$bにコマンドを入れられてたら、かなり危険な状態になるのであまりお勧めできない。
0204_
03/06/11 20:44ID:???0205nobodyさん
03/06/11 21:02ID:OIUswXrqprint eval($b);
↑何も表示されない。
print eval{$b};
↑「いうえお」しか表示されない。
アルェー?
0206nobodyさん
03/06/11 21:09ID:???すまん。
俺の記憶違いだった。
0207nobodyさん
03/06/11 21:25ID:???$a = "あ";
print eval($b);
0209_
03/06/11 21:35ID:???0210nobodyさん
03/06/11 21:38ID:???シングルクォートじゃなくても良いけど$bの内容が「""」とか「qq!!」と文字列リテラルとしてエバれるようになってりゃいい。
0211nobodyさん
03/06/11 23:03ID:???$b ='"(split(/<>/))[0]いうえお"';
print eval($b);
だと
いうえおと表示されます。
(split(/<>/))[0]にはある文字列がはいっています。
0212nobodyさん
03/06/11 23:26ID:???evalがどういう働きをするものか勉強しなおしてください。
あなたの期待している通りにならない事がわかります。
0213188
03/06/11 23:39ID:???ありがとうございます。なるほど。
ところで、こういう場合、考えられる原因ってなんでしょうか・・・?
いちお、「tmp*」のパーミッションは666にしてます。
0215nobodyさん
03/06/12 00:07ID:???フォームから
<input type="file"〜(以下略
と言う風に入力してもらいcgiでcgi-libを使用してデコード、とまでは
できたのですが、どのようにして拡張子を取得するべきか・・・
複数のファイルをアップロードする場合、どのようにして拡張子を取得するのでしょうか?
(今現在、プログラムが手元にないのであまり詳しく状況を書けなくて申し訳ありません。)
0218君のBodyはNobody
03/06/12 01:23ID:???Webでアンケートを作成し、その結果をCSVファイルにしました。
それをWindowsマシンにダウンロードして、Excelで開くと
日本語部分が文字化けをしてしまいます。
一応、SJISコードに変換してからCSVを作成しているのですが...
やり方として、根本的なことを分かっていないがために
何か間違っているような気がします。
恐れ入りますが対処方法を教えてください。
0219sage
03/06/12 01:30ID:SEaNTt27どのようにSJISに変換している?
0220nobodyさん
03/06/12 01:31ID:???0221nobodyさん
03/06/12 01:31ID:WFfieXIn0222nobodyさん
03/06/12 01:37ID:???0223君のBodyはNobody
03/06/12 01:38ID:???こういう説明で十分なのか不安なのですが
&jcode'convert(*form,'sjis');
というようなコードを使っています。
0224nobodyさん
03/06/12 01:57ID:???ちなみに俺は素人さんです。
・腹の立つほど複雑な処理を数日考えて作りました。
・記述の量はかなり多いです。
・強引に作ったので処理はめちゃめちゃで見れた物じゃないです。
・多分半年後の自分は、解読出来ません。
・さらに、メンテしにくくバグが出たら大変そうな仕組みです。
・ついでにデータファイル(txt)の書き換えもめんどくさそうです。
しかし!
上記のダメダメな処理が出来た直後に。。。
もっと効率が良くて、見やすくて、メンテしやすくて、スマートな処理を思いつきました。
・でも、ハッキリ言って書き換えるのめんどいです。
・データ(txt)も全部書き換えです。
・データの書き換えも含むと1日では出来なさそうです。
・しかも苦労して作ったダメの処理を破棄するのは抵抗があります。
普通はそんな時どうするんですか?
ダメな処理を強引に使いますか?
プログラムは苦労するものなのだと割り切って作り直しますか?
多分、処理は使い捨てではなく、ちょくちょく直しながらそれなりに使うと思います。
・そこら辺の常識を玄人さんに聞きたいです。
0225nobodyさん
03/06/12 01:58ID:???0226nobodyさん
03/06/12 02:03ID:???0227君のBodyはNobody
03/06/12 02:15ID:???ちなみに、Print文で空のファイルに書き込みをしています。
print FILE $data;
みたいにです。
0229nobodyさん
03/06/12 02:34ID:???良いと思う処理方法が見つかったなら、ソースは書き換えるべき。
データファイルは、Perlで新しいフォーマットに書き換えるスクリプトを作ればいい。
俺は、そうしてる。
いや、そうするべき。
0230nobodyさん
03/06/12 02:49ID:???スパッと気分を変えて書き直したいと思います。
って言うか、もう始めてます。
綺麗な記述&処理のほうが後々イライラせずにすみそうだし。。。
データはperlに直接埋め込む方式に変更したので書き換えスクリプトは作れなさそうです。
まったく変な構造を持ったデータでして…。
では、ありがとうございました。
0232nobodyさん
03/06/12 03:47ID:???作ったのかい?
ま、書きかえってのはそのうちやらないといけない時がくるわな。
0233nobodyさん
03/06/12 04:07ID:???0234224,230
03/06/12 04:13ID:???実は俺、以前にもここに来た事があったりして…
モンスターデータが当初の予定より複雑になった(量も多くなった)ので他の記述との折り合いが悪く、
強引に組み込んだらぐっちゃぐちゃになってしまった次第です。
素人な俺は、なぜか強引に作ってしまいスグぐっちゃに。。。恥
0235nobodyさん
03/06/12 09:54ID:???たぶん処理系に激しく依存すると思うが、おそらくディレクトリエントリに格納されている
そのままの順番(ファイルを作った順番)ではないかと。
0236188
03/06/12 11:13ID:???>>214
「直しても」ってどういうことですか?、
unlink(<tmp*>);って直しようないかと思うのですが・・・
Perlのバージョンとプラットフォームは必ず書くこと。
そのエラーはglob()したときにシェルを子プロセスを起動したが、その子プロセスが正常終了しなかった、といっている。
何故かはそのエラーからは分からない。
File::Globも試すこと。
>>237
unlink(<...>)でも全く問題ないよ。間違った解答をするのはやめてほしい。
0239nobodyさん
03/06/12 13:16ID:???それ以外でやってみてから言え。
0241nobodyさん
03/06/12 14:32ID:???(実行されていない部分は翻訳されていない?)
それとも一旦スクリプト全体が翻訳されて実行されるんでしょうか?
require するライブラリなどはどの時点で翻訳されるんでしょうか?
(翻訳ってのは機械語に解釈って意味で使ってます)
処理の分岐がたくさんある場合にそれぞれサブルーチン化するんですが
これは外部にライブラリとして出した方がいいんでしょうか?
0242nobodyさん
03/06/12 15:57ID:F+7kv9WZverは5.xだったと思います。よろしくお願いします。
0243236
03/06/12 16:58ID:???ちょっと今そとなので、Perlのバージョンは5.*ということしかわからないのですが、
(プラットホームはコバルト)、
そういえば、lsコマンドをperlから実行できない設定になってました。
きっと、それと同じ理屈ですよね?
セキュリティポリシー的に、シェルコマンドをperlから実行できないようになってるという。
0244nobodyさん
03/06/12 17:10ID:???巨大テキストから一部分を一つのCSVとして出力しています
ieで実行するとダウンロードダイアログが開くのですが
その時ファイル名が「〜.cgi」になってしまいます
この「〜.cgi」を任意に変えられないでしょうか?
具体的には
1.getcsv.cgi にアクセス
2.ダウンロードダイアログが開く
3.ダウンロードファイル名が「data.csv」になっている
のような事がしたいのです
0246nobodyさん
03/06/12 18:50ID:???0249nobodyさん
03/06/12 19:08ID:OAyD+tHP動作させていましたが、このたびWindowsXP+ActivePerl5.6.1-635
で動作させようとしましたが、いまいち変な動作で頭を抱えています。
スクリプトはTrees↓です。
http://www.rescue.ne.jp/cgi/trees/
変というのは、一見動作はするのですが、「新しい話題」で新規書き込み
をしようとすると、
「.は削除されていますので、コメントの投稿はできません. 」
というメッセージでエラーになります。
調べてみると、1340行付近の
if ($in{'resp_number'} ne '' && -s $in{'resp_number'}==0) { &error("File Not Found","$in{'resp_number'}は削除されていますので、コメントの投稿はできません."); }
の&&の後の条件でひっかかってしまうようです。
ちなみに、新規書き込みの時には$in{'resp_number'}の中には「.」のみが入っています。
ふつーのif文なのに、linuxで動作してActivePerlでNGなのです。
0250nobodyさん
03/06/12 19:17ID:???perl -M-ops=system,open -e 'open(IN, "<hoge"); system("ls")'
man Safe
man Opcode
man ops
0253188
03/06/12 19:46ID:???Pelrのバージョンは、5.00503で、
Apache/1.3.26 (Unix) でした。
>>243で自分が言ったことで、間違いないでしょうか?
0254nobodyさん
03/06/12 20:26ID:???>>248を補足。
Perlは疑似インタプリタ言語。
実行の度にコンパイルして実行すると言う手順を踏む。
従って、先にコンパイルしておく全ての言語と比較して低速になる。
0256nobodyさん
03/06/12 20:29ID:???意味がわからない。
openもsystemも使いたくなければ使わなければいい。
もし、>>242が鯖管だったとしたら、
その程度の能力しかなくて鯖なんか扱うなとマジで忠告する。
0258nobodyさん
03/06/12 20:38ID:???読みました。
$message =~ s/\n/<br>/g;
みたいな簡単な構文じゃ無理なんですね。
私にはまだ理解できそうにないです。
■ このスレッドは過去ログ倉庫に格納されています