【Perl】初心者コーナー Part19
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/01/11 13:52ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
あとは>>2-10にまかせた。
0365nobodyさん
03/01/22 21:43ID:TWTRYmp3WEBサーバーを通さないってことはFTPでってことですか?
かなり初心者なんですいません。
0366nobodyさん
03/01/22 21:45ID:???>WEBサーバーを通さないってことはFTPでってことですか?
など、そのサーバのファイルシステムに然るべき権限でアクセス出来るプログラムがあればいい。
0367nobodyさん
03/01/22 21:46ID:???> どの拡張子がCGIスクリプトとして実行すると決めておくのがサーバー設定ってことですか?
そう
> WEBサーバーを通さないってことはFTPでってことですか?
別に何でもいい。FTPじゃ無理だと思うが。
たとえばis○ebのようにセキュリティの甘いところはCGIスクリプトを使って他人のファイルを覗ける
0370nobodyさん
03/01/22 22:08ID:NkPjRdCpお前には課題だ。調べておけ。
suEXEC setuid ファイルの所有者 パーミッション
0371nobodyさん
03/01/22 22:11ID:???>>367の間違い?
それくらい知っているけど(^_^;)
共用サーバにも関わらずそれをやっていないからis○ebはセキュリティが甘いと言ったんだけど。
0374nobodyさん
03/01/22 22:42ID:TWTRYmp3>>373
そうなんですか?それすらもよくわからなくて。
ごめんなさい。
0375nobodyさん
03/01/23 00:46ID:???私の場合openが失敗したからといってスクリプトを終了させるわけ
には行かないので
if(open(IN,"temp.txt")){
opend lines
} else {
canto open lines
}
のようにしているのですが、
こういうことはしないのでしょうか?大丈夫でしょうか?
0378375
03/01/23 00:56ID:???376の方法もいいなとおもいました
0379nobodyさん
03/01/23 01:15ID:IkRppvEjクライアントからのデータをサーバに保存できさえすれば良いんですが。
0380nobodyさん
03/01/23 01:20ID:???送られてくる→&jcode'sjis2euc(\$mes)→内部処理
内部処理→&jcode'euc2sjis(\$mes)→送り返す
としても、半角はおかしくなってしまいます。
なにか解決方法はないでしょうか><
0382nobodyさん
03/01/23 01:56ID:8ePVO3RC2回同じことやれば半角スペースが2つ、3回なら3つって具合にどんどん増えてしまう。
なんで?
どうやったら回避できるの?
何か根本的なこと間違ってる?
0383nobodyさん
03/01/23 02:04ID:???そもそも「半角カナは文字化けするから使わないように」っていうのがネットの常識じゃなかったか?
2chみたいに、半角カナが堂々と使える掲示板のほうが特殊なのかもしれないぞ。
>>382
ソースきぼんぬ
0384380
03/01/23 02:19ID:/gwtZ2Vtありがとうございます!
\$ を * にしたらなりました
昔は*を使っていたのですが、\$のほうがいいとか、同義だと
かおもっていて、結果が違うとはおもいませんでした。
*$とうのもあるのですか?
私もまだまだ勉強不足ですね・・
ありがとうございました。
0385380
03/01/23 02:28ID:???今度は大丈夫かな
>>383
そうなんです。私も半角はいやなのですが、
携帯電話のチャットを作っているので、きってもきれない
関係なんです・・
掲示板で使えるところがあるので、どうにかがんばればできるんだろうなぁ
とか思ってやってました。
文字コードを変換しなければ問題はおこりにくいのかな
0386nobodyさん
03/01/23 02:37ID:???SJIS以外なら、エラーを返して書き込めないようにしている。
結果として、文字コードの変換処理を省略している。
PC向けならこれで、問題ないように思える。
基本的に、フォームページの文字コードでデータがPOSTされれば
変換処理はいらないと思う。
携帯の場合はどうなんだろう。。ちと気になる。。
0387nobodyさん
03/01/23 02:42ID:???携帯ならShiftJISだけで処理すればいいんでない?
半角カナOKな掲示板も、内部ではShiftJISだけで処理してるのがほとんどだよ。
0388nobodyさん
03/01/23 02:46ID:j5CbC/3T382です。ソースはかいつまむと
#!/usr/local/bin/perl
print "Content-type: text/html\n";
print "\n";
print "<HTML>\n";
open(FILE,"<data.txt");
@data=<FILE>;
close(FILE);
open(FILE,">data.txt");
print FILE "@data\n";
close(FILE);
print "処理終了\n";
exit;
こんなんです。
これだけでもどんどんスペースが増えていきます。
なんででしょう?
0389380
03/01/23 02:49ID:???本来はshiftjisだけで処理したほうがよかったかもですね。
私の場合は、メッセージにIDや名前や発言があるので
それを切り分けたりとか、サーバー側がつくったメッセージを
くみあわせたりとかがあるので、つい、
サーバー側(UNIX+Apache)ではEUCで扱うようにクセがついています。
半角文字に関しては今のところうまく動いているので、
もしある程度出来上がったらiappliのお金がかかりにくいように
作ったチャットをここで公開しますね
0390nobodyさん
03/01/23 02:52ID:???かいつまみすぎてわからん。それだけ見れば異常はないけど、
配列の最初の要素にどういうものをいれているんだ?
print "$data[0]syori syuuryou";
とかでみてみた?
0391nobodyさん
03/01/23 03:17ID:j5CbC/3Tえっと私(382=388)へのレスということでいいですよね。
データの内容は会員リスト(氏名だとか住所だとか電話番号をカンマ区切りにしているもの)です。
拡張子はtxtですがためしにcsvとかでやっても同じでした。
data.txtのファイルをブラウザで見ると2つ目以降のデータの頭にどんどん半角スペースがくっついていくんです。
csvにした場合は2行目以降の1列目の各データの頭にスペースが付いていきます。
本当は配列に入れた後、追加だとか並べ替えだとかやりたいんですけどそれ以前の段階でつまづきました。
0392390
03/01/23 03:28ID:???改行コードの違いとかはだいじょうぶ
ファイルをどうやってみてるのかとかわかんないしなぁ
やまだ,東京345,99311
のだ,宮556,552211
見たいな感じなの?
0395nobodyさん
03/01/23 03:42ID:j5CbC/3T本当だ!
ありがとうございます。(^^)
凄い晴れやかな気分。半日苦しんだから。
でもなんだか恥ずかしくなってきた。
受け売りって言うかよそから拾ってきたものを見本に猿まねで訳もわからず作ってたから。
ところで何でこうなるんですか?
(by 382)
0396393
03/01/23 04:10ID:???調べてみたんだが、ダブルクォート中にリスト変数を記述すると、リストの中身が
展開されるそうな。そのとき区切り文字として特殊変数 $" が使われるんだけど、
この中身はデフォルトでは半角スペース。
例えば、各行が「うんこ」「ウンコ」「unko」のテキストファイルを読み込む。
@data = <FILE>;
すると、$data[0] は「うんこ\n」、$data[1] は「ウンコ\n」 などとなる。
これを間違ってた方法で書き出すと
print FILE "@data\n";
リストが展開され、「うんこ\n ウンコ\n unko\n\n」となる。
結果、2行目以降の先頭にスペースがついてしまったというわけ。
(@dataの後ろの\nが実は末尾にしか付いていないことにも注目)
リストの出力は print FILE @data; のようにダブルクォートせずに書こう。
0398nobodyさん
03/01/23 10:21ID:???require "mimew.pl";
require "jcode.pl";
(略)
$subject = mimeencode (jcode'jis($subject));
$body = jcode'jis($body);
open(MAIL ,"|/usr/sbin/sendmail -t -i");
print MAIL "From: $MailAddress\n";
print MAIL "Subject: $subject\n";
print MAIL "To: $mailaddress1\n";
print MAIL "\n";
print MAIL "$body\n";
close(MAIL);
で、コマンドラインから実行した場合は正常にメール送信されるのですが、
ブラウザ経由で実行した場合、mimeencodeが実行されません。
(エラーにもなりません。)
mimew.plおよびjcode.plはプログラムと同階層においてあります。
また、ファイルの属性は755です。
八方塞がりの状況です。教えていただけませんでしょうか。
0400nobodyさん
03/01/23 11:13ID:xJWtHdWYmy %aaa;
my @bbb;
# それぞれになんか値を入れる動作する
return(%aaa,@bbb);
}
(%AAA,@BBB) = &hoge;
こうすると@BBBに値が入ってないんですけど、なぜでしょうか。
0401398
03/01/23 11:19ID:???mimew.plのパーミッションは644です。
apacheのログを見たところ、
Undefined subroutine &mimew::mimeencode
と表示されていました。
mimew.plにはmimeencodeが存在しています。
(コマンドラインからは実行されますし)
何か他にチェックするべき点はあるでしょうか。よろしくお願いします。
0402nobodyさん
03/01/23 11:21ID:???もしも、mimew.plが読み込まれていないと心配なら
eval ( require "mimew.pl" );
で、きちんと読み込まれているかチェックしてみたら
どうでせう?
>>399
0755にしなきゃいけないファイルを0644にしていたら問題だけど、
普通0644にするべきファイルを0755にしていても、問題じゃない
でそ?
0403nobodyさん
03/01/23 11:35ID:E5MYBiOXmy @AAA=&hoge;
%AAA=$AAA[0];
@BBB=$AAA[1];
0404398
03/01/23 11:56ID:???evalでチェックを行ったところ、
mimew.plはきちんと読み込まれていました。
しかし、あいかわらず
Undefined subroutine &mimew::mimeencode
と出力されています。
0405nobodyさん
03/01/23 11:59ID:???returnは値を1つしか返せないよ。
こういうときはリファレンス渡しにして、サブルーチン側で直接値を変更したほうが
いいかもしれない。
&hoge(\%aaa, \@bbb);
sub hoge {
my ($aref, $bref) = @_;
$aref->{hage} = "ccc";
$bref->[0] = "ddd";
}
0407nobodyさん
03/01/23 12:53ID:???1.作業用の配列を使いまわす事がある
2.分かり易いように名前を決めて、1つの項目しか入れない
場合によって、違うかもしれないけど、貴方はどっち派?
0409nobodyさん
03/01/23 13:13ID:nFHVv77n実験として次のソースを書いてみました。
ファイル名:test1.cgi
#!/usr/local/bin/perl
open(FILE,">>./1234.txt");
print FILE "0123456789\r\n";
close FILE;
これをFreeBSD4.7+apacheが動いているコンピュータにいれて
別のコンピュータにブラウザでこのファイルのアドレス
を指定してやると「内部サーバーエラー」が出てしまいます。
何か間違いがあるだろうかと、
apacheが動いているコンピュータで直接
perl test1.cgiとやったところ、1234.txtのファイルが作成されました。
ネットで調べたところ、Apacheのユーザに権限がないと
ファイル作成などはできないということが書いてあったのです、
1234.txtが作成されるディレクトリのパーミッションを775にして、
apacheのユーザを、そのディレクトリのグループのユーザに
加えてみて、今度はapacheのユーザでperl test1.cgiを実行しました。
そうしたところ、上手く作成できたので、今度は外部から試してみました。
そしたらやっぱり内部サーバエラーになってしまうんです。
どこがまずいのか分かりません。
乱文になってしまいましたが、どなたか私の間違いを
指摘して下さいませんか?よろしくお願いします。
0411nobodyさん
03/01/23 13:25ID:jz3+5dSUApacheにヘッダーを送れ。
print "Content-type:text/plain\n\nファイル作成しますた。\n";
0412409
03/01/23 13:28ID:???#!/usr/local/bin/perl
print "\r\n\r\n";
open(FILE,">>./1234.txt");
print FILE "0123456789\r\n";
close FILE;
というふうにしてみたんですが、今度はダウンロードしますか?の
ダイアログが出てきてしまいました。どうなってるんでしょうか?
0413nobodyさん
03/01/23 13:38ID:???PerlをCGIで動かす場合には、HTTPヘッダを出力する必要があります。
CGIで動かした時にHTTPヘッダがなければ、>>409のようにエラーで動きません。
それだけです。
0415nobodyさん
03/01/23 13:54ID:Ah3Ym1t7文字列中に
#1234(1234は3〜6桁の数字)
と有った場合、
<a href="http:/hoge.com/hoge/1234">#1234</a>
~~~~~ ~~~~~~~
#を外した数字↑ ↑元の文字列
と言う風に変換したいのですが、上手くできません。
どなたかご教授ください。
よろしくお願いします。
0417nobodyさん
03/01/23 14:33ID:???my $str = "#1234(1234は3〜6桁の数字)";
(my $tr = $str )=~ s!(#(\d{3,6}))!sprintf("\"http:/hoge.com/hoge/$2\">$1</a>")!ge;
print "$str ->\n$tr\n";
0419nobodyさん
03/01/23 14:47ID:???補完
0420398
03/01/23 14:47ID:???出力バッファを吐き出すことと、
サブルーチンが見付からないこととはどのような関係があるのでしょうか。
$|=1;を加えてみましたが、結果はかわりませんでした。
ただ、気になるのですが、
$subject = mimeencode(jcode'jis($subject);
と呼び出した場合、
Undefined subroutine &該当コードが含まれているパッケージ名::mimeencode
とエラー出力されます。
mimew.plは正常に読み込んでいるようなのですが・・・。
0421398
03/01/23 14:52ID:???0422nobodyさん
03/01/23 15:03ID:Ah3Ym1t7ありがとうございました。
上手くいきました。
0425nobodyさん
03/01/23 15:21ID:???だから、なんでアホみたいにprint MAIL なんとか
でやるの?バッファリングするなっていわれてるのに
$mess にぜんぶメールいれといて
system (,"|/usr/sbin/sendmail -t -i , $mess);
かなんかでポンとやれよ。
ファイルハンドルの意味わかってんの?
0426398
03/01/23 15:28ID:???mimew.plを見たら、パッケージ名がMIMEと設定されていました。
呼び出しミスでした。お騒がせ致しました。
ただ、jcode.plの場合はrequireするだけで良かったって言う、理由が、よくわからないままです。
よろしければご教授ください。
0428nobodyさん
03/01/23 15:41ID:???あんたのmimew.plにmain'mimeencodeサブルーチンが欠けているか
main以外のパッケージ空間を使用しているからでしょ。。
0430nobodyさん
03/01/23 17:27ID:kDsUWLbm今回の問題にバッファリングは関係ない。closeしているから。
なんでも$|=1って書けばいいものじゃない。あほか。
0431nobodyさん
03/01/23 17:34ID:kDsUWLbmselect(MAIL); $| = 1; select(STDOUT);
こうするべき。この辺りはわかって言ってるんだよね?
0432409
03/01/23 18:06ID:???ありがとうございます。上手く動きました。
何度試してもずっと内部サーバエラーですが出力されていたのですが、
ブラウザを閉じてもう一度アドレスを入力したら動きました。
なんだかふに落ちないのですが、ひとまず動いたのでよしとします。
一時ファイルとかそんなのが問題になってるんでしょうかね?
0433nobodyさん
03/01/23 18:19ID:???0434nobodyさん
03/01/23 19:02ID:0ikp7K62解説書などを見ても意味がわかりません。
$su が最初に出てくる画面は何のアプリを使ってるのでしょうか?
0435nobodyさん
03/01/23 19:26ID:/BytM6mnLinux
FreeBSD
cygwin
0437nobodyさん
03/01/23 22:30ID:CHeIi8Oa制限かかってて見れないページがあるんですが、
自宅のwebサーバーを経由して、見れるようにする
方法ってないでしょうか?
0438nobodyさん
03/01/23 22:33ID:vGzRwfzk串じゃあかんの?
0439nobodyさん
03/01/23 22:42ID:JsPmMcCVどうすればよいのでしょうか?
$char = "ABcd";
何らかの処理
(例えば +10hさせる。)
↓
$char が QRst となる。
文字を取り出すのはやってみたんですが、
文字をずらすのがわかりませんでした。
--------------------------------
$char = "ABcd";
for ($i = 0; $i < length($char); $i++) {
$c = substr($char, $i, 1);
}
--------------------------------
0440nobodyさん
03/01/23 22:51ID:KCPQ5bMl$c += 10;
0442439
03/01/23 22:55ID:???ハンドル間違えました。
0443440
03/01/23 22:59ID:KCPQ5bMlを必要なだけ繰り返す。
0445nobodyさん
03/01/23 23:10ID:CHeIi8Oa串刺すとみれるんですか?
.pacのファイルを指定してプロキシ経由してるんですが、
その辺よく分からないので、よろしかったらご指導ください。。
0446貧乏パーラー
03/01/24 00:19ID:???俺も会社からちくり板見るれなくなって欲求不満だった。
だから某所のコード改造してから自作したよ。
これでもパーラーだからねピュアperlで作った簡単httpポートフォワーダだよ。
0447貧乏パーラー
03/01/24 00:20ID:???---この下から---
begin 666 http-tmp2ch.zip
M4$L#!!0````(`&F_-RZKG&Q7[0,```<*```.````:'1T<"UT;7`R8V@N<&R5
M5FUOVD@0_FQ^Q90XQ:A@`]%))R,XI6W:1,H!"MR+5!IDS!*LFK5O=PF'0OK;
M;V=?,'"D:E8"KW>?F7EV=N:!LS?!BK,@S>(H#:8)#7+"TM+90HB\+I9Y"]0L
MSYB`><;6$9L1!N\W<.V+[!O)-#(,@D6V)'GT0"Y\FLS%QH^S9:`0-+BB#_7W
M06G%"7#!DEBTU?RF'X;#+/Y&]M])2G!_N0'W]G(V8]`!]_+N\Y]?&E_AMV(:
M0D4Q7F1<5`Q\@!PMO(EP\ABEGGVOHE%+#H,?74O;';Y5N&\I]_+L?BM>^)2(
M"AB+@P@71Q$N=(1?&PC/64(%E,<4LP."193#S2":S4)SK-N$"T)#PUH#D%!H
M>.%RJ"..:5G'3Y7-)#<LE*G>X3*-DW64B(0^R*TBLV%XT[L:U;N4K#T=$N3H
M=&'8__WR[P_]7J]6@I\=MYAQG8/N`9M7^!BP3&1J)GU41)Q77F%\1[!.<$CC
MYFN9ZW+JFL*JP<^;5]NE]2))"7@VV9C__:37NU$<DUQ4GY17"?/<Z6I><QGY
M9T6XD!X<Y<)K5N&IY#A\PQF)9I[R4@,%AF9##@FU<:TU^!V%*':2.7C%=N<[
M+(,Q&U/\;.6#!F"8_,#@WAOTAZ/MYZM1%13>D4,QQZZ2G-35@BMK9R(-:RY'
MKG@2.:06>#Q/$^%5QK12G%.?3HY`57,`;]_"++.+CCOI0$7M0,4WI:X=.L_F
M&=R1.6&$G;+]SK=&;K[<!U_?V1?M:)L=>;+,5?HFONS&L@GV7)R5F5,F$1:%
MFQ/"T%G5('<+]L;K75RAT9(8Q)&+J@0B#N>3A'J%Q[8-JI8F"^WT@0B<33=H
MX!D:</EI@HU[;!-I14RD*$VHR"*#-S!]09V&>3,!#K+L6O'06M8^J!'CX$4!
M00_@.`/)9-=+JE0..TDC=CIQ0B`DPLK`:15PJD?,5/F^`4/PJ+81X&C%U<U9
MOAZ-!D'3;\`OC0;$$:69`$9XECX2'WND?.`>ZT$]U9RD4F.>#O<=KGZ7/-L"
MX&X[S3:8U>'H8_^/4?7(YXZ1HF1K\1BTJU'9DCRX#P""A^5I3V6`>AUL"W,1
M,5&O__\L-NX+`4_Y(G1F/#FVW+B4&]A[1[%*Y:^'<J=6=RGY4484TH0\/S__
MBTREB$<S&")[DYLB\(%"JG*U8=_)IMHIII%,7FBF%$TP)OMUH"#(6&^M:$HX
M]]1J$<-)HT*$L!+,\R7J5[V/>\1A3T_B-./$U@BTS]!D2-BC_,.$S00?<+^D
MT38HP#-^F:+;!>R1?[%B9;@YRY8P9=F:$V8R17&S[6ACO%;]77#5D21=?;U#
MG0N;:L1:JEK0GTNE_P!02P$"%``4````"`!IOS<NJYQL5^T#```'"@``#@``
M```````!`"``MH$`````:'1T<"UT;7`R8V@N<&Q02P4&``````$``0`\````
&&00`````
`
end
---この上まで----
0449nobodyさん
03/01/24 00:28ID:f7nkT00I$char="ABcd";
print pack("C*",(map { $_+10 } unpack("C*",join('',$char))));
別に1行でなくてもよいけれど、、、
0450貧乏パーラー
03/01/24 00:31ID:???上のuueコード部分をテキストエディタにコピペして(ファイル名http-tmp2ch.uue)
WinZIPでそれを開いてその中に出来ているhttp-tmp2ch.plを適当なディレクトリにコピ
Dos窓開いてhttp-tmp2ch.plをコピーしたディレクトリにcdして
使用方法
perl tmp2ch.pl パソコンのDNSホスト名(もしくはIPアドレス) 任意のポート番号 2ch板ホスト名 80
として起動
そしたらブラウザから
http://パソコンのDNSホスト名:任意のポート番号/2ch板ホスト名以降のアドレス
として見る。
例
c:\hoge>perl http-tmp2ch.pl Mypc.com 2222 pc.2ch.net 80
ブラウザからここを見る例
http://Mypc.com:2222/test/read.cgi/php/1042260745/l50
他の2ch板指定したい時この要領でホスト名と別のパソコンポート指定汁。
ためしにパソコンのホスト名をlocalhostとして試しても良し。
0451449
03/01/24 00:35ID:???を
$char
に訂正。
無意味だ欝
0452nobodyさん
03/01/24 00:38ID:???my $char = "ABcd";
$char =~ s/(\w)/chr(ord($1) + 0x10)/ge;
print $char; # > QRst
私はこういう方法で偶に変換してます。。
0453nobodyさん
03/01/24 01:06ID:???The server encountered an error while processing your request.
Please contact the administrator of the referring document and inform them of the time the error occurred, and anything you might have done that may have caused the error.
--------------------------------------------------------------------------------
The CGI environment at the time of this error was
こんなのが表示されたんですがどうすればよいでしょうか?
0454nobodyさん
03/01/24 01:12ID:???ちゃんとローカルでテストしましょう。
そのエラーメッセージじゃ何もわからんよ。
まずはローカルでテストできる環境を作って、そこでエラーメッセージをちゃんと吐かせる。
そしてエラーメッセージの意味を調べて、スクリプトを修正する。
0455439
03/01/24 01:13ID:???ありがとうございます。
今までネットで探していたら、
452さんも使われているchr関数を見つけましたので
一端ordで変換してchrで戻してみました。
449さんも使われているpackも見てたのですが、
ちょと私にはまだ難しかったみたいです(^^;
0457nobodyさん
03/01/24 01:19ID:???453の:とるにたらない人さん:03/01/24 01:06ID: ???
Configuration Error
コンフィギュレーションエラー
The server encountered an error while processing your request.
あなたのリクエストを処理する間に、サーバーはエラーに遭遇しました。
Please contact the administrator of the referring document and inform them of the time the error occurred, and anything you might have done that may have caused the error.
どうか指名しているドキュメントのアドミニストレーターと連絡を取って、そして(彼・それ)らにエラーが起こった時とエラーを起こしたかもしれないあなたがしたかもしれない何でも知らせてください。
0459nobodyさん
03/01/24 01:34ID:???あんたのパソコン。
サーバー上でCGIのテストするな。
後は検索して調べな。
説明ページは探せばいくらでもある。
それ読んで分からないようなら、CGIの改造とか色々考えるな。
改造せずにそのまま設置しようとしてそのエラーなら、配布元の指示に従ってちゃんと行動してないって事。
とにかく書いてある文字を読め。
0461nobodyさん
03/01/24 09:10ID:???■ このスレッドは過去ログ倉庫に格納されています