Perlコーディング初心者質問スレ Part 40
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/01/27 18:08:42ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0161未承諾広告※ ◆TWARamEjuA
05/02/05 21:13:22ID:???0162149
05/02/05 21:15:54ID:???ありがとうございました。スペースを削除したら上手くいきました。
>>151
リファレンスにせずに、普通に
@post_check_list = ($name ,$mail, $honbun…
としたら上手くいきました。ありがとうございます。
>>155,>>157
それだと、名前欄に「ほげほげ fusianasan」などと入れたときに
ほげほげが消えてしまいます。
0163nobodyさん
05/02/05 21:39:54ID:???勘違いしてるみたいだけど、~ は正規表現の先頭に付ける文字じゃないからね。
後半のソースは左辺値がないからたまたま期待通り動いてるだけ。
どういう意味があるのかは調べてみてください。
0164nobodyさん
05/02/05 22:35:02ID:???$name = ~/fusianasan/;
これは
$name = (~($_ =~ m/fusianasan/));
と同じ意味。
0165nobodyさん
05/02/05 23:56:22ID:5Rr9/6OZprint << " END_OF_PRINT";
処理
END_OF_PRINT
って書くけど、
こんな時に処理部に例外処理が沢山あって
print << " END_OF_PRINT";
処理A
END_OF_PRINT
print << " END_OF_PRINT";
処理B
END_OF_PRINT
・・・
ってな感じで細かく使わないといけないけど普通のprint文を使うまでも無いって時はどうしてる?
なんかソースが汚く見えるんだよね。
0166nobodyさん
05/02/05 23:58:48ID:???意味わかんないんだけど。
スペースも意味わかんない。
0167nobodyさん
05/02/06 00:31:46ID:???例えとしてもそんなこと書いているようでは汚いのは当然かも。
0168nobodyさん
05/02/06 00:44:01ID:???0169nobodyさん
05/02/06 00:48:00ID:???0170nobodyさん
05/02/06 00:52:30ID:???0171nobodyさん
05/02/06 01:13:35ID:???サブルーチンを分けるか、ファイルを分ける。
スペースは意味わかんないから __END_OF_PRINT__ とか書く。
0173165
05/02/06 02:10:26ID:???0174nobodyさん
05/02/06 05:39:04ID:???一度変数に入れてしまう。
my $str_a =<< " END_OF_PRINT";
処理A
END_OF_PRINT
my $str_b =<< " END_OF_PRINT";
処理B
END_OF_PRINT
print $str_a;
# 何か処理
print $str_b;
0175nobodyさん
05/02/06 11:18:05ID:???処理A
EOT1
処理B
EOT2
0176nobodyさん
05/02/06 12:36:07ID:???@{[...]}とか使えばなんでも書けるけどさ...
0177nobodyさん
05/02/06 13:01:53ID:???0178nobodyさん
05/02/06 13:03:56ID:???綺麗とかそういう基準なんて、誰かが勝手に言い出した物で、
別に基準なんかじゃないんだからさ。
自分が後から見て理解できるように書けばいい。
0179nobodyさん
05/02/06 13:17:10ID:???0180nobodyさん
05/02/06 13:32:38ID:???複数ファイルのCRC16チェックを行い、その結果を表示するCGIを作ったのですが
1ファイル毎に結果が送られなくて、10個ほど毎にブラウザに返してきます。
これを1個づつこまめにレスポンスを送るにはどうすれば良いのでしょうか?
Unixの場合は $|=1 等で手段が有るようですが、Windows環境では無理でしょうか?
0181nobodyさん
05/02/06 14:53:09ID:???スレ違い
△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
0182180
05/02/06 14:55:56ID:???0183nobodyさん
05/02/06 16:44:56ID:fwG0kktYテキストエリアに表示させる時、改行文字は何になるのですか?
<TEXTAREA COLS=65 ROWS=5 NAME=\"ets\">$ets</TEXTAREA>
と記述し、$etsのデータの改行したいところに\nとか\rとか\r\r\nとか
入れてみたのですが、そのまま表示されます。
0184nobodyさん
05/02/06 16:46:35ID:???スレ違い
△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
0185nobodyさん
05/02/06 17:25:47ID:???0186nobodyさん
05/02/06 17:28:45ID:???$ets = '〜\n'; みたいにシングルクオーテーションだと \n 、
$ets = "〜\n"; みたいにダブルクオーテーションで書けば 改行 で入ると思う。
0187nobodyさん
05/02/06 17:43:51ID:???0189nobodyさん
05/02/06 17:51:47ID:???普通に質問に答えてあげればいいと思うが。
0191nobodyさん
05/02/06 18:27:46ID:fwG0kktYありがとうございます。
まだうまく行きませんが、WebProg 初心者の質問 Part11の方で
継続して質問しています。
0194nobodyさん
05/02/06 19:29:14ID:???自治初心者スレとか必要だな(w
0195nobodyさん
05/02/06 23:57:25ID:???0196nobodyさん
05/02/07 10:09:59ID:Xo+VK5jqメールアドレスをそのまま入力してもらうと正規表現がたいへんなので、
@はこちらで用意して左辺と右辺を別々に書いてもらうことにしました。
入力スペース @ 入力スペース
こんな感じです。そして不正なアドレスだと感知したらメールを送るのをやめます。
右辺は英数字とピリオド以外が混入していたら中止。
左辺は何が混入していたら中止にすればいいのでしょうか?
確かメールアドレスに含んでよい記号ってかなりありますよね;
@を除いてそれら以外が混入してれば中止とすれば安全なのでしょうか?
0197nobodyさん
05/02/07 10:28:38ID:???よくXSS対策などと言いますが、リファラーを取ってマッチングしない場合は
別の処理をするみたいな事をすればXSSなんて起こりませんよね?
もちろん結局はしないと変なスクリプト掲示板に埋められたり、注文客が
思いっきりスクリプト攻撃したりということがありますが、それってXSSでは
ないですよね。
つまりXSS対策って実はリファラーだけ取れば回避できるんですよね?
それともXSSっていうのの意味には前段落で挙げたようなことも含まれているんでしょうか?
0198sage
05/02/07 10:41:49ID:+1BETA+W既存のスクリプトを使用した方が早くないか?
>確かメールアドレスに含んでよい記号ってかなりありますよね
普通はアルファベットと数字、アンダーバーやハイフン程度だろ
>>197
しかしそう簡単にはリファラーを渡さないのがノートン先生ですよ
0199196
05/02/07 10:55:01ID:Xo+VK5jqドメイン側は
$domain =~ /[^\w\.]/;
としていてこれにマッチするなら不正と考えます。
ユーザ名側は確か通常URIに含められる文字列なら全て含めることができたような記憶があるんですよね;
print MAIL "to: ".$user.'@'.$domain."\n";
みたいにするんですが、UNIXには詳しくないのでどういう文字列を渡すと危険なのかが
把握できていません・・・
$user =~ /[^\w\-]/;
これだと実際には正常なアドレスなのに送れないケースが出てくると思うんですよね。
やはり既存のフォームメールスクリプトを探すのが早いですかね?
さっきPerlメモ読みましたが、ユーザ名側で何をエスケープするべきかは書いてなくて
ややこしいコードだけがありました。
ユーザ名側に含めることができる記号一覧があるRFC文書を探してますが、
英語に悪戦苦闘ですorz
0200nobodyさん
05/02/07 10:55:14ID:???正規表現以外でやろうとする方が大変。
ちなみに携帯のメールアドレスとか規格に則してなかったような。
>>197
リファラは偽装できる。
0201197
05/02/07 11:15:16ID:???やっぱ俺って天ちゃんなのね
0202nobodyさん
05/02/07 11:15:29ID:???>>198
メールアドレスのローカルパートって他の世界のメールシステムとの
やりとりもありうるので適切にエスケープすればほぼなんでもありの
仕様になっています。rfc2821の4.1.2にBNFがあるのでLocal-partって
とこを見ればいいですが、「"」でくくってQuoted-stringにすれば\を
前に置くことでCR,LF以外の任意の文字を書くことが出来ます。
くくらない場合は、英数字または「!#$%&'*+-/=?^_`{|}~」からなる1文字
以上の文字列、またはそれをを「.」をはさんで複数つなげたものが許され
ます。ただし、一部のケータイなどで連続した「.」を含んだり末尾が「.」
で終わる仕様に違反したアドレスを許しているので、あまり厳しくチェック
すると文句がでるかもしれません。
これを気にしなくてよければEmail::Validそのままでいいんだけどね。
0203nobodyさん
05/02/07 11:16:20ID:???http://bbq.uso800.net/code.html
にあるBBQによる方法で導入してみました
動作確認したいのですが公開串って何処で公開されてるんでしょうか
0204nobodyさん
05/02/07 12:26:41ID:???perlに関係ないじゃん。
rfcでアドレスに使える文字を調べないさいよ。
>>203
板違いだね。
初級ネット板かセキュリティ板へ。
0207nobodyさん
05/02/07 13:29:03ID:???0208nobodyさん
05/02/07 15:47:18ID:???壊れますよね。
いわゆる排他処理って言うと思うんですが、今まで一度もやったことがありません。
Perlの経験はネットショップをmysqlとの連携で構築したりその他ちまちましたものばかりです。
基本的にファイルではなくDB連動ばかりだったので勝手に排他処理をしてもらってたせいで。
どこかPerlでやる排他処理について詳しいサイトありますか?
一応windowsでもUNIXでも共通の方法を探してます。
0210nobodyさん
05/02/07 19:09:05ID:???今回は違う人が誘導したんでしょ。
誘導厨フォーマットじゃないし。
↓
>>000
スレ違い
△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
0211未承諾広告※ ◆TWARamEjuA
05/02/07 19:20:38ID:???【BBQ 3本目】公開串登録所 【ピンポイント規制】
http://qb5.2ch.net/test/read.cgi/sec2chd/1105274729/l50
ここを眺めればいくらでも(w
0213nobodyさん
05/02/07 21:02:12ID:???0214nobodyさん
05/02/07 21:42:44ID:???0215nobodyさん
05/02/07 21:54:28ID:???0217nobodyさん
05/02/07 23:02:26ID:???0218nobodyさん
05/02/07 23:05:47ID:???#!/usr/bin/perl
require './require.pl';
&hogehoge;
# hogehoge2を呼び出さずに終了
exit;
-------------------------
# require.pl
sub hogehoge{
(中略)
}
sub hogehoge2 {
(中略)
}
--------------------------
この場合に呼び出していない、require.plのhogehoge2はコンパ
イルされるのでしょうか。
それとも、呼び出さなければコンパイルされないのでしょうか。
教えていただければ幸いです。
0219nobodyさん
05/02/07 23:18:56ID:???ttp://homepage1.nifty.com/glass/tom_neko/web/web_04.html
http://web.archive.org/web/20040216083853/www98.sakura.ne.jp/~jun/perl/flock.html
0221nobodyさん
05/02/07 23:39:55ID:Cfgr4b2rEmail::Valid
Email::Valid::Loose
Docomoの変なのもおっけ
到達可能かもみます
0222nobodyさん
05/02/07 23:43:35ID:???コンパイルされますか…
# main.cgi
#!/usr/bin/perl
$_ = 1;
if ($_ == 1){ require './require1.pl }
elsif ($_ == 0){require './require2.pl'}
&hogehoge;
# require2.plを呼び出さずに終了。hogehoge2を
# コンパイルしない分負荷が減る
exit;
----------------------
# require1.pl
sub hogehoge {
(中略)
}
----------------------
# require2.pl
sub hogehoge2 {
(中略)
}
-----------------------
みたいな感じで別ファイルにして対処しようと
思います。ありがとうございました。
0223nobodyさん
05/02/08 02:09:22ID:???0224nobodyさん
05/02/08 02:15:40ID:???0225nobodyさん
05/02/08 02:54:05ID:???0226nobodyさん
05/02/08 03:39:12ID:???0227nobodyさん
05/02/08 03:43:09ID:???なんでこんなに即レスなの?
0228nobodyさん
05/02/08 03:51:50ID:???0229nobodyさん
05/02/08 13:26:19ID:???いつも誘導に反応する奴なんてまったくいないのに。
何人もいるように見せかけているが、近い時間に書いてるし。
いずれにしても注意してるヒマがあったら、ここでも誘導先でも
答えてやればいいのに。
0232nobodyさん
05/02/08 16:58:30ID:???みなさんはページ移動をどうやってますか?
私は今まで
if ( $form{page} eq "hoge") {#hogeページの処理
}elsif( $form{page} eq "hage" ){#hageページの処理
}
こうしてました。で、ふと思ったのですが、もしかしてページごとにサブルーチンに
しておいて、$form{p}の値を見てどのルーチンを呼ぶかを分岐させた方が
わかりやすいかもって。
みなさんはどうやってますか?
0235nobodyさん
05/02/08 18:48:30ID:???同じぐらいに時間に登場とはわかりやすい。
0236nobodyさん
05/02/08 19:24:33ID:???お前に何の権利があるんだよとか、いちいち注意してんじゃねーよとか
意味不明な反抗をする高校生みたいになってきてるな。
0237nobodyさん
05/02/08 19:25:19ID:???0239nobodyさん
05/02/08 21:45:37ID:???そこで画像サイズを取得し、<img width="***" height="***" src="***">のように書き出そうと
Image::Size を使用しようとしましたがサーバーにはインストールされておらず、 Size.pm を設置する事にしました。
ローカルでは README.win32 に書かれたとおりの編集をし
perl/site/lib/Image/Size.pm に置く事で動きました。
サーバーに設置する事も想定し、スクリプトのあるフォルダに
lib/Image/Size.pm と設置し、スクリプトに use lib "lib"; の記述で動くことも確認しました。
そして、サーバーに同様の構造で「未編集」の Size.pm を設置しましたが動きませんでした。
# 正確にいうと ($width, $height) = imgsize("$file_name"); で止まるようです。
しかし、 README.win32 に書かれた編集を施した Size.pm では無事に動きました。
実際にした編集というのは use AutoLoader 'AUTOLOAD'; と __END__ の2行を消しただけです。
何故、 Win 用の編集で動くようになったのでしょうか?
動くようになったこと自体はいいのですが、サーバー側に迷惑をかけてる可能性はありますでしょうか?
0240質問
05/02/08 22:09:04ID:???↓
表示したリストからpptファイルへリンク
これって出来ますか
0242nobodyさん
05/02/08 22:16:03ID:???君が初心者なのはわかった。
でも君がやろうとしてる事はちょっとだけ初心者の域を抜けかけてる。
初心者が下手にやると危険。
中級者になってから挑んでください。
0243239
05/02/08 22:44:01ID:???危険な事だという事はわかりましたので、素直に Image::Size を
サーバー管理者にインストールして貰うようにメールしてみます。
あと、私の犯した過ちは Win 用のファイルをあげた点で間違いないでしょうか?
0244nobodyさん
05/02/08 23:20:35ID:???自分のスクリプト内に、サイズ求めるソース組みこだらいい。
検索したら何かあるでしょ。
0246nobodyさん
05/02/09 00:34:32ID:???いいや。今のまま使い続けても、何も心配する必要は無い。
Image::Size は様々な形式の画像ファイルのサイズを得る機能を有しているが、
ある特定の形式(例えばgif)のみのサイズを得たい場合
には、その形式に必要な機能のみを、メモリに展開すれば済む。
そこで、実際に指定された画像形式に応じて必要な機能のみを
実行時にメモリに展開するのがAUTOLOADだ。
> 実際にした編集というのは use AutoLoader 'AUTOLOAD'; と __END__ の2行を消しただけです。
それをやると、Image::Size が対応しているあらゆる画像形式の
機能が全てメモリに展開されることになる。だから、メモリ容量が
多少無駄になるが、特に支障があるというわけではない。
0247nobodyさん
05/02/09 00:52:14ID:cKLRZBQZ0248nobodyさん
05/02/09 07:37:58ID:???cryptは8文字目以降は無視するようなので
crypt以外で8文字以上の文字列を暗号化する良い方法を教えてください
0251nobodyさん
05/02/09 10:13:54ID:???CGI.pmを使用して、クライアントからファイルのアップロードをさせたいのですが・・・
コードはこちらです。
#!/usr/bin/perl
use strict "vars";
use strict "subs";
use CGI;
print "Content-typt: text/html; charset=euc-jp\n\n";
our $fh;
our %columns{upload_file} = $query->param(’upload_file’);
&hozon();
sub hozon() {
my $query = new CGI;
$fh = $query->upload(’upload_file’);
print ”$fh<BR>”;
while(<$fh>) {
print "$_<BR>"
}
}
というコードだと、ブラウザにwhileの中の$_の内容を出力できないのです。
print ”$fh<BR>”;はきちんとファイルパス名が出力されます
ここでour $fhと宣言しますが、これを削除し、
my $fh = $query->upload(’upload_file’);
とローカルとして宣言するとブラウザに出力される事になります。
何が原因なんでしょうか?
0252nobodyさん
05/02/09 10:50:26ID:???空白や記号が全角になってるのを半角に直してperlに食わせてみたが
そもそも構文エラーでるじゃん。実際におかしいものと違うコードを
見せられてもなぁ。
0254251
05/02/09 11:27:13ID:???書き込むときってみやすいように全角使ったんですけど、
こういうのって直接コード書いたほうがいいんですかね?
#!usr/bin/perl
use strict "vars";
use strict "subs";
use CGI;
print "Content-typt: text/html; charset=euc-jp\n\n";
our $fh;
our %columns;
&hozon();
sub hozon() {
my $query = new CGI;
$columns{upload_file} = $query->param('upload_file');
$fh = $query->upload('upload_file');
print "$fh<BR>";
while(<$fh>) {
print "$_<BR>";
}
}
0255nobodyさん
05/02/09 11:54:12ID:???Cでいったら/* */見たいなやつです。
0257nobodyさん
05/02/09 14:01:11ID:???Content-typtという打ち間違いがある状態でまともに動いて
いるとは思えないのだが、そのコードでちゃんとおかしな現象が
再現してるのを確認してるかい? おかしい現象が起きてるものを
そのまま出してもらわないと付き合いきれんよ。
ちなみにそのtypoを直して実行してみたところ、そのコードで
普通にファイルの中身も出力された。
0258251
05/02/09 14:43:07ID:???実際に動かしているコード
#!/usr/bin/perl
use strict "vars";
use strict "subs";
use CGI;
print "Content-type: text/html; charset=euc-jp\n\n";
our $fh;
our %columns;
&hozon();
sub hozon() {
my $query = new CGI;
$columns{upload_file} = $query->param('upload_file');
$fh = $query->upload('upload_file');
print "$fh<BR>";
while(<$fh>) {
print "$_<BR>";
}
}
やっぱりこれで、ブラウザに表示されないですね。
$fhにはC:\Documents and Settings\hogehoge\デスクトップ\新規テキスト ドキュメント.txtと出力されます。
$fh = $query->upload('upload_file'); を my $fh = $query->upload('upload_file'); にして
our $fh; を #our $fh;
にするとすべてブラウザに出力されますね。
リファレンスとか絡んでるんだろうか?
■ このスレッドは過去ログ倉庫に格納されています