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

Perl 初心者コーナー Part24

■ このスレッドは過去ログ倉庫に格納されています
0001 ◆fBgbHI04bQ 03/06/07 22:30ID:GbQKLcPE
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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
0159nobodyさん03/06/11 02:04ID:???
>>156
そのif分岐の前に $fname を設定しなきゃダメだよ(´・ω・`)マジデ マジデ
0160nobodyさん03/06/11 02:07ID:???
>>158
Cコンパイラを用意しないといけないんですか・・・。

どうやってやるんですか?
0161nobodyさん03/06/11 02:09ID:???
bcc
016215203/06/11 02:10ID:b6wCYV2G
>>159
たびたびすいません、ネタじゃなくてまじわからんです。

$fname = '名無し';
if($FORM{'mode'} eq 'enter') {
InputPage();
}
elsif($FORM{'mode'} eq 'result'){
ResultPage();
}

これだと$fnameに「名無し」がはいちゃうし・・
0163nobodyさん03/06/11 02:14ID:???
>>152
myやlocalをつけなければグローバルになるはずだから、そのままでも受け継がれるはずだけど・・・
サブルーティンを呼び出す順番は正しい?
0164nobodyさん03/06/11 02:15ID:???
>>162
入っちゃいけないの?(´・ω・`)
そういう風に自分で設定してるんだよ(´・ω・`)マジデ マジデ

$fname = $FORM{'name'};
if($FORM{'mode'} eq 'enter') {
 InputPage();
}
elsif($FORM{'mode'} eq 'result'){
 ResultPage();
}

これじゃだめなの?(´・ω・`)
0165nobodyさん03/06/11 02:18ID:???
if-elsifじゃそのどちらかしか呼ばれないだろ。
0166nobodyさん03/06/11 02:22ID:???
両方ともこうやっちゃえ

<strong>$FORM{'name'}</strong>さん<br>
0167nobodyさん03/06/11 02:29ID:???
ResultPage()の中で$fname=$FORM{'name'};とやればいいと思うんだけど。
InputPage()とResultPage()は一度に両方とも呼ばれることはないんでしょう?
016815203/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:???
InputPageは確認画面なのか? Inputと名付けているから違うとは思うけど。。。
017015203/06/11 02:59ID:b6wCYV2G
>>169
InputPageは入力のページですよ。
名前を表示してその下に入力フォーム
0171nobodyさん03/06/11 03:00ID:???
>>166-167は試したのか
0172nobodyさん03/06/11 03:01ID:???
EntryPageも入力ページなんでしょう?なんで分けるの?
0173_03/06/11 03:03ID:???
http://homepage.mac.com/hiroyuki44/jaz02.html
0174nobodyさん03/06/11 03:04ID:???
うまい方法っていうよりうまくいかなくなるように書いてるからだろ
こんな初歩的なことで躓いてるようじゃ全部晒したほうが早いわ
0175nobodyさん03/06/11 03:09ID:???
>>152のInputPageは略したものだよね?まさかそのままじゃないよね?
もしそのままだったらフォームが(ry
017615203/06/11 03:10ID:b6wCYV2G
>>171
試しましたよー

>>172
分ける必要は無いんだけど、その方がわかりやすいかなーと思って

やっぱり、ひとつのページにまとめる事にしました。
ご迷惑をおかけしました。
考えてくださった方々ありがとうございました。
017715203/06/11 03:12ID:b6wCYV2G
>>174
あ、ごめんなさい、確かにその通りなんですが・・・

>>175
そりゃ略したものですよ(w
0178nobodyさん03/06/11 03:13ID:???
>>158
Cコンパイラを用意するとはどういう意味ですか?
0179nobodyさん03/06/11 03:20ID:???
>>178
関係ないから気にするな
0180nobodyさん03/06/11 03:20ID:???
>>178
そのままの意味。
perlccはPerlのソースをCのソースに変換するものだから、実行可能なものにするためにはCコンパイラが必要。
一連の処理をまとめてやってくれるから(実はPerlスクリプトやバッチファイルだったりする)Perlのソースを直接実行可能な形式にしているようにみえるけど。
Windowsの場合はVC++6.0ならOKだった。他のコンパイラは試していない。
0181nobodyさん03/06/11 03:28ID:???
>>180
VCはあります。
そのあとどうすればいいかわかりません。
0182nobodyさん03/06/11 03:30ID:???
>>181
perlccのあるディレクトリを環境変数PATHに追加してperlccを実行するだけ。
0183nobodyさん03/06/11 03:39ID:???
>vcvars32
>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:???
>>184
正規表現道場@2ch Part2
http://pc2.2ch.net/test/read.cgi/php/1038146241/432-n

このへんでグダグダやっているようだが
0186nobodyさん03/06/11 11:58ID:???
foreach (@tmp) {

}
と、
for ($i=0;i<=$#tmp;$i++){

}
って、何が違うのでしょうか?
0187nobodyさん03/06/11 12:20ID:???
>186
前者は@tmpの中身を順番に参照する。
後者は0から$#tmpまで$iがカウントアップしていく。

前者は数字とは限らないが、後者は確実に数字。
0188nobodyさん03/06/11 12:47ID:???
unlink(<tmp*>);
したら、
glob failed (child exited with status 127) at index.cgi line 863.
といわれてしまったのですが、
どうすればいいのでしょう?
glob関数は使ってないはずなのですが・・・
0189nobodyさん03/06/11 12:48ID:???
>>187
ありがとうございます。やっとわかりました(情けない
0190nobodyさん03/06/11 13:16ID:???
>>188
<tmp*> <- ファイル名glob演算子
なんでエラーになるかは知らない。
0191nobodyさん03/06/11 16:26ID:???
文字列のパターンマッチした部分を別の変数に代入する
スマートな方法はありませんか?
今はこんなやり方をしてるんですけど…

$_="0123aa456789";
m/([a-z]+)/;
$str = $1;
0192nobodyさん03/06/11 16:31ID:???
>>191
$_="0123aa456789";
s/([a-z]+)/$str = $1/e;
0193nobodyさん03/06/11 16:40ID:Gw/QAyIn
$_="0123aa456789";
($str) = /([a-z]+)/;
0194 03/06/11 17:17ID:???
perlをレンタルサーバーと同じバージョンにしたいのですが、
winの5.004_01が入手できるところをご存じないでしょうか?
0195_03/06/11 17:19ID:???
http://homepage.mac.com/hiroyuki44/hankaku05.html
019619403/06/11 18:07ID:???
自分で解決しました、失礼しました。
0197nobodyさん03/06/11 18:08ID:???
>>194
スレ違い&winの5.004_01は存在しない&同じにしても意味なし
0198nobodyさん03/06/11 19:14ID:???
Perlのバージョンよりも、OSを同じにしたほうがいいかもね。
処理系依存の関数ってけっこうあるし。
0199nobodyさん03/06/11 20:11ID:fefOLsV8
1通のメールに、普通のメールの内容とHTMLメールの内容を一緒に入れて
送れる(どっちを表示するかはメーラーがきめる)と聞いたのですが
sendmailにどういう風に渡したらいいんでしょうか?
Content-Type: multipart/alternative;を使うらしいとこまでは
わかったんですが…
(プログラムを動かそうとしているサーバには、モジュールは入れられないみたいです)

どなたか御存じの方がいらっしゃったら、よろしくおねがいします。
0200nobodyさん03/06/11 20:13ID:???
>>199
スレ違いですので、お引き取りください。
0201nobodyさん03/06/11 20:16ID:???
$b ="$aいうえお";
$a = "あ";
print $b;

このとき、当然ですが「いうえお」しか表示されません。
「あいうえお」と表示したい場合はどうすればいいですか?
$aを$bの前に持ってくるというのはナシで。置換しかないですかね?
0202YUIS03/06/11 20:28ID:oL0No0ho
「2chからきました」ってコメントに書いたら値引きしちゃうよ(^_^)v
↓↓↓
 http://www.dvd-yuis.com/
0203nobodyさん03/06/11 20:35ID:???
>201
print eval($b);

$aや$bにコマンドを入れられてたら、かなり危険な状態になるのであまりお勧めできない。
0204_03/06/11 20:44ID:???
http://homepage.mac.com/hiroyuki44/hankaku03.html
0205nobodyさん03/06/11 21:02ID:OIUswXrq
レスありがとうございます。

print eval($b);
↑何も表示されない。
print eval{$b};
↑「いうえお」しか表示されない。

アルェー?
0206nobodyさん03/06/11 21:09ID:???
>205
すまん。
俺の記憶違いだった。
0207nobodyさん03/06/11 21:25ID:???
$b ='"${a}いうえお"';
$a = "あ";
print eval($b);
0208nobodyさん03/06/11 21:33ID:OIUswXrq
>>207
できた!
シングルクォートで囲まないといけないんですね。
サンクス。

>>206さんもありがとうがざいました。
0209_03/06/11 21:35ID:???
http://homepage.mac.com/hiroyuki44/jaz04.html
0210nobodyさん03/06/11 21:38ID:???
>>208
シングルクォートじゃなくても良いけど$bの内容が「""」とか「qq!!」と文字列リテラルとしてエバれるようになってりゃいい。
0211nobodyさん03/06/11 23:03ID:???
>>201

$b ='"(split(/<>/))[0]いうえお"';
print eval($b);

だと
いうえおと表示されます。
(split(/<>/))[0]にはある文字列がはいっています。
0212nobodyさん03/06/11 23:26ID:???
>211
evalがどういう働きをするものか勉強しなおしてください。
あなたの期待している通りにならない事がわかります。
021318803/06/11 23:39ID:???
>>190
ありがとうございます。なるほど。
ところで、こういう場合、考えられる原因ってなんでしょうか・・・?
いちお、「tmp*」のパーミッションは666にしてます。
0214nobodyさん03/06/11 23:56ID:???
>>213
こういう場合って?直してもだめだったの?
0215nobodyさん03/06/12 00:07ID:???
複数の画像を一度にアップするCGIを製作しています。
フォームから
<input type="file"〜(以下略
と言う風に入力してもらいcgiでcgi-libを使用してデコード、とまでは
できたのですが、どのようにして拡張子を取得するべきか・・・

複数のファイルをアップロードする場合、どのようにして拡張子を取得するのでしょうか?
(今現在、プログラムが手元にないのであまり詳しく状況を書けなくて申し訳ありません。)
0216nobodyさん03/06/12 00:33ID:???
>>215
スレ違いですので、お引き取りください。
0217nobodyさん03/06/12 00:35ID:???
>>215
もちろんヘッダから
0218君のBodyはNobody03/06/12 01:23ID:???
すみません、初心者なんですが教えてください。

Webでアンケートを作成し、その結果をCSVファイルにしました。
それをWindowsマシンにダウンロードして、Excelで開くと
日本語部分が文字化けをしてしまいます。

一応、SJISコードに変換してからCSVを作成しているのですが...
やり方として、根本的なことを分かっていないがために
何か間違っているような気がします。

恐れ入りますが対処方法を教えてください。
0219sage03/06/12 01:30ID:SEaNTt27
>>218
どのようにSJISに変換している?
0220nobodyさん03/06/12 01:31ID:???
http://homepage.mac.com/hiroyuki44/hankaku08.html
0221nobodyさん03/06/12 01:31ID:WFfieXIn
Perlって読みにくくてやっぱ、Rubyのようがいいよ ねぇ、
0222nobodyさん03/06/12 01:37ID:???
sjis変換にperlを使ってなかったら、どこもperlの話題ではないな
0223君のBodyはNobody03/06/12 01:38ID:???
>>219
こういう説明で十分なのか不安なのですが
&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はNobody03/06/12 02:15ID:???
>>219
ちなみに、Print文で空のファイルに書き込みをしています。
print FILE $data;
みたいにです。
0228nobodyさん03/06/12 02:17ID:???
>>224
たった数日で出来るものを「かなり多い」というな。
0229nobodyさん03/06/12 02:34ID:???
>>224
良いと思う処理方法が見つかったなら、ソースは書き換えるべき。
データファイルは、Perlで新しいフォーマットに書き換えるスクリプトを作ればいい。

俺は、そうしてる。
いや、そうするべき。
0230nobodyさん03/06/12 02:49ID:???
分かりました。
スパッと気分を変えて書き直したいと思います。
って言うか、もう始めてます。
綺麗な記述&処理のほうが後々イライラせずにすみそうだし。。。

データはperlに直接埋め込む方式に変更したので書き換えスクリプトは作れなさそうです。
まったく変な構造を持ったデータでして…。

では、ありがとうございました。
0231nobodyさん03/06/12 03:08ID:???
>>230
頑張れFIGHT (^○^)//Ω\\(^○^)ドンドコドンドコ
0232nobodyさん03/06/12 03:47ID:???
スクリプトでそのスクリプトを書き換える進化型のプログラムでも
作ったのかい?

ま、書きかえってのはそのうちやらないといけない時がくるわな。
0233nobodyさん03/06/12 04:07ID:???
readdirで読み取ったファイルやディレクトリはどういう順番の配列になるんですか?
0234224,23003/06/12 04:13ID:???
いえ、RPGです。
実は俺、以前にもここに来た事があったりして…

モンスターデータが当初の予定より複雑になった(量も多くなった)ので他の記述との折り合いが悪く、
強引に組み込んだらぐっちゃぐちゃになってしまった次第です。

素人な俺は、なぜか強引に作ってしまいスグぐっちゃに。。。恥

0235nobodyさん03/06/12 09:54ID:???
>>233
たぶん処理系に激しく依存すると思うが、おそらくディレクトリエントリに格納されている
そのままの順番(ファイルを作った順番)ではないかと。
023618803/06/12 11:13ID:???
私は>>188( = >>213 )ですが、

>>214
「直しても」ってどういうことですか?、
unlink(<tmp*>);って直しようないかと思うのですが・・・
0237nobodyさん03/06/12 11:49ID:???
>>236
( )はいらないだろ。>>190が答えてくれてるじゃないか。
unlink <tmp*>;
0238 ◆hMJAPH9PWA 03/06/12 13:09ID:???
>>236
Perlのバージョンとプラットフォームは必ず書くこと。
そのエラーはglob()したときにシェルを子プロセスを起動したが、その子プロセスが正常終了しなかった、といっている。
何故かはそのエラーからは分からない。
File::Globも試すこと。

>>237
unlink(<...>)でも全く問題ないよ。間違った解答をするのはやめてほしい。
0239nobodyさん03/06/12 13:16ID:???
どのPerlのバージョンとプラットフォームでやって問題なかったか必ず書くこと。
それ以外でやってみてから言え。
0240nobodyさん03/06/12 13:34ID:???
>>235
ありがとうございます。
0241nobodyさん03/06/12 14:32ID:???
Perlは実行される命令毎に翻訳されるんでしょうか?
(実行されていない部分は翻訳されていない?)
それとも一旦スクリプト全体が翻訳されて実行されるんでしょうか?
require するライブラリなどはどの時点で翻訳されるんでしょうか?
(翻訳ってのは機械語に解釈って意味で使ってます)

処理の分岐がたくさんある場合にそれぞれサブルーチン化するんですが
これは外部にライブラリとして出した方がいいんでしょうか?
0242nobodyさん03/06/12 15:57ID:F+7kv9WZ
perlでSystem関数とOpen関数を実行させたくないのですが、どうすればいいでしょうか。
verは5.xだったと思います。よろしくお願いします。
024323603/06/12 16:58ID:???
>>238

ちょっと今そとなので、Perlのバージョンは5.*ということしかわからないのですが、
(プラットホームはコバルト)、
そういえば、lsコマンドをperlから実行できない設定になってました。
きっと、それと同じ理屈ですよね?
セキュリティポリシー的に、シェルコマンドをperlから実行できないようになってるという。
0244nobodyさん03/06/12 17:10ID:???
簡単なダウンロードCGIを作成しています。
巨大テキストから一部分を一つのCSVとして出力しています

ieで実行するとダウンロードダイアログが開くのですが
その時ファイル名が「〜.cgi」になってしまいます
この「〜.cgi」を任意に変えられないでしょうか?

具体的には
1.getcsv.cgi にアクセス
2.ダウンロードダイアログが開く
3.ダウンロードファイル名が「data.csv」になっている

のような事がしたいのです
0245nobodyさん03/06/12 18:13ID:???
>>244
スレ違いですので、お引き取りください。
0246nobodyさん03/06/12 18:50ID:???
掲示板に書き込まれたメッセージ内のURLに自動的にリンクを張るのはどういう構文を追加したらいいんでしょうか?
0247nobodyさん03/06/12 18:51ID:???
>>246
Perlメモ嫁
0248nobodyさん03/06/12 19:00ID:???
>>241
Perlは最初に全部を構文解析して、実行する。

useとrequireの違いでも調べてみればいいかな。
0249nobodyさん03/06/12 19:08ID:OAyD+tHP
レスキューさんの掲示板スクリプトを今までLinuxで
動作させていましたが、このたび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:???
>>242
perl -M-ops=system,open -e 'open(IN, "<hoge"); system("ls")'

man Safe
man Opcode
man ops
0251nobodyさん03/06/12 19:23ID:???
>>249
ディレクトリを-sでチェックしてるから。 しかし、レスキューってへぼだなぁ。
0252nobodyさん03/06/12 19:40ID:???
>>244
ヘッダーで変える
025318803/06/12 19:46ID:???
>>188 ですが、
Pelrのバージョンは、5.00503で、
Apache/1.3.26 (Unix) でした。

>>243で自分が言ったことで、間違いないでしょうか?
0254nobodyさん03/06/12 20:26ID:???
>>241

>>248を補足。
Perlは疑似インタプリタ言語。
実行の度にコンパイルして実行すると言う手順を踏む。
従って、先にコンパイルしておく全ての言語と比較して低速になる。
0255nobodyさん03/06/12 20:28ID:???
>>253
「間違いない」と誰かに言ってもらわないと納得できないと。
0256nobodyさん03/06/12 20:29ID:???
>>242
意味がわからない。
openもsystemも使いたくなければ使わなければいい。

もし、>>242が鯖管だったとしたら、
その程度の能力しかなくて鯖なんか扱うなとマジで忠告する。
0257nobodyさん03/06/12 20:30ID:???
>>253
鯖の設定が怪しいのだと思ったら、その鯖の管理人に聞け。
ここで聞くことじゃあないだろ。
0258nobodyさん03/06/12 20:38ID:???
>>247
読みました。
$message =~ s/\n/<br>/g;
みたいな簡単な構文じゃ無理なんですね。
私にはまだ理解できそうにないです。
■ このスレッドは過去ログ倉庫に格納されています