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

Perlコーディング初心者質問スレ Part 53

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん2006/11/26(日) 14:38:23ID:SlmGsFMB
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >>2-10

前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0850836=8462007/01/17(水) 12:49:39ID:???
すまん。質問スレで質問に答えるのは厳禁なんだな。
0851nobodyさん2007/01/17(水) 12:52:13ID:???
ああ、テンプレ通りじゃねえってことか orz...
吊ってくるわ
0852nobodyさん2007/01/18(木) 00:58:49ID:???
答えられない低脳君が答えてる奴に文句言うって素敵な空間ですね
0853nobodyさん2007/01/18(木) 01:00:06ID:???
>>851
いや、お前は悪くないよ。
0854nobodyさん2007/01/18(木) 01:08:56ID:???
答えられる奴が答えたらいいので、答えて文句いってるのは一番のカス。
どこにでもいるのでスルーするのがよろしい。ゴキブリホイホイより
0855nobodyさん2007/01/18(木) 01:33:40ID:???
>>854
そんなこと言うなよ。
お前がゴキブリホイホイなら俺はホウ酸ダンゴだ。
0856nobodyさん2007/01/18(木) 10:26:29ID:???
ここは定期的に荒しが沸くのでスルーお勧め
でもテンプレすら読まないのは問題あるな
どっちにしてもスルーでおk
0857みろん2007/01/18(木) 14:03:23ID:2GOHrU8+
どなたか教えてください。
今、perlで掲示板を作っています。そこでリロードによる二重投稿を
防ぎたいのですが、私はlocationをつかってみようと思ってます。
しかし、うまくいきません。どこに記述すれば、送信後自分のページを
再読み込みしてくれるのでしょうか。
0858nobodyさん2007/01/18(木) 14:27:04ID:???
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0859nobodyさん2007/01/18(木) 16:39:22ID:???
現在、CGIにてファイルをダウンロードさせています。

ファイルをOpenし、ContentType等を設定して、
バイナリを出力させダウンロードさせる仕組みです。

しかし、ファイルが存在しなかったり、Openに失敗した場合の処理が、
ファイル名にエラー情報を書いてファイルサイズ0のものをダウンロード
させるくらいしか出来ていません。

ファイルのダウンロードに失敗しましたというダイアログを出すためには、
404 not foundを返せばいいのでしょうか?
0860nobodyさん2007/01/18(木) 16:45:25ID:???
CGIなら「失敗しました」ってブラウザに表示すりゃいいんじゃね?
0861nobodyさん2007/01/18(木) 17:12:53ID:???
404がえし、やってみたら出来ました。
0862nobodyさん2007/01/18(木) 21:28:56ID:???
>>857
location というのがヘッダーの Location フィールドのことなら、書き込んだ後に表示するページで
Location: ジャンプ先URL
をレスポンスヘッダーに追加して、適切なステータスコード(302、303など)を返します。
URLの最後に ? を付けると、ほとんどのブラウザで二重投稿を防止できるみたいです。
詳しいやり方は、使ってるライブラリによって異なるので、自分で調べてみてください。

location が JavaScript の window.location の事でも、基本的に同じですが、板違いです。
0863nobodyさん2007/01/20(土) 14:34:54ID:67i3ErOc
配列の中に重複しないようにURLをいれる処理なんですけど
重複してしまいます。

@http_url = $text =~ /($set{'http_url_regex'})/g;
foreach my $url (@http_url) {
if (!grep(/^$url$/i, @link)) {
print "link : $url\n";
push(@link, $url);
}
}
なぜなのでしょうか?
0864nobodyさん2007/01/20(土) 16:57:02ID:x00E/Fj7
<form enctype="multipart/form-data" action="....cgi">
<input type="text" name="title" size="40"><br>
<input type="file" name="File" size="32"><br>
<input type="submit" name="send" value="送信"><br>
</form>

上のプログラムのように、テキストタイプのデータと画像などのデータを送信するプログラムを作りたいんですが
最初のフォームのテキストデータがちゃんと受け渡せません
multipart/form-dataで送信した際には、cgi側でどのような操作を行えばURLエンコードで送信した場合と同じようにテキストデータを扱えるんでしょうか?
0865nobodyさん2007/01/20(土) 17:15:45ID:???
2chの掲示板のソースコードはどこかで手に入りますか?
0866nobodyさん2007/01/20(土) 19:47:35ID:???
>>863
ハッシュを使うと楽にできるよ。
0867 ◆TWARamEjuA 2007/01/20(土) 19:50:03ID:????BRZ(6701)
>>863
何故っと云われてもわかんないけれどもおそらく恐ろしく効率が悪いみたいです♪

@http_url = $text =~ /($set{'http_url_regex'})/g; # $textからURIらしきものを取り出す。
# @link に追記。(ブロックにしておきますね)
{
 my %link_hash = map +($_, 1), @link; # URIをキーにしたハシュを作る。
 for my $collect_uri (@http_url){
  defined $link_hash{$collect_uri} and next; # キーが存在すれば次。
  push @link, $collect_uri; # キー(URI)が無かったので追記♪
 }
}

これでどうかしら?
@linkにスタックされた順番を考えずに済むのなら他の方法もあるけれども♪
あと、@linkの要素総てに改行が含まれているなら刈り取っておかなきゃです。
0868nobodyさん2007/01/20(土) 20:46:48ID:???
>>865
板違い
0869nobodyさん2007/01/21(日) 04:45:54ID:???
>>864
Googleで"multipart/form-data perl"で検索してみるといいぞ。
検索結果をトップから10件分読めば大体分かる。
0870nobodyさん2007/01/21(日) 09:24:25ID:prBhWU2Q
>>869
検索して、何となくはわかったんですが、深く理解はできませんでした
けどstdio.plというライブラリを見つけました
stdio.plと一緒にダウンロードしたサンプルプログラムのgetMultipartFormDataを使えば何とかなりそうです
返信ありがとうございましたm(_ _)m
0871nobodyさん2007/01/21(日) 12:46:00ID:???
>>870
可能なら CGI.pm を…。
0872nobodyさん2007/01/21(日) 12:54:47ID:???
会員制のサイトで
ID パス 入力で
個人ごとのデータを管理するオープンソースってありますか?
0873nobodyさん2007/01/21(日) 14:19:50ID:???
オープンソースって言いたいだけちゃうんかと。

まあエスパーな俺が無理矢理読み取って答えると、いくらでもあるからよく探せ。
0874nobodyさん2007/01/21(日) 14:21:10ID:???
オープンソースって言いたいだけちゃうんかと。

まあエスパーな俺が無理矢理読み取って答えると、いくらでもあるからよく探せ。
0875nobodyさん2007/01/21(日) 14:29:45ID:???
オープンソースって言いたいだけちゃうんかと。

まあエスパーな俺が無理矢理読み取って答えると、いくらでもあるからよく探せ。
0876nobodyさん2007/01/21(日) 14:35:48ID:???
エスパー居すぎワロス
0877nobodyさん2007/01/21(日) 16:27:20ID:???
>873 伊東さんです。
>874 魔美さんです。
>875 ユンゲラーです。
0878nobodyさん2007/01/21(日) 17:55:44ID:???
世界のエスパーが集うスレと聞いて飛んで来ました
0879nobodyさん2007/01/21(日) 18:22:18ID:???
来てます!
0880nobodyさん2007/01/21(日) 19:41:27ID:???
とうとうナポレオンズの時代が来たようです
0881nobodyさん2007/01/23(火) 10:33:18ID:gVOiAeSh
--------------------------------------------------------
sub mail_okuru{
my($aitemail) = $_[0];

$_[2] = &adebo($_[2]);

$mail = "To: $aitemail\n";
$mail .="From: \日\本\語\名\前 <$mail_add>\n";
$mail .="Subject: $_[1]\n";
$mail .="Content-Transfer-Encoding: 7bit\n";
$mail .="Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n";
$mail .=$_[2];


&jcode::convert(*mail,'jis');

open(MAIL,"|$sendmail -i -t -f $aitemail");
print MAIL $mail;
close(MAIL);
}
------------------------------------------------------------
自動返信メールのアドレスの【日本語名前】のところがどうして文字化けしてしまいます
文字化けしないようにしたのですがどうすればよろしいでしょうか?
お願いします
0882nobodyさん2007/01/23(火) 10:40:39ID:???
文字化けの原因は何だと思う?
0883nobodyさん2007/01/23(火) 10:52:08ID:???
これは普通に検索すれば解決するだしょ
base64でぐぐれよ
0884nobodyさん2007/01/23(火) 12:00:56ID:???
そーゆー問題か?
0885nobodyさん2007/01/23(火) 17:43:26ID:???
From行が・・・
これは気づくまで放置か?
0886nobodyさん2007/01/23(火) 20:24:43ID:???
釣りとみた
0887nobodyさん2007/01/23(火) 22:16:41ID:???
てことは俺は釣れたわけかorz
0888nobodyさん2007/01/23(火) 22:57:35ID:???
mimew.pl入れたら上手く行ったよ
0889nobodyさん2007/01/24(水) 01:37:38ID:???
教えて下さい
flockをローカルテスト鯖で使いたいのですが
Windowsで対応しているのはどのバージョンからでしょうか。
0890nobodyさん2007/01/24(水) 02:39:08ID:???
NT系なら使えるはず。
0891nobodyさん2007/01/24(水) 04:30:09ID:???
xpは動くでしょうか?
0892nobodyさん2007/01/24(水) 05:42:11ID:???
>>891
>>890
0893nobodyさん2007/01/24(水) 06:44:06ID:???
え、flock って Unix 専用じゃなかったの?
NT系で使えるってのは初耳だ
0894nobodyさん2007/01/24(水) 07:03:26ID:???
ソースを見るとwin32/win32.cにwin32_flockというのがあって、非NTのときはcroak、
それ以外ならモードにあわせてLockFileEx/UnlockFileExを呼んでるな
0895nobodyさん2007/01/24(水) 10:50:28ID:???
print "content-type: text/html\n";
print "Set-Cookie: test=test; domain=test.co.jp; expires=$expiredate;\n";
print "\n";

Set-Cookieでdomainを他のサーバーで指定するとcookieが発行されないのですが、
これは何が原因か教えて頂けますか。

domainの値を自サーバーもしくは、domain自体を記述しなければちゃんと発行されます。
0896nobodyさん2007/01/24(水) 11:09:52ID:???
他のドメインのクッキーを勝手に食わされるとセキュリティ上問題あるので
クライアントはそういうのは拒否することになっている。詳しくは
RFC2965(HTTP State Management Mechanism)の3.3.2(Rejecting Cookies)参照

たぶんこれにひっかかったんじゃないか。
0897nobodyさん2007/01/24(水) 12:18:29ID:???
仕様ですな。
08988952007/01/24(水) 13:08:20ID:???
仕様なんですか。ありがとうございます。
そうしたらdomainを入力する項目ってほとんど必要性がないような…(´・ω・)
0899nobodyさん2007/01/24(水) 13:16:44ID:???
example.comで発行するとhoge.example.comやfoo.example.comにも影響する
そこで有効範囲を指定してhoge.example.comのみに発行させることができる
0900nobodyさん2007/01/24(水) 13:19:21ID:???
>>898
example.comでクッキー発行すればauction.example.comでもshopping.example.comでも同じクッキーが使える
auction.example.com(ドメイン省略時の例として)で発行すればそこでしか使えない
0901nobodyさん2007/01/24(水) 14:33:19ID:???
外部のサイトの
http://〜/***.cgi?no=***
というようなページ(のソース)を読み込むことって出来ますか?
09028952007/01/24(水) 14:35:35ID:???
なるほど、ありがとうございました(´・ω・)
09038952007/01/24(水) 14:39:06ID:???
外部のソースですが、
use LWP::UserAgent;
use HTTP::Request::Common qw(GET);
my $ua = LWP::UserAgent->new;

my $url = "http://〜/***.cgi?no=***";
my $request = GET($url);
my $res = $ua->request($request);

if ($res->is_success){
$content = $res->content;
}

といったような形で読めますよ(´・ω・)
0904nobodyさん2007/01/24(水) 15:37:30ID:???
>>903
ありがとうございました。勉強してみます。
0905nobodyさん2007/01/24(水) 15:53:30ID:???
サーバ上でdata.txt(SJIS)をUTF-8に変更の上、
data1.txtとして別名で保存したいのですが
どのようにすればいいでしょうか?

ちなみにperlは設置ができる程度です。
親切な方よろしくご指導ください。
Perl バージョン 5.008004 です。
0906nobodyさん2007/01/24(水) 16:03:41ID:???
読み込み→変換→別ファイルに保存
0907nobodyさん2007/01/24(水) 16:25:47ID:2EUwcZjV
ログなどにデータを保持する場合、配列の区切り文字としてはどんなものを使うのが一般的なんでしょうか?
できるだけ短くてユニークなものが理想的だと思いますが
「普通はこれ使うだろ」といったような暗黙の標準区切り文字みたいなものはありますか?
それとも、コードの中で一時的にユニークな区切り文字に置き換えて処理し、
データに書き込むときは汎用性の高い区切り文字(カンマ等)で統一する、
といった方法の方が一般的なんでしょうか?
「自分はこうしている」という意見でも良いのでよろしくお願いします。
0908nobodyさん2007/01/24(水) 16:28:30ID:???
>906
読み込みと保存はなんとなくこんな感じでしょうか。
変換がよくわかりません
open IN, "data.txt";
$data = <IN>;
close IN;
open OUT, ">data1.txt";
print OUT $data;
close OUT;
0909nobodyさん2007/01/24(水) 16:32:21ID:???
LWP::UserAgentで外部サイトを取得する場合、
指定したURLが転送される場合303 See Otherが出て取得できない。

どうすれば転送後のサイトを取得できますか?
0910nobodyさん2007/01/24(水) 16:50:31ID:???
>>907
データの中に区切り文字を含まないように工夫すればなんでもいいんじゃね?

>>908
本を一冊読むことをおすすめする。
ここで全部を教えるのは難しい

>>909
"LWP リダイレクト"でぐぐった?
09119092007/01/24(水) 17:49:56ID:???
>>910
ありがとう
0912nobodyさん2007/01/24(水) 18:43:46ID:???
>>907
CSVやTSVを使ったり、SQLiteやPgSQLを使ったり。
0913nobodyさん2007/01/24(水) 20:41:48ID:???
自サイトにあるフォームメールにスパムが来るようになりました。
そこで半角のみの投稿は不可にしようと思ったのですが
正規表現だと

$char_check = $form{"message"};
if($char_check =~ /^[^0-9a-zA-Z]$/ ){
 送信
} else {
 エラー処理
}

こんな感じでやってみたのですがうまく動きません。
正しい動作をさせるにはどのように書き直せばいいでしょうか?
0914nobodyさん2007/01/24(水) 21:25:03ID:???
if ($char_check =~ /[^ -~¥r¥n]//) {
 送信
}
0915nobodyさん2007/01/25(木) 05:34:19ID:???
!~ /^[a-zA-Z0-9]+$/
あとURLに使われる文字とか。
0916nobodyさん2007/01/25(木) 16:38:50ID:???
Perlでケータイ電話からのアクセスかどうかを判別したいと考えています。

UserAgentは簡単に偽装できるので、IPアドレスベースの識別をしたいのですが、
アクセス者のIPアドレスがサブネットマスク形式のアドレスで指定した条件に一致しているかどうかを
確認するモジュールはないでしょうか?

つまり、

my $ipType = &IP_Check('127.0.0.1', '127.0.0.0/24');

if ($ipType) {
 print 'ループバックアドレスです。' . "\n";
}

みたいなことができる関数が欲しいです。

よろしくお願いします。
0917nobodyさん2007/01/25(木) 18:21:17ID:???
>>914,915
ありがとうございます。
0918nobodyさん2007/01/25(木) 18:26:22ID:???
>>916
とりあえずCPANでsubnetで検索してみた?
その目的からするとTie::NetAddr::IPがこんな感じで使えてよさそうに見える。試してないが。

tie my $carriersSubnet, 'Tie::NetAddr::IP';
$carriersSubnet{"10.0.10.0/24"} = "CarrierA";
$carriersSubnet{"10.3.20.0/24"} = "CarrierA";
$carriersSubnet{"10.10.2.0/24"} = "CarrierB";

my $carrier = $carriersSubnet{$ipaddr};
0919nobodyさん2007/01/25(木) 18:34:43ID:???
>>916
Net::CIDR
0920nobodyさん2007/01/25(木) 22:54:12ID:???
>>889
winじゃないけど
Mac OSX もunixなので可
0921nobodyさん2007/01/26(金) 07:14:03ID:????BRZ(9100)
Net::CIDR::MobileJP
0922nobodyさん2007/01/26(金) 10:57:39ID:???
Perlで簡単な占いみたいなのを作りたいのですが、どうしてもならないところがあるので
質問させていただきます。

質問を提示してその下にラジオボタンで選択肢を作ります。
で、質問に答えたら次の質問と続いていくわけなんですが。
その選んだ答えを1.と答えたのがが3個 2.と答えたのが4個と最後に合計を出したいの
ですが、合計を出そうとするところができません。

そういう簡単なサンプルとかを提示していただきませんでしょうか?
0923nobodyさん2007/01/26(金) 12:05:11ID:???
>>1を100回読んでこい
0924nobodyさん2007/01/26(金) 12:38:54ID:???
>>922

if ($x eq $a){

   $one++;

} eisif ($a eq $b) {

   $two++;

} else {

   $three++;

}

print "Content-type: text/html; charset=文字コード\n\n";
print '1は' . "$one" . '、''2は' . "$two" . '、' . '3は' . "$three";
09259242007/01/26(金) 12:43:20ID:???
間違えた
if ($x eq $a){

   $one++;

} eisif ($x eq $b) {

   $two++;

} else {

   $three++;

}

print "Content-type: text/html; charset=文字コード\n\n";
print '1は' . "$one" . '、' . '2は' . "$two" . '、' . '3は' . "$three";
09269242007/01/26(金) 13:01:23ID:???
あ、また間違えた
if ($x eq $a){

   $one++;

} elsif ($a eq $b) {

   $two++;

} else {

   $three++;

}

print "Content-type: text/html; charset=文字コード\n\n";
print '1は' . "$one" . '、''2は' . "$two" . '、' . '3は' . "$three";
09279242007/01/26(金) 13:02:48ID:???
これでいいや
09289242007/01/26(金) 13:08:50ID:???
ああまただ
これが正解だ

if ($x eq $a){

   $one++;

} elsif ($x eq $b) {

   $two++;

} else {

   $three++;

}

print "Content-type: text/html; charset=文字コード\n\n";
print '1は' . "$one" . '、' . '2は' . "$two" . '、' . '3は' . "$three";
0929nobodyさん2007/01/26(金) 13:20:33ID:???
連投するならせめて空行を抜けヴォケ
0930nobodyさん2007/01/26(金) 16:52:05ID:???
なんかわろた
0931nobodyさん2007/01/26(金) 20:04:25ID:???
変数しかないのにダブルクオートで囲むのは気持ち悪い。
あとprintf覚えようね。
0932nobodyさん2007/01/26(金) 21:03:20ID:???
>>922 の文章は、複数の質問が1つのページにあるのか、
それとも1つの質問が書かれた複数のページがあるのか、はっきりしない。

前者なら、全ての質問について、選択肢をキーとしたハッシュでも作って集計すればいい。
後者なら、hidden フィールドでも使って、前ページまでの集計結果を覚えておけばいい。
0933nobodyさん2007/01/27(土) 10:46:19ID:F/NZnu0B
perlでBBS作ろうと思っているのですが、
お薦めのBBS向けのフレームワークとかご存じでしたら教えてもらえませんか?
0934nobodyさん2007/01/27(土) 11:18:07ID:???
CGI.pmとテンプレート系モジュールがあれば十分じゃない?
0935nobodyさん2007/01/27(土) 11:29:54ID:???
printfなんか使ったことが無い俺は勝ち組?
今度使ってみるかなぁ。
つっても、%ndぐらいしか使わなそうだけど。
0936nobodyさん2007/01/27(土) 11:34:36ID:???
オレもデバッグのとき見やすくするときぐらいしかprintfって使うことないよ
0937nobodyさん2007/01/27(土) 11:39:50ID:???
sprintfなら使う
0938nobodyさん2007/01/27(土) 13:38:26ID:???
print '1は' . "$one" . '、' . '2は' . "$two" . '、' . '3は' . "$three";
なんて書くくらいなら
printf("1は%d、2は%d、3は%d", $one, $two, $three);
の方が見やすいと思う。もしクォートの対応間違えてSyntax Errorになったら
探すのめんどいから。あとは、
printf("1は%d、2は%d、3は%d", @total{qw(one two three)});
のように書けるとき便利。
0939nobodyさん2007/01/27(土) 16:26:34ID:???
C言語から入ったような人だと、どの言語でもprintf系を使いたくなるらしいからなあ。
いや俺の話だけど。
0940nobodyさん2007/01/27(土) 16:31:24ID:???
print "1は$one、2は$two、3は$three";
0941nobodyさん2007/01/27(土) 17:46:05ID:???
>>938
>>940を見習え。
0942 ◆TWARamEjuA 2007/01/27(土) 18:21:50ID:????BRZ(6761)
${one}
って書いた方が無難かもかも。。
0943nobodyさん2007/01/28(日) 07:39:42ID:???
>>941
>>940 の方が意図しない挙動が起こらないからいいだろ。
0100 をプリントしたい場合
perl -e 'printf "%d", 0100 '
perl -e 'printf "%d", "0100" '
perl -e 'printf "%s", "0100" '
perl -e 'printf "%s", 0100 '
perl -e 'print "0100"'

まあ、printf "%04d", "100" 使えって云うんだろうけど。
0944nobodyさん2007/01/28(日) 08:28:12ID:???
>>924と>>938は0100をプリントしたいんじゃなくて100をプリントしたいのは明らか。
だから>>940でOK。
0945nobodyさん2007/01/28(日) 23:19:16ID:???
CGI::Upload.pmを使ってるんですが
ファイルを保存する方法がわかりません。
どうすればいいんでしょうか?
0946nobodyさん2007/01/28(日) 23:26:29ID:???
CPANのマニュアル見てください
0947nobodyさん2007/01/28(日) 23:35:50ID:???
マニュアルには保存のことまで書いてないです
0948nobodyさん2007/01/29(月) 01:45:42ID:???
書いてあります。ちゃんと見てください。
0949nobodyさん2007/01/29(月) 17:40:11ID:???
for(1..4){
if($pObj->ping($host, $timeout)){
print "$host is running.\n";
} else {
print "$host is not running.\n";
}

PINGが4回送信成功したらall complete
四回とも失敗したときにnot reaction
としたいのですがどこに制御文足せば良いのか教えてください。
0950nobodyさん2007/01/29(月) 18:37:35ID:???
失敗したときのカウント数えれば?
レス数が950を超えています。1000を超えると書き込みができなくなります。