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

【Perl】初心者コーナー Part13

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん02/05/30 13:06ID:R2kt1mTx
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

CGIの質問は【CGIだけど、なんか質問ある? part 6】
http://pc.2ch.net/test/read.cgi/php/1019561283/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0830nobodyさん02/07/14 15:00ID:xUfIRkak
>>828
Jperlを必要とする既製スクリプトってたいしたことなさそうだから、
一から自分でコーディングしてみては?
0831nobodyさん02/07/14 15:29ID:ZiG6NcZV
>>829
>>830さん
レスありがとうございます。確かに、その通りなんですが、
1>そのスクリプトが200KBほどある
2>日本語の文章の構造解析のスクリプトなので、日本語処理がチョット複雑
3>あくまでもテストとして、ちょっと動かしてみたいだけなので、できるだけ手間を
かけたくない
という理由で、Perl5.005のソースをDLして、それにパッチを当てようと思っていた
のですが、Perl5.005のソースがなんか見当たらないのです。
0832nobodyさん02/07/14 15:52ID:???
> Perl5.005のソースがなんか見当たらないのです。

簡単に見つかる予感。
083383102/07/14 16:00ID:ZiG6NcZV
>>832
ググルで、"perl5.005 src"で見つけました。
すんませぬ。"perl5.005 source"とか”rpm"とかで検索していたオラが
間抜けでした。逝ってきます。
Perl暦2日なんで、許してやってくだされ。
0834nobodyさん02/07/14 19:04ID:???
sysopenに使うパラメータとかなんだけど、

O_RDONLY = 0
O_WRONLY = 1
O_O_RDWR = 2

とかは分かってるけど

O_APPENDとかは?
検索してもヒットせず…
おしえてくらはい
0835nobodyさん02/07/14 20:53ID:???
>>834 追記以上の説明が必要なん?
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/open.2.html
大体こんな所でしょ
0836nobodyさん02/07/14 21:01ID:???
ああ、割り当てられてる番号か
それって歴史的に環境依存だから0.1位しか信用出来ないよ?
0837二つ目のお気に入りとして使って02/07/14 23:31ID:gWk8eFjt
今までに無かったrink集です。ナビ
ゲーションリンク機能を使って右フ
レームにリンク先をさくさく表示。
今までのリンク集のようにいちいち
戻らなければならないなんてことは
ありません。

http://home9.highway.ne.jp/cym10262/
0838nobodyさん02/07/15 00:06ID:???
ファイルのコピーってどうやれば出来ますか?
元ファイル開いてメモリに読み込んで別ファイルに書き出すじゃメンドイし
どの環境でも使える方法でなんか一発でする方法ないですか?
0839 02/07/15 00:09ID:???
>>838
copy a b
0840nobodyさん02/07/15 00:18ID:???
>>838
Perl5なら以下で出来る。

use File::Copy;
copy("file1", "file2");
084183802/07/15 00:24ID:???
>>840
有難うございます、上手く出来ました。

>>439
やってないけどそれだと多分エラーです。
0842 02/07/15 00:25ID:???
>>841は>>439のなにがエラーなんだ?
084383802/07/15 00:32ID:???
>>842
やってみたらやっぱりエラーが出ました。

String found where operator expected at test.cgi line 1, near
(Do you need to predeclare copy?)
syntax error at test.cgi line 1, near "copy "a.txt""
String found where operator expected at test.cgi line 1, near
(Missing operator before "b.txt"?)
Execution of test.cgi aborted due to compilation errors.
0844 02/07/15 00:36ID:???
>>843

>>439は絶対やっちゃダメだぞ。
犯罪だからな。エラー云々以前の話だ。
がんがれよ。
0845nobodyさん02/07/15 00:41ID:???
>>843 通報すますた
084683802/07/15 00:54ID:???
>>844
マジですか、っても明らかにおかしいのでローカルでしかやってませんが。
今後気をつけます。
0847nobodyさん02/07/15 07:25ID:???
もし$dataに&もしくは=のどちらか一方でも含まれていなかった場合は終了する
という場合は

if(($data !~ /&/) || ($data !~ /=/)) {exit;}

こうでいいんでしょうか?
0848nobodyさん02/07/15 07:59ID:Gdw1y7VE
exit unless $data =~ /[&=]/;

私も初心者だから違うかもしれないけど
0849nobodyさん02/07/15 09:00ID:AMXAGLXX
>>847
聞くより試した方が早いだろうに。

exit if(index($data,'&') == -1 || index($data,'=') == -1);
こっちのが数倍軽い。美しくは無いが。
0850nobodyさん02/07/15 09:42ID:???
>>847
exit unless $data =~ tr/&=//;

0851nobodyさん02/07/15 12:21ID:???
Active Perl 5.6.1.633 きたね。
0852nobodyさん02/07/15 12:44ID:???
htmlファイル上のフォームからCGIへ値を送信して、その結果を新しいウィンドウを開いて表示させたいんですが、
全くもってうまく動きません。
具体的にもうしますと、最近サイトのトップページでよく見かけるようなミニアンケートを作りたいんですが、
ラジオボタンで選択した値などが、まったく送信されてないみたいなんですが、
htmlファイル上のフォームから、別ファイルのCGIへ値を送信する場合なにか特別なことが必要なのでしょうか?
0853nobodyさん02/07/15 13:03ID:???
フォーム の html : これに送信するパラメータの名前や値がかいてある
↓
送信ボタン押す
↓
ブラウザが、指定されたメソッドに従ってパラメータの名前や値をまとめる
そして cgi に送信
↓
cgi でそれを受け取る
↓
受け取ったのはまとまらさってるので
パラメータの名前や値に分解しなければなりません
↓
分解した
↓
色んな処理
↓
処理が終わったから新しい画面を表示させよう、
表示させるにはブラウザにhtmlを送ります(正確には他にも必要)
↓
cgi からおくらさってきた〜〜
↓
ブラウザに表示

どこでコケてる?
0854nobodyさん02/07/15 13:18ID:???
>>853
たぶん、

ブラウザが、指定されたメソッドに従ってパラメータの名前や値をまとめる
そして cgi に送信
↓
cgi でそれを受け取る

あたりでこけてる気がするのですが、
<input type="hidden" name="mode" value="vote">
をフォーム内に記述して、
if($param{mode} eq 'vote'){
 簡単な処理
}
としてみても、「簡単な処理」を一切してくれないので、値を送信しないでCGIを起動だけしてる感じです。
$param{mode}が空の時は、投票結果表示の処理をさせてるので、新規ウィンドウに投票結果が反映されていない
グラフがむなしく表示されています。

なにがいけないんだろ。。。。。。
0855nobodyさん02/07/15 13:29ID:???
データ受け取ってねーよ(^^;
この処理がやってないぞ。定型。

local($pair,$buffer);
if($ENV{'REQUEST_METHOD'} eq 'POST'){
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}elsif($ENV{'REQUEST_METHOD'} eq 'GET'){
$buffer = $ENV{'QUERY_STRING'};
}
local(@pairs) = split(/&/,$buffer);
foreach $pair(@pairs){
local($name,$value) = split(/=/,$pair);
$FORM{$name} = $value;
}
0856nobodyさん02/07/15 13:30ID:???
その $param{mode} はどやって取得してるんです?
0857nobodyさん02/07/15 13:50ID:???
>>855
すいません、書き忘れてましたが、データを受け取る処理も書き記しております。
頂いたレスを見ますかぎり、CGI→同じCGIのデータの受け渡しと、特に変わらない処理でデータを受け取れる
ということなのでしょうか。
0858nobodyさん02/07/15 14:02ID:???
データ受け取りはPOSTかGETが主流だから特に変わりはないはずだよ。
0859nobodyさん02/07/15 14:25ID:???
>854
$param{'mode'}にしたら直ったりは?
0860nobodyさん02/07/15 14:31ID:???
>>859
俺もいつも ' とか省いてるけど性情に動く
0861nobodyさん02/07/15 14:33ID:???
$param{mode}
$param{'mode'}
$param{"mode"}

どれでも変わらんよ。
0862nobodyさん02/07/15 14:51ID:???
>860-861
Perlのバージョンに影響されない?
0863 ◆JAPH9PWA 02/07/15 15:29ID:???
>>862
Perl4ならクォートは必須だけど、今更4との互換性を考える必要は無いと思う。

0864nobodyさん02/07/15 15:59ID:???
>863
悪かったな!
漏れのプロバのスペースがPerl4なんだYo!(涙ッシュ
0865nobodyさん02/07/15 17:20ID:???
Tripodでエンドレスバトルやりたいんだけど設置した後404エラーが出てできない・・・
設置方法が悪いのかな?それとも対応してないとか?
0866nobodyさん02/07/15 17:20ID:???
URL間違えているだけ。
086786502/07/15 17:21ID:XqyW9sRL
>>866
俺?
086886502/07/15 17:22ID:XqyW9sRL
404じゃなかった403だ
086986502/07/15 17:27ID:XqyW9sRL
URLは間違えてないと思うんだけど
0870nobodyさん02/07/15 17:29ID:???
403 アクセス不可
0871nobodyさん02/07/15 17:30ID:Zf9qVko0
>>865
http://cgi.tripod.co.jp/
087286502/07/15 17:59ID:XqyW9sRL
indexけしてからcgi-binはいってみたけどそれすら403ではいれん
0873nobodyさん02/07/15 18:13ID:???
Perlスクリプ�dをEXEに変換する、Perl2EXEっての落としたけどどうやって使うの?
0874すいません。。。02/07/15 19:01ID:GXUWDI7H
自作Perlのテストをローカルでやるために
Quid Pro Quo 2.1.2が欲しいんです。
http://www.socialeng.com/html/download.html
で落とせると聞いたのですが、一向につながらない・・・
ここ以外では配付とかされていないんでしょうか??
よろしくおながいします。
ちなみにMacintosh用です。 
0875nobodyさん02/07/15 19:06ID:???
Mac板のこんなソフト探してます、
とかのスレの方がふさわしくない?
0876nobodyさん02/07/15 19:25ID:/pkMmlTE
クエリーで送信された値が、エレメントの順番どおりに
配列に入らないのですけれど、どこが変か教えて下さい。
htmlの部分↓
ーーーーーーーーーーーーーーーーーー
<form method="get" action="hoge.cgi">
<input type="text" name="E0" size="4" istyle="4" maxlength="4">年</input><br>
<input type="text" name="E1" size="2" istyle="4" maxlength="2">月</input><br>
<input type="text" name="E2" size="2" istyle="4" maxlength="2">日</input><br>
<input type=radio name="E3" value=1 CHECKED>男<br>
<input type=radio name="E3" value=2>女<br>
<input type="submit" value="押す">
<hr>
</form>

cgiの部分↓
ーーーーーーーーーーーーーーーーーー
$buffer = $ENV{"QUERY_STRING"};
@buf = split( /&/ , $buffer );

foreach $data ( @buf ){
( $name , $value ) = split( /=/ , $data );
$FORM{$name} = $value;
@list = values %FORM;
};

print"list[0] $list[0]<br>\n";
print"list[1] $list[1]<br>\n";
print"list[2] $list[2]<br>\n";
print"list[3] $list[3]<br>\n";

これをやってみるとこんなふう↓になります
ーーーーーーーーーーーーーーーーーーー
list[0] E3の値
list[1] E0の値
list[2] E1の値
list[3] E2の値
0877nobodyさん02/07/15 19:27ID:???
受け取ったデータをなぜ
@list = values %FORM;
するのかわからん。
0878すいません。。。02/07/15 19:43ID:GXUWDI7H
>>875
逝って来ま。
087987602/07/15 19:46ID:???
>>877さん←神
分かりました〜♪ありがとうございます。

$buffer = $ENV{"QUERY_STRING"};
@buf = split( /&/ , $buffer );

foreach $data ( @buf ){
( $name , $value ) = split( /=/ , $data );
$FORM{$name} = $value;
};
print"FORM[0] $FORM{E0}<br>\n";
print"FORM[1] $FORM{E1}<br>\n";
print"EORM[2] $FORM{E2}<br>\n";
print"FORM[3] $FORM{E3}<br>\n";
0880nobodyさん02/07/15 21:25ID:???
見栄えをよくするために行頭にはタブを入れてるんですが

     print <<"HTML"

     <html><body>〜略〜</body></html>

     HTML

とやりたいんですがこれだとエラーになります。
タブを入れたまま動くようにするにはどうしたらいいでしょうか?

あとタブを入れてないと動くのですがその中に<a href="mailto:[email protected]">xxx</a>

があるとエラーになります。どうしてなのでしょうか?
0881nobodyさん02/07/15 21:28ID:???
>print <<"HTML"
 ; が入ってないけど、動くの?

>href="mailto:[email protected]">xxx</a>
\でエスケープしたら?
href=\"mailto:aaaa\@hotmail.com\">xxx</a>
0882 ◆Smt8k/ss 02/07/15 21:29ID:wkNqkF1j
    print <<"    HTML";
    <html><body>〜略〜</body></html>
    HTML
0883nobodyさん02/07/15 22:32ID:h7+zOLje
>>882

一応動いたんですがもうちょっと見栄えがいいやり方無いでしょうか?
0884nobodyさん02/07/16 00:48ID:???
print qq~
<html><body>〜略〜</body></html>
~;

@はエスケープしる
0885nobodyさん02/07/16 02:17ID:???
質問よろしいでしょうか?
ダイス機能付きのチャットを作っているのですが、どうにもrand関数の値が偏ります。
3D6(6面ダイス3個の判定)の場合、1個目の数字が連続で同じ数字になります。
試しにWeb上にアップして試した所、そっちでは3個目の数字が連続で同じ数字になりました。
これはrand関数において仕方のないことなのでしょうか?
もし解決策などがあるのでしたらご教授いただけると嬉しく思います。

以下はダイスロール部分のソースです。

# $in{'dice_any'}にダイスの数、$in{'dice'}に何面ダイスかの情報が入ってくる。

srand(time);
$dice_roll = qq(<br><b><font color=0000FF>$in{'dice_any'}D$in{'dice'} ダイス判定</font></b> <font color=0066FF>);
$dice_all = 0; # ダイスの出目の合計用の変数
$plus = "";
while($in{'dice_any'} > 0){# ダイスの数が尽きるまで
  $dice = int(rand($in{'dice'})) + 1;
  $dice_roll .= qq($plus$dice );
  $dice_all += $dice;
  $in{'dice_any'}--;
  $plus = "+ ";
}
if($dice != $dice_all){# ダイスが2個以上なら
  $dice_roll .= qq( = <b>$dice_all</b>); # 合計値表示
}
$dice_roll .= qq(</font> );

# この後$dice_rollをログに保存

どなたかよろしくお願いします。
0886nobodyさん02/07/16 03:00ID:???
srandするな
088788502/07/16 03:07ID:???
使うサーバーがPerl4なんです・・・。
0888nobodyさん02/07/16 03:09ID:1NQx5kwR
root--test.pl
|
|-folder1
|-main.cgi

このようなファイル構造なんですが
main.cgiからtest.plを参照することは可能なんですか・・?
088988702/07/16 03:13ID:1NQx5kwR
>>888
ずれてる自己レス・・・
root にtest.plが有って
folder1にmain.cgiが有る状態です

つまり下位のファイルに参照できるかどうかと言うのが疑問なのです・・・
0890nobodyさん02/07/16 04:53ID:???
絶対パスで指定しませう。
require '/home/mona/public_html/test.pl';
大体こんな感じ。鯖でちがう。
0891nobodyさん02/07/16 06:01ID:???
PerlとかでWEBページを所得する
ソケットプログラム書くときサーバからのレスポンス(OK 200とか)がうざいんですが
これを消す方法ってないんですか?
089288702/07/16 06:35ID:1NQx5kwR
>>890
winだと相対パス行けるのですが
いざUPするとできません・・・
相対的にはこんな感じで
../member/data/point.pl
絶対的には
/home/as***/public_html/*****/cgi-bin/member/data/point.pl
こんな風なのですが・・・
0893 ◆JAPH9PWA 02/07/16 08:49ID:???
>>891
HTTPを使う限り、それを消す方法は無いよ。
単に無視するだけなら可能だけどね。
その場合は最初の空行までを読み飛ばせば良い。

>>892
パーミッションがあれば、相対でも絶対でもいけると思うけど。
0894nobodyさん02/07/16 08:49ID:???
相対パスのときカレントより上のディレクトリは指定できない設定なんでしょ。
089585202/07/16 09:20ID:mWVjtM4S
未だに同じ問題で悩んでいる852です。

送信ボタンに、onMouseUPで新規ウィンドウを開き、そこにデータを受け取った後の結果を表示させるようにCGIにリンクさせてるんですが、
そのjavascriptをいれてると、データが送信されてないみたいです。

試しに投票フォームと同じウィンドウ上で結果を表示させると、うまくいきました。

submitボタンにビヘイビアを仕込むとダメなんでしょうか?
0896ぽよぽようんこ(本物)02/07/16 13:47ID:???
悩んでる内容も内容なら、説明も下手、キミには向いてないそれだけのこと。
0897chmod02/07/16 14:34ID:2idpGCxq
chmod 0755, $filename;
でファイルがブラウザから見られるのに

$de="0755";
chmod $de, $filename;
でにするとファイルが見られなくなります。

chmod($de, $filename);
もダメです。
どなたか変数で指定する方法を教えて下さい。
0898chmod02/07/16 14:36ID:2idpGCxq
>>897
あれ文字化け?してるけど、
コロンでなくカンマです。
0899ぽよぽようんこ(本物)02/07/16 14:43ID:???
そんな基本的なこと参考書に書いてあるだろ。キミも向いてないね。
0900chmod02/07/16 14:46ID:2idpGCxq
$de="0751";
chmod($de,$filename);と755を751にしたらでできました。

しかしFTPプログラムでこのファイルを見るとなぜか
-wxr-xrwxになっています。どうしてでしょう。
0901nobodyさん02/07/16 14:52ID:???
>>900
$de = 0755;
ダブルクォーテーション不要。
リテラルについてさらっと勉強し直しましょう。
0902nobodyさん02/07/16 15:11ID:???
umaskは?
0903nobodyさん02/07/16 15:12ID:???
スカラー変数の意味がわかっていない馬鹿がいるな…
0904nobodyさん02/07/16 15:37ID:2idpGCxq
>>902
umask(0)です。
$de=0755;とかにするとその時点で正しく数字が入りません。
やはり変数を使って設定をするとパーミッションがぼろぼろになります。
Perlの仕様ということで考えます。
0905nobodyさん02/07/16 15:46ID:???
だからperldoc嫁ってのに、どんな仕様だよ

$de_octet = oct($de);

perldoc dhmod
090688502/07/16 15:52ID:???
らくだ本を参考にsrandの種を以下のようにしたら乱数がばらけてくれました。
ありがとうございました。

srand(time() ^ ($$ + ($$<<15)));
0907nobodyさん02/07/16 16:01ID:???
>>904
どうしようもないアフォですね。
0908nobodyさん02/07/16 16:07ID:???
バカハケーン!
090985202/07/16 16:53ID:???
ようやく解決できました。どうもお世話になりました!はーこんな単純なことで長時間費やすとは・・・
0910nobodyさん02/07/16 18:06ID:AR5JuM+5
新感覚のポータルコミュニティサイトが遂に出来ました!!
今までの出会い系サイトとは一味もニ味も違うサイトです。バーチャルタウンを実際に体験できます!!!
詳しくは下記UELをクリックして、確かめて!!
http://www.e-mansion.co.jp/co/ac.html
0911nobodyさん02/07/16 18:13ID:XozL7fM5
>>907 >>908

■■■バカ名言■■■

バカって言うだけの奴ほど役に立たないものはない。
助けるか、無視するかをしなさい。

バカというだけというのは、助けもせず、無視もせず、
レスを余計に増やし、雰囲気を悪くする。
そういうのに限って突っ込まれれば適当にごまかしたり、逃げていく。

■■■どうせ六でもない奴だろうが■■■
0912nobodyさん02/07/16 21:41ID:???
>>911
陸でもない/碌でもない
バカって言っていいですよね?

  ■■■どうせ六でもない奴だろうが■■■
  ■■■どうせ六でもない奴だろうが■■■
  ■■■どうせ六でもない奴だろうが■■■
  ■■■どうせ六でもない奴だろうが■■■
  ■■■どうせ六でもない奴だろうが■■■

バカハケ━━━━━(゚∀゚≡゚∀゚)━━━━━━ソ!!!!
0913nobodyさん02/07/16 23:36ID:???
楽しいスレですね(微小
0914nobodyさん02/07/17 00:13ID:???
>>912
ネタに乗ったハカ
どう見ても厨房
でもあんまりおいたしていると痛い目合わすよ。
0915nobodyさん02/07/17 00:24ID:???
>>914
>>914
0916nobodyさん02/07/17 06:20ID:???
おまえら、いい馬鹿っぷりでお兄さん感激だ(w
0917nobodyさん02/07/17 07:08ID:???
タグを削除したいのですが、

$x = qq{<a href="http://www.yahoo.co.jp/">Yahoo! Japan</a>};
$x =~ s/<.+>//g;

のようにすると、最初の < と最後の > で全部消えてしまいそうな気がします。
最短マッチとかを使えばいいんでしょうか、使い方がわからないので教えてください。

(Perlメモを読んだところEUCしかできない方法らしいので
SJISでもやりたいので質問です)
0918nobodyさん02/07/17 07:41ID:???
2002/07/17 07:41:20 を、time関数形式になおしたいけどどうするの?
0919nobodyさん02/07/17 07:52ID:SEvMu7le
>>917
$x =~ s/<[^>]*>//g;

>>918
年月日時秒を分解して
(年は-1900してから)全て秒に直して足せば良いんじゃないの?
0920nobodyさん02/07/17 07:53ID:???
>915
timelocal();
0921nobodyさん02/07/17 07:53ID:???
>920 =~ s/>915/>918/;
092291902/07/17 08:08ID:???
馬鹿だ俺…
0923nobodyさん02/07/17 08:08ID:???
>>917
HTML::Parserという手もある。
0924nobodyさん02/07/17 12:49ID:???
rename("onefile","pict/$hensuu");
ってやるとunix/perlでは成功するんですが
ActivePerlじゃ成功しないんです。
rename("onefile","pict\$hensuu");
うえのようにしてもだめでした。たすけてちょんまげ
0925 ◆JAPH9PWA 02/07/17 13:41ID:???
>>924
…普通に成功してるけど?

というか、失敗したら$!を見る癖をつけよう。

rename(...) or die $!;
0926nobodyさん02/07/17 14:25ID:tZJ3+xnS
>>924
エスケープしなきゃ駄目だよ
pict\$hensuu
 ↓
pict\\$hensuu
0927nobodyさん02/07/17 14:52ID:tZJ3+xnS
と言うか、rename("onefile","pict/$hensuu");このまま
でも動く所がActiveperlさんの偉い所だったり
MACだとこうは行かないそうで
0928nobodyさん02/07/17 16:15ID:???
>>927
MACのPerlってどんなんなんですか?
OSXで動くならまぁわかるんですが。
PerlでIriaみたいなの作ったら需要ありますかね?
Macでダウソマネージャーってありましたっけ?
0929nobodyさん02/07/17 16:28ID:???
MacPerl
WWWcp

両方で検索してみれ。ただWWWcp最後にいつ使ったか
忘れたけど俺が使ったバージョンではマルチホーミングに
対応してなかった気がする。
つーか需要も何も難しくないからめずらしくも無い。
レス数が900を超えています。1000を超えると表示できなくなるよ。