【Perl】初心者コーナー Part19
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/01/11 13:52ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
あとは>>2-10にまかせた。
0337336
03/01/22 14:43ID:???で十分か。
cd12と聞くと、LINNの240万円のCDプレーヤーが頭に浮かぶわけだが
0339336
03/01/22 14:58ID:???あーこうか
0340336
03/01/22 15:00ID:???何度も失礼...
0342nobodyさん
03/01/22 17:04ID:0PCOHlDz$this=shift;
$this->{fdata}=<パッケージ名::IN>;
でいいの?
$this->{fdata}[$nline]
みたいにしてアクセスしたいんだけど・・・
これだとハッシュ値しか戻ってこない。
0343nobodyさん
03/01/22 17:04ID:???0344246
03/01/22 18:17ID:STZ5+DSpshiftjis "\x87" does not map to Unicode at test.pl line 3, <$file> line 920.
や
shiftjis "\xFA" does not map to Unicode at test.pl line 3, <$file> line 154.
のようなエラーが出てしまいます。これはどういった意味なのでしょうか?
0345nobodyさん
03/01/22 18:23ID:???/(^.*key.*$)/$1/
じゃダメポ。
というのも、とあるテキスト書換えソフトでgrep出来たらいいなと。
0347nobodyさん
03/01/22 18:30ID:???ハッシュ変数に配列をそのまま格納する事はできません。
配列変数のリファレンスを格納するか
その都度、無名配列を作成し、そのリファレンスからアクセスしてください。
0348kazu
03/01/22 19:04ID:dkolKxk/携帯サイトをやっているのですが、
index.cgiとhtaccessで機種の特定を行い、それにあったトップページに自動転送するというシステムをやっております。
i-modeで接続した場合に、「サイトが移動しました」という表示が出ます。
これを解決する方法はないのでしょうか?
0350kazu
03/01/22 19:09ID:dkolKxk/0351nobodyさん
03/01/22 19:16ID:???index.cgi内で携帯ごとに違うページを表示するんじゃないかな。
index.cgi -> UA判別 -> UAに対応したページを出力。
>>348がやってる方法は、
携帯ごとにディレクトリを別にして、index.cgiでそれぞれのディレクトリに飛ばしてるんじゃないかな。
自分で書いたヤツじゃないとか中身を理解していないなら、そのCGIの配布元のURLを出した方がいいよ。
0352nobodyさん
03/01/22 19:23ID:???PCのブラウザだと http://〜/dirname ってすると http://〜/dirname/ になって
結果的に http://〜/dirname/index.htm に辿りつけるんだが、
携帯だとしてくれねえヤツもあるらしいぞ。
振り分け先の設定をチェック汁
0353質問です。
03/01/22 19:51ID:H1d15TWeんですが、うまくいきません。
httpヘッダで振り分けるスクリプトを組んで、PCでそのcgiにアクセスしてきた
ときは「テスト」表示するように作ったのですが、エラー文も出てきてしまいます。
以下がブラウザに出てきた結果なのですが、どういうことでしょうか?
CGI Error
The specified CGI application misbehaved by not returning
a complete set of HTTP headers. The headers it did return are:
テスト
ソース自体が間違ってるのでしょうか? どなたか教えてください。
0355nobodyさん
03/01/22 20:04ID:NW1Un2Sy機種にあったトップページに転送するんじゃなかったのですか?
なんでそうなるんですか?
0356質問です。
03/01/22 20:35ID:H1d15TWeありがとうございます。
うまくいきました。\nとか\rとかの意味がいまだにわかりませんが、
調べたほうがいいのでしょうね。
とにかく助かりました。ありがとう!
0357nobodyさん
03/01/22 21:14ID:TWTRYmp3CGIって拡張子のファイル(web上の)を他人が見ることってできないのですか?
HTMLでもTXTでもJPGでも何でも普通ファイルの中身が返されますよね。
CGIの場合は実行結果しか絶対に返ってこないの?
0359nobodyさん
03/01/22 21:23ID:TWTRYmp3えっと、具体的にはどういう設定だとどうなるのですか?
0360nobodyさん
03/01/22 21:35ID:???CGI専用のディレクトリに入れていたり、CGIスクリプトとして実行するように設定された拡張子をつけていれば実行結果しか返されない。
それでもウェブサーバーを介さないでアクセスされたら覗かれるけどネ
0361nobodyさん
03/01/22 21:35ID:???AddHandler cgi-script .cgi
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サーバーを経由して、見れるようにする
方法ってないでしょうか?
■ このスレッドは過去ログ倉庫に格納されています