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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
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を勉強していたのですが、もっと真面目にやろうと思います。汗
有り難う御座いました。
0578nobodyさん04/09/20 03:59:55ID:???
>>577
Perlね
0579nobodyさん04/09/20 04:16:07ID:???
久しぶりに見たな。
0580nobodyさん04/09/20 06:08:04ID:???
実際にはPearlと名づけたかったんだが、すでにあったからPerlに無理にしたから
そお遠いわけでもないがな。
0581nobodyさん04/09/20 09:22:55ID:???
ばかだな
0582nobodyさん04/09/20 10:17:23ID:???
>577
まあ、ガンガレ
0583nobodyさん04/09/20 18:56:55ID:???
下のcgiを実行すると
3
と表示されました。どうなっているんでしょうか?



print "Content-type:text/html\n\n";

@_ = ("あ<>か","い<>き","う<>く");
@value = split(<>, @_);
print $value[0],<br>;
print $value[1],<br>;
print $value[2],<br>;
print $value[3],<br>;
print $value[4],<br>;
print $value[5],<br>;
print $value[6],<br>;
print $value[7],<br>;
0584nobodyさん04/09/20 19:01:04ID:???
splitの第2引数にリストは使えんのだが
0585nobodyさん04/09/20 19:13:51ID:???
push @value, split(/<>/, $_) foreach (@array);
0586nobodyさん04/09/20 19:24:26ID:???
>>583
それはまともに動くのか?
0587nobodyさん04/09/20 19:26:10ID:???
push @value, split /<>/ for @_;
0588583御破算04/09/20 20:29:46ID:???
>584
え、そうなんですか(;_;)
>586
404は出ませんでした。httpdとinfoseekで確認しました。

>585>587
ありがとうございます。今携帯から見ているので、後で試してみます。
0589nobodyさん04/09/20 20:40:58ID:???
>>588
404・・・?
0590nobodyさん04/09/20 20:47:03ID:???
共用サーバでCGIの実験するな。師ね。
0591nobodyさん04/09/20 21:15:09ID:???
@_には3個入ってるんだから、
@value = split(<>, '3');
と同じ
0592nobodyさん04/09/20 21:27:36ID:???
これくらいローカルでやってくれよ。
059358304/09/20 22:31:17ID:???
>589
403でしたorz
>590
httpdがバグった、と思ったので…httpdで試してsyntax errorが出ず、永久ループでなくてもダメですか?
>591
ありがとうございます。それも調べてみます
>592
ローカルとはmyのことですか?だとしたらどこをローカル化すればいいんですか?
0594nobodyさん04/09/20 22:39:12ID:???
                             |
                             |
      ∩___∩             |
      | ノ  _,  ,_ ヽ        ((  | プラプラ
     /  ●   ● |         (=)
     |    ( _●_)  ミ _ (⌒)   J  ))
    彡、   |∪|  ノ
⊂⌒ヽ /    ヽノ  ヽ /⌒つ
  \ ヽ  /         ヽ /
   \_,,ノ      |、_ノ
0595nobodyさん04/09/20 22:52:17ID:???
>>593
ttp://support.microsoft.com/default.aspx?scid=kb;ja;879066

httpdがバグったって・・・。
何故プログラムを先に疑わないんだ。
0596nobodyさん04/09/20 22:52:25ID:???
2重の釣りか
0597nobodyさん04/09/20 22:56:31ID:???
print "Content-type:text/html\n\n";

@_ = ("あ<>か","い<>き","う<>く");

foreach(@_){
$baka .= $_;
}

@value = split(<>, $baka);
print $value[0],<br>;
print $value[1],<br>;
print $value[2],<br>;
print $value[3],<br>;
print $value[4],<br>;
print $value[5],<br>;
print $value[6],<br>;
print $value[7],<br>;
0598nobodyさん04/09/20 23:04:00ID:???
>>597
君アホでしょ
せめて確認してから貼れよw
0599nobodyさん04/09/20 23:20:32ID:???
@_ = ("あ<>か","い<>き","う<>く");
print "Content-type:text/html\n\n";
print $_."<br>",for split /<>/ ,join("<>",@_);
0600nobodyさん04/09/20 23:27:37ID:???
join関数を知らなかった俺はバカです
0601nobodyさん04/09/20 23:28:38ID:???
joinとか以前に動かないから
0602nobodyさん04/09/20 23:29:06ID:???
>>583のスクリプトを*そのまま* aa.plという名前で保存する。
echo hage| perl aa.plすると、確かに3と出力される。
何が起こっているか誰か解説してくれ。
0603nobodyさん04/09/20 23:31:26ID:???
>>602
>>591
0604nobodyさん04/09/20 23:34:53ID:???
>>602
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldata.html#List_value_constructors
060560204/09/20 23:42:47ID:???
>>603-604
�dクス
060658304/09/20 23:55:49ID:???
>593
よく強制終了するので…クロック数300�rヘルツ鯖(´・ω・`)
>599
join関数なんてあったんですね。知りませんでした
>591
>603で気付いた、前スレ誤解スマソ
>604
そういうことだったのか…
0607nobodyさん04/09/21 02:08:45ID:???
>>606
use strict;するともっともっと気付く。
0608nobodyさん04/09/21 21:16:47ID:UQFv84yK
レンタル鯖で、セション管理のモジュールがインスコされてない&インスコ禁止なので、
ナイスなライブラリがないでしょうか・・・
もう自分で書くしか?
■ このスレッドは過去ログ倉庫に格納されています