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

Perl コーディング初心者質問コーナー Part37

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/08/22 01:41ID:???
Perlのコーディングで困ってる人のスレです。
誰もが最初は初心者。
だからって、初心者に甘んじた質問の仕方は意味がないよ。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
047745704/09/15 12:29:12ID:OFkP/WKY
現在perl/cgi入門書は一冊読み終えてる段階です。
スレ違いかも知れませんが、CGI::Sessionを勉強したいのですが、
いくら検索しても簡単な解説でどこで入手出来るか解らないサイトしかなく、
具体的に丁寧に解説してある書籍・サイトとかありますか?


CGI session perl クエリ 等で検索してもなかなか見つからなく、
Amazonで検索してもCGI Session だとヒットしないので・・・。

なんとか下記のサイトを見つけましたがCGIセッションに関する記述が少なくて・・・
ttp://digit.que.ne.jp/work/index.cgi?Perl%A5%E2%A5%B8%A5%E5%A1%BC%A5%EB%2FWalrus%3A%3ASession%3A%3ALite

ただ単純にURLのクエリ文字列?にIDやパスワードが表示されないようにしたいだけなのですが、、難しいもんですね
ページ上のリンク(かなりありますが)を全てフォームボタンでPOSTで送信するように作成した方がいいのでしょうか?
0478nobodyさん04/09/15 12:59:29ID:???
>>450
>今の時代にcgi-lib.plかよ
CGI.pmの方が処理が重い。utf8,16なんぞも入ってるからな。
cgi-lib.plで済むところでは、あえてCGI.pmを避けるのがプロ。
0479nobodyさん04/09/15 13:05:06ID:???
>>462
kent-webのcosmoでも参考にし(使っ)たら。
0480nobodyさん04/09/15 13:08:39ID:???
>>477
CGI::Session説明してるサイトが見つからないだと?
試しにCGI::Sessionでググったらトップにきましたが。
それ見てわからないんだったら入門書見直した方がいい。
048145704/09/15 13:25:08ID:OFkP/WKY
>>480
そういうページは既に見ました。
どういう仕組みかは書いてありますが、
具体的にどこで入手したりとかそういった方法も解らなくて、
perl/cgi入門書にも載ってなくて、CGIセッションの本があるなら是非買いたいのですが、
Amazonで検索しても見つからないので途方に暮れているのです。

気に障ったようですいません。
0482nobodyさん04/09/15 13:33:59ID:???
>>481
乾杯
048345704/09/15 13:36:33ID:OFkP/WKY
>>479

そのソフトも試してみましたが、
やはり認証後ページからリンクをクリックするとIDとPASSがURLに追加され
表示されてしまいます。


段々、スレ違いになってきているようなので退散します。
すいませんでした
0484nobodyさん04/09/15 13:51:16ID:???
>>481
>>5
http://search.cpan.org/~sherzodr/CGI-Session-3.95/
0485nobodyさん04/09/15 13:53:46ID:???
具体的な方法ってただコピペしたいだけちゃうんかと
0486nobodyさん04/09/15 14:47:11ID:???
>>478
それでも普通CGI::Liteつかうべ、
Perl4しか使えない環境ならともかく
0487nobodyさん04/09/15 14:48:05ID:???
>>486
CGI::Minimalもあるよ
0488※ ◆r7Y88Tobf2 04/09/15 15:54:43ID:???
どうしてもログの頭に半角スペースが入ってしまいます。
どうすればスペースが開かないようにできますか?
0489nobodyさん04/09/15 16:02:16ID:???
>>488知らん。
本当に解決したいのなら情報を小出しするな。
0490nobodyさん04/09/15 16:45:14ID:???
>>488
print "@arr";
 ↓
print @arr;
0491nobodyさん04/09/15 16:45:21ID:???
>>488=教えてクン
0492nobodyさん04/09/15 17:25:34ID:???
まぁ、質問スレだから教えて君だろw
0493nobodyさん04/09/15 17:26:58ID:???
それでも>>1くらいは読んでほしい思う
0494nobodyさん04/09/15 17:27:05ID:???
>>490
ソース出てないのになんで解ったんだ?
0495nobodyさん04/09/15 17:49:10ID:???
ありがちなミスだからじゃね
0496nobodyさん04/09/15 19:19:54ID:???
先生!質問です
datファイルの5行目をいきなり(1から4行目は読ませず)変数に読み込ませるにはどうしたらいいですか?seek関数では無理ですか?

datファイルの例

[0001](\n)
04/09/15(\n)
Name(\n)
http://www.〜〜(\n)
〜@〜.co.jp(\n)
Pass(\n)
IP(\n)
……
0497nobodyさん04/09/15 19:58:31ID:???
>>496
ttp://iis1.cps.unizar.es/Oreilly/perl/cookbook/ch08_09.htm
0498nobodyさん04/09/15 22:38:03ID:???
>>490
>>494
ログの「頭」だから違うんじゃないかなあ。($arr[0] eq ''ってオチはあるかもしれんが)
0499nobodyさん04/09/15 22:57:27ID:???
>>498
どうせ1行目だけ開いてないことになんか気付いてないよ
050050004/09/16 07:33:57ID:???
SSIで呼び出す #exec cmd は perlの場合 require で出来たんですけど、
他の #exec cgi と #include virtual は何を使えば実行してくれるのでしょうか?
0501nobodyさん04/09/16 08:35:14ID:???
>>500
何言ってるかわからんぞ。
SSIとかCGIなどは、httpdサーバ(たぶんApache)の設定で実行できるか
どうかが決まる。
それと#exec cmd とか、#exec cgi とか、 #include virtualって何だ?
#はコメント記号だが。Perlスクリプトに何て書いたか書いてみろ。
050250004/09/16 09:10:41ID:???
分かりにくくてすいません…

ssiのコマンド exec 引数 cmd を perl で実行するには require で出来ますよね?
ssiの他の、#exec cgi や #include virtual は perl ではどうやって呼び出したら実行してくれるのか。と言う事です。
050350004/09/16 09:16:23ID:???
と言うか全体的に考え方間違ってたらすいません(汗
0504nobodyさん04/09/16 11:05:43ID:???
>>502
近いものを選ぶとこんな感じになるのかな。
<!--#exec cmd="test.pl"--> →require
<!--#exec cgi="cgi-bin/test.cgi"--> →socket
<!--#include virtual="test.txt"--> →open
0505nobodyさん04/09/16 11:06:40ID:kf2OMroI
cgiを呼び出す時に"**.cgi?keyword"として
渡した"keyword"を受け取ったcgiのほうで
変数に入れる方法が知りたいのですが・・・。
よければその方法(?で何か渡す)を何と呼ぶのか
キーワードだけでも教えてもらえれば調べます、
初歩的ですいません。よろしくおねがいします。
0506505 04/09/16 11:15:26ID:???
ごめんなさい
調べたら出てきました、「引数」ですね
ほんとすいません・・・・
ttp://tohoho.wakusei.ne.jp/wwwcgi3.htm
0507nobodyさん04/09/16 12:04:04ID:???
>>505
キーワードは「クエリ メソッド」
GETの場合既に$ENV{'QUERY_STRING'}に"keyword"が入ってる
0508nobodyさん04/09/16 12:22:47ID:???
>>505
ってか、面倒だからCGIモジュール使いなYO
050950004/09/16 14:35:39ID:???
>>504 さんありがとうございます。
ただ socket を使った事が無くて検索してみましたけど、意味もあんまり分からなかったです。
どう記述したら良いのでしょうか?
読み込むファイルによって異なる記述になるんでしょうか?
0510505 04/09/16 14:52:29ID:???
>>507
ありがPございます。
またクエリだヽ(`Д´)ノ
0511nobodyさん04/09/16 14:52:41ID:???
>>509
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
051250004/09/16 15:15:35ID:???
今までssiで <!--#exec cgi="../xx/xx.cgi"--> と呼び出していたのを、perl内で作動させたいんです。

require '../xx/xx.cgi';
でやったらログファイルへのパスが上手くいきませんでした。
xx.cgiの中には

$logfile = "xx.txt";
if(!open (DATA,"$logfile")){&output("error404"); exit;}

と言うのを書いてるので、error404 と出ます。
同じフォルダに持ってくると出来ますが、違うフォルダじゃなければいけないので…。
それで、>>504さんの解答をもらったので socket ではどうやって記述したら良いのかなと。

ディレクト構造は、
+folder1
  ┣xx.cgi
  ┗xx.txt
+folder2
  ┗xx.cgiを呼び出したい.cgiファイル

です。
0513nobodyさん04/09/16 15:20:35ID:???
> ただ socket を使った事が無くて検索してみましたけど、
> 意味もあんまり分からなかったです。

( ´ー`)フゥー...
0514nobodyさん04/09/16 15:26:55ID:???
>>512
socketを使うまでもないな。
$logfile = "xx.txt"; → $logfile = "../folder1/xx.txt";
でどうだろう。
0515nobodyさん04/09/16 15:32:26ID:kf2OMroI
別件で度々すみません、
このようにファイルを読み込んで、追加書き込みしているのですが

open(IN, "$outfile");
@data = <IN>;
close(IN);
open(OUT, "> $outfile");
print(OUT "<div>new</div>\n@data");
close(OUT);

こうしてデータを追加していくと$outfileの中が
<div>new</div>
 <div>new</div>
  <div>new</div>
このようにスペースが入り込んでズレていくんです。
原因わかりますでしょうか。
0516nobodyさん04/09/16 15:37:43ID:???
>>515
>>490
0517515 04/09/16 15:55:35ID:???
>>516
print(OUT "<div>new</div>\n", @data);
で問題なくいきました。ありがとうございますた。
051850004/09/16 16:05:00ID:???
>>514
表示出来ました(^^;
ありがとうございます。
と言うか思いつかなかった自分が恥ずかしいです…。

>>513
socket ってそんなに使う物なんですか?
socket 使ってる配布CGI一個しか見た事ないんですけど…
敷居が高いとか?
今勉強している本にも無かったです(汗
0519nobodyさん04/09/16 16:24:21ID:???
LWPとかIO::Socketはサルでも分かるよ
052050004/09/16 16:31:27ID:???
>>519
そうなんですか…
自分がまだまだなだけですね!
ありがとう御座いました。
0521nobodyさん04/09/16 16:31:30ID:???
>>518
他のサーバーのページやらcgiの出力結果を取得できるので
単語(含>>519)だけでも覚えておけばいいと思う。
052250004/09/16 16:35:58ID:???
>>521
ハィ!
ありがとうございます。
0523nobodyさん04/09/16 16:58:25ID:TnwBmEsg
GDモジュールを使って作成した画像をさらに
Image::Magickモジュールを使って画像サイズを変更することは可能でしょうか。

#Image::Magick
use Image::Magick;
$width = 120;
$img = Image::Magick->new;
$img->Read("xxx.cgi");
$img = $img->Transform(geometry => $width);
print "content-type:image/png\n\n";
binmode(STDOUT);
$img->Write("png:-");

Image::Magickがcgiファイルを読み込めないみたいなので
GDモジュールの方でxxx.pngといったような画像ファイル名を
吐き出させる方法がわかりません。

#GD
use GD;
$w = 500;
$h = 500;
$im = new GD::Image($gw,$gh);
(描画処理)
$im->png(-1);
0524その(1)04/09/17 00:29:48ID:iw09y7mQ
cgiを作ろうと思ってるんですけども、
#!/usr/local/bin/perl
require "./cgi-lib.pl";
&ReadParse();
$number_2 = $in{'number_1'};

#置き換え開始
$number_2 =~ s/イチ/1/g;
#$number_2 =~ s/ニー/2/g;
$number_2 =~ s/サン/3/g;
$number_2 =~ s/ヨン/4/g;
#$number_2 =~ s/ゴー/5/g;
$number_2 =~ s/ロク/6/g;
$number_2 =~ s/ナナ/7/g;
$number_2 =~ s/ハチ/8/g;
#$number_2 =~ s/キュー/9/g;
#$number_2 =~ s/ゼロ/0/g;

0525その(2)04/09/17 00:30:12ID:iw09y7mQ
#結果の表示
print <<"ABCD";
Content-type: text/html

<html>
<body>
$number_2<br>
</body>
</html>
ABCD

これが本文です、number1には「ナナニーサンニーイチキューハチキューゼロ」の
ような文字(htmlのformからとってくる)が入っていて、それを数字に直したいです。
しかし、なぜか2、5、9、0の置き換えをしようとするとエラーになってしまいます。
なぜなのでしょうか
0526nobodyさん04/09/17 00:33:21ID:???
ニー ゴー キュー
 ↑  ↑   ↑
0527nobodyさん04/09/17 00:46:12ID:???
Shift_JISだと
'ー' 0x815B
'ゼ' 0x835B
# 0x5B → [
だからコケるのでしょう。

むしろ、「ニー」「ゴー」が関西ローカルなことに注意してください。
0528nobodyさん04/09/17 01:20:46ID:???
>>527
標準語を使えばOKなのですね?
0529nobodyさん04/09/17 01:21:24ID:???
>cgiを作ろうと思ってるんですけども、
どんなCGIを作ろうとしてるのか気になりますなぁ
0530nobodyさん04/09/17 01:22:14ID:???
イチ ニ サン ヨン ゴ ロク ナナ ハチ キュウ ジュウ

なら大丈夫。
0531nobodyさん04/09/17 04:04:27ID:???
イー リャン サン スー ウー リュー チー パー・・・
ならもっといい
053252504/09/17 04:26:09ID:iw09y7mQ
>>527 >>530 >>531
イチ ニー サン ヨン ゴー ロク ナナ ハチ キュー ゼロ
から成る文字列は、自分で作るのではなくコピペしてformにもってくるものなので
できればこのまま使いたいのです。それじゃないと、この変換を頭でやったほうが
速くなってしまう
しかし、”ー”と”ゼ”が入っていては正規表現は使えないってことですよね、
どうしたらいいんだか。。
0533nobodyさん04/09/17 04:57:01ID:???
皆、ふざけてるだけだ。漏れがまじめに答えてやる。
require 'jcode.pl';
$number_2 = $in{'number_1'};
&jcode::convert("*number_2", "euc");
この上と下の2行を加えればよい。jcode.plでググルこと。
0534nobodyさん04/09/17 05:04:55ID:???
文字コード変えればええやん
053553404/09/17 05:05:45ID:???
ぎゃあ、かぶたよorz
0536nobodyさん04/09/17 06:10:09ID:???
\Qでクォートすれば?
0537nobodyさん04/09/17 08:38:01ID:???
UTF-8で書けばいいじゃーん
0538nobodyさん04/09/17 12:32:25ID:fDDxvp6Z
@ura = ("$answer{'team2'}","$answer{'1u'}","$answer{'2u'}","$answer{'3u'}","$answer{'4u'}","$answer{'5u'}","$answer{'6u'}","$answer{'7u'}","$answer{'8u'}","$answer{'9u'}","$answer{'totalu'}",);

すいません、上の配列をフォームで送った時にEUCに書き換えようと
した場合、&jcode'convert(*ura,'euc');でやると文字化けします。
どの部分を指定してやればよいのですか?
0539nobodyさん04/09/17 12:37:40ID:???
@uraは配列じゃん。jcode::convertの第一引数は変数。
0540nobodyさん04/09/17 13:36:28ID:442/c2rw
DBMを使って検索ベースのアプリを作ってるんですが、
use strict;していると、Fcntlの定数O_RDONRYなどに
引っかかりエラーが出てしまうんですが、これってしょうがないんでしょうか?
use strict 'vars';
だと大丈夫なのですが・・・。
すんません、おながいします。

Software error--------------------------------------
Bareword "O_RDONRY" not allowed while "strict subs"
----------------------------------------------------

tie(my %h, 'SDBM_File', $dbm_name, O_RDONRY, 0600);
ここの、O_RDONRYの部分です。
0541nobodyさん04/09/17 14:03:17ID:???
>>538
jcode::convert(\$_, 'euc')
  for @answer{qw(team2 1u 2u 3u 4u 5u 6u 7u 8u 9u totalu)};

>>540
s/O_RDONRY/O_RDONLY/g;
054254004/09/17 14:13:35ID:???
>>541
あぁぁ・・・、すいません、ホント申し訳ない・・・。
そしてありがとうございます。
0543nobodyさん04/09/17 14:21:45ID:???
>>540
use Fcntlのあとで別のパッケージに切り替えたりしてない?
054454304/09/17 14:24:49ID:???
そんな難しく考える問題じゃなかったかonz...
054554004/09/17 15:10:51ID:???
>>543
ほんとすんません・・・。
O_RDWRだと大丈夫なのにどうして!?
とかしばらく、strictとFcntlについて調べてました・・。
0546nobodyさん04/09/17 15:47:49ID:???
onry
054753804/09/17 16:06:15ID:fDDxvp6Z
>>541
ありがとうございました。無事解決しました。
まだperlはじめたばかりで、教科書にも載っていない事だったので
感激です。
0548nobodyさん04/09/17 19:39:02ID:???
アクセスカウンターで2回に1回カウントするようにするにはどうしたらいいでしょうか?
0549nobodyさん04/09/17 19:49:43ID:???
0.5足す
0550nobodyさん04/09/17 20:17:45ID:???
それだと2回に1回のカウントじゃなくて1回ずつカウントしてしかも、
アクセスカウンターが
2412351.5
みたいになっておかしくなるのでダメなんです。
0551nobodyさん04/09/17 20:21:07ID:???
内部的に覚えておいて、出力時に切り捨てる
0552nobodyさん04/09/17 20:23:33ID:???
とある理由でperlを覚えたほうがいいということになったのですが、perlとは具体的になにができるのでしょうか
いきなりテンプレのプログラムのための文字列を覚えてもさっぱりです
0553nobodyさん04/09/17 20:31:25ID:???
>>552
お前には無理。
早く諦めて別のことに青春を燃やせ。
0554nobodyさん04/09/17 20:40:58ID:???
>548
出力時に1ビット右シフト。
0555nobodyさん04/09/17 20:48:45ID:???
>>552
>>9を100万回読み直してから来てください。
0556nobodyさん04/09/17 20:49:18ID:???
>>550
int
0557nobodyさん04/09/17 20:53:37ID:???
>>552
まずPerlが何の略かを調べればそれが答えになるかも。
つーか他に何か知ってる言語あるの?
それ書いてくれたら答えやすいかもしらん。
0558nobodyさん04/09/17 20:54:23ID:???
>>552
えーっとね、エロゲとかエミュレータとか作れる
0559nobodyさん04/09/17 21:21:35ID:???
>>551
>>556
出来ました。
ありがとうございます。
0560nobodyさん04/09/17 22:54:49ID:???
ファイルからread関数で変数にnバイト読み込んだとき、もし改行が入っていたら、その前後で分けて配列に代入するにはどうすればいいですか?
0561nobodyさん04/09/17 23:07:15ID:???
>>560
@a = split /\r?\n/, $in;
0562nobodyさん04/09/18 12:04:43ID:???
>561
�dクス
056353804/09/19 01:32:18ID:n0F83URY
>>552
僕も初心者なんですが、テンプレを丸写ししても何もわからないです。
僕が今している事は、よく使われるような関数(25個くらい)と、構文(10個くらい)
それと、正規表現、サブルーチン、ライブラリの使い方、これらを徹底的に
覚えようと思っています。いきなり完成されたテンプレからはじめるよりも
パーツから覚えていくほうが絶対にいいと思います。それと、ローカルで
CGIを動かせるように、perlやhttpd、apachなんかを入れておくと、htmlを
ローカルで動かすよに手軽にコーディングして動作確認できます。
お互いに、挫折せずに頑張りましょう
0564nobodyさん04/09/19 01:50:03ID:???
ここはコーディングの質問スレなのよね
0565nobodyさん04/09/19 05:10:18ID:vPjLXO2Q
if(index $a,"pc"){ $b= $pcbnr;};
上記のような文字列検索を行っています。
$aの中身は"pc imode voda ezweb"です。
if(index $a,"ezweb"){ $b= $pcbnr;};の場合は正常に動作します。
"pc"と言う文字列だけは上手く判断出来ないようです。
何故でしょうか?
0566nobodyさん04/09/19 05:40:18ID:???
$pcbnrはどっからきたのだ?
検索して何をしたいの?
それと最後の";"いらないよ
0567nobodyさん04/09/19 05:57:32ID:???
>>565
index $a,"pc"の返り値が0だから
つーか、indexが何をする関数か調べろ。

ただマッチングしたいんだったら
if($a =~ /pc/){
…
}
0568nobodyさん04/09/19 06:00:15ID:???
>>563
cgiでやるよりコンソール(.plファイル)でやったほうが効率いいかもよ。
行数少ないし、すぐにエラー行数分かるし。
0569nobodyさん04/09/19 21:10:27ID:8Bm3sZnu
掲示板を作っているのですが、大きな壁に当たりまして、
書き込みを保存しているファイルから、指定した件数(仮に5件とします)だけ読み込み、続きも"次の5件"のようなリンクで5件ずつ読み込んで行きたいのです。
いろいろ参考書を読んでみましたが、方法が思いうかびません…
よろしくお願いしますm(_ _)m

あと、HTTPヘッダ排出のあとは2行あけないといけないと言われたのですが、なぜなのでしょうか?
0570nobodyさん04/09/19 21:11:25ID:???
ファイルから全部読み込み5件ずつ表示すれば
0571nobodyさん04/09/19 21:13:32ID:???
cgi?page=2
0572nobodyさん04/09/19 22:03:10ID:???
>>569
ちゃんと最初からPerl勉強した方がいいと思う

>あと、HTTPヘッダ排出のあとは2行あけないといけないと言われたのですが、なぜなのでしょうか?
2行?1行じゃなかったっけ?とりあえずRFC嫁
0573nobodyさん04/09/19 22:05:28ID:???
行で言えば1行だね
569は改行コードが二つっていいたかったのかな。
057456504/09/20 00:38:39ID:WP+I8Woy
>>567
if関数でも出来たんですね、パターンマッチ演算子は配列じゃないと駄目かと思っていました。
index $a,"pc"の返り値が0と言うのが解らないのです、$aは"pc imode voda ezweb"です。
自分で色々やってみた所、if(index $a," pc"){ $b= $pcbnr;};とすると思い通りに動作しました。
なぜ、半角スペースを入れるとするのでしょうか?
0575nobodyさん04/09/20 01:13:40ID:???
>>574
>>567が
> index $a,"pc"の返り値が0だから
と解説しているだろうが、このバカチン。
0576nobodyさん04/09/20 01:52:41ID:???
>>574
-1が返ってくるから。
indexが何する関数なのか調べろと567が言ってるだろ。
あと、おそらくおまいの思い通りには動いてないからな。
ためしにマッチしない文字でやってみなはれ。
ついでにifも調べて来い。
057756504/09/20 03:24:21ID:WP+I8Woy
>>575,576
勘違いしていたようです。汗
indexは文字列検索に使う関数だと思っていたのですが、文字列の位置を返す関数なのですね。
CGIの本に書かれていたサンプルソースがパターンマッチっぽい例だったので、文字列検索向けの関数かと思っていました。
ifは数値が 「0」 か 「空」 の場合には偽、それ以外の場合には真なんですよね。
負の値も偽と判断されると思い込んでいました。
>>567さんのやり方で確実に動作する事を確認しました。
結構、適当にPearlを勉強していたのですが、もっと真面目にやろうと思います。汗
有り難う御座いました。
■ このスレッドは過去ログ倉庫に格納されています