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

Perl コーディング初心者質問コーナー Part34

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001前スレの連投で気分崩したので後よろ04/04/05 16:01ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0877nobodyさん04/05/19 20:03ID:???
勘違いしてるのはお前の方だって。
さっさと消えろ。


では、次の人どうぞ。
087886504/05/19 20:13ID:???
>>877
う〜ん結局誰もわからないか。まあすぐに必要なわけでもないので、地道に色んなページで勉強してきます。
ありがとうございました。
0879nobodyさん04/05/19 20:30ID:???
香ばしい匂いが漂っていると思ったら、なるほど・・・
0880nobodyさん04/05/19 20:52ID:???
HTMLからCGIにSSIで値を渡すときってどうすればいいんでしょうか。
テキストカウンターなのですが、
 <!--#exec cgi="./counter.cgi?id=tes&md=4" -->
とするとSSIエラーが出ます。
?以降を外せば動くんですが・・・。
0881nobodyさん04/05/19 20:59ID:???
>>880
スレ違い
ttp://tohoho.wakusei.ne.jp/wwwssi.htm#Exec
0882nobodyさん04/05/19 21:07ID:???
少しでも気にくわない事があると、「消えろ!」とはねつけて殻に閉じこもってしまう大人になれない>>877。
しかし>>878よ、>>877は決して間違ってはいないんだぞ。そこの所は理解して欲しい。

>>877の本心を明かす男は↓
0883nobodyさん04/05/19 21:08ID:???
さっさと消えろ!
0884nobodyさん04/05/19 21:09ID:???
↑いいや違うぞ!本当の本心は↓
0885nobodyさん04/05/19 21:10ID:???
まんげが生えてきたーーー!!
0886nobodyさん04/05/19 21:11ID:???
>>865
POSTでアップロードしてから戻ると「セキュリティ保護のため、〜〜〜」
ってことならもう少し盛り上がったんだろうけどねぇ。

HTTPヘッダのLocationですっとばすぐらいしか策を思いつかないが、
Perlには関係ないか。
0887nobodyさん04/05/19 21:54ID:???
ちょっと不安になったんですが、
ある一つのデータファイルに対して、二つ以上の
Perlプログラムからファイルの読み書きを行う場合、
flockを使っていれば排他処理は問題ないですよね?
0888nobodyさん04/05/19 22:04ID:???
>>887
スレ違い
0889nobodyさん04/05/19 22:21ID:???
>>887
コード書いて試してからまたきてね。
0890nobodyさん04/05/19 22:33ID:ObBdfHPa
みなさんはじめまして。
以前、板違いのところで質問しまいましたが、親切にこちらを紹介して頂いたので
来た次第です。今回は教えを乞いたく伺いました。

私はsendmailを使ってメールフォームCGIを作ろうとしています。しかし、
No recipient addresses found in headerというエラーが出てしまいます。
エラーは受け取り人のアドレスがヘッダーにないといっているようなのですが、
変数の中にはアドレスがきちんと入っているんです。

現在、いろいろ試して最終的なソースはこうなっています。
$honbunていうのがbody部分(のつもり)です

$sendmail = '/usr/lib/sendmail -t';

if(open(SENDMAIL,"| $sendmail")){;
print SENDMAIL <<"EOM";
From: $motoadr_1
To: $mail_to
Subject: $staff_subj
Errors-To: $errmailadr
MIME-Version: 1.0
Content-Type: text/plain; charset="ISO-2022-JP"

$honbun
EOM
close(SENDMAIL);
}

ヘッダーとボディ部分の間は空行で区切ったのですが、これではダメなのでしょうか?お気付きの方はぜひとも教えてくださいませ。
0891nobodyさん04/05/19 22:57ID:???
>>890
\n\n
0892nobodyさん04/05/19 23:22ID:???
>>890
sendmailに食わしている内容が間違ってる可能性が高いと
思われるので、

open(SENDMAIL,"| $sendmail")

のところを

open(SENDMAIL,"> 適当なファイルのパス")

としてファイルに書き出してよく調べてみることをお勧め
する。

ありがちなのはヘッダ部に埋め込んでいる$ほげほげのどれ
かの末尾に改行がついていて、そこが空行になってしまって
いるって奴だね。
0893nobodyさん04/05/20 00:32ID:UfxuQY5M
#何回も正規表現を使うと
#$1,$2,$3に前回のマッチパターンが入っているからなのかうまく行かないことがあります

$s='921010';
my ($year,$month,$day)=($s=~m/^(\d+)(\d\d)(\d\d)$/);
print "$year,$month,$day\n";

$s2='hogemogesage';

($hoge,$moge,$sage) =($s2= ~m/(hoge)(moge)(sage)/);
print "$hoge,$moge,$sage";

->
92,10,10
4294967295,,Hit any key to close this window...
これを避ける簡単な方法ってないですか?
0894nobodyさん04/05/20 00:39ID:???
>>893
それ、単にコードの間違い。
0895nobodyさん04/05/20 00:45ID:???
>>893
↓のようにきちんと出力されたけど。
92,10,10 hoge,moge,sage
0896nobodyさん04/05/20 00:54ID:???
= ~
0897nobodyさん04/05/20 00:57ID:UfxuQY5M
あれ?何回かやってみたら下の方だけでもダメですた
ばかでした

結局
= ~→=~
お騒がせスマソ
0898nobodyさん04/05/20 02:58ID:746RqQ7w
ディレクトリ中から、内容に特定の文字列を含むファイルを一発でgrepってできますか?
ひとつづつopenしてgrepならできるんだけど。
0899nobodyさん04/05/20 03:14ID:???
そんなんやるべきじゃない。
0900nobodyさん04/05/20 04:43ID:???
>>899
もまいは生きてるべきじゃない
0901nobodyさん04/05/20 05:07ID:???
>>898
grep -nH 特定の文字列 `find ディレクトリ -type f`
# find ディレクトリ -type f | xargs grep -nH 特定の文字列
# find ディレクトリ -type f -exec grep -nH 特定の文字列 {} \;

0902nobodyさん04/05/20 05:55ID:???
>>880
apacheなら
http://httpd.apache.org/docs/howto/ssi.html#includingtheresultsofacgiprogram
0903nobodyさん04/05/20 09:10ID:???
>>876
Cookie使えばいいんじゃない?

090489804/05/20 19:49ID:???
>>901
レスありがと。でもperlだけではできないってことかな。
まじめにひとつづつopenするかー。
0905nobodyさん04/05/20 20:22ID:???
結局誰かが各ファイルを一つずつ open しなきゃならないことには変わりなく、
それを find にやらせるか、それとも perl が自分でやるか、というだけの違い
0906nobodyさん04/05/20 20:25ID:???
初心者ってより天然だな。
0907nobodyさん04/05/20 22:11ID:???
すみません。質問させてください。
perlでレスポンスヘッダに含まれるHTTPのバージョンを
変更したいのですが、できるのでしょうか?
0908nobodyさん04/05/20 22:40ID:???
>>907
出来なくは無い。
ひとつの方法を教えよう、perlでhttpサーバを書け。
0909nobodyさん04/05/20 22:56ID:???
Jcode.pmで半角カナを含んだ文字列を使いたいのですが、どうやらgetcodeが
うまく動かないようですね。で、getcodeを使わずに直で指定して、
$line = Jcode->new($line, 'sjis')->euc;
のようにしたのですが、この$lineをEUC_JPで定義されているDBに渡すと
eucじゃないと言われます。
これは何故なんでしょうか。半角カナの有無を意識せずに文字列を扱うことはできないのでしょうか?
Perl5.6.1、Jcodeは最新のです。
0910nobodyさん04/05/20 23:03ID:???
答えは出てる。
EUCじゃないと言われてるんならEUCじゃないんだよ。
DBに渡している文字コードを再確認
0911nobodyさん04/05/20 23:22ID:???
>>910
typoでsjisじゃなくjisになってましたワン
というか、直に指定してやるしかないのでしょうか?
$lineの入力として複数ファイルを同時に扱う時に、
複数の文字コードがあったりすると困るのですが…。
0912nobodyさん04/05/20 23:25ID:???
Cookie発行について質問です。

    # ローカル変数を定義する
    local ($sec, $min, $hour, $day, $mon, $year, $date);
    # グリニッジ標準時刻を取得する(localtimeは1900年から換算だが、GMTは1970年から)
    ($sec, $min, $hour, $day, $mon, $year, $date) = gmtime (time + 60 * 24 * 60 * 60);
    # 曜日を表すハッシュの文字列を定義する
    $date = ("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday") [$date];
    # 月を表すハッシュの文字列を定義する
    $mon = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec") [$mon];
    # フォーマット指定の文字列を変数へ書き出す
    $vaild = sprintf ("%s, %02d\-%s\-%04d %02d:%02d:%02d GMT", $date, $day, $mon, $year + 1900, $hour + 9, $min, $sec);

この状態で$vaildを見てみると、今日の日付のはずが
Monday, 19-Jul-2004 23:18:34 GMT
のように曜日と月が正確に表示されなくて困ってます。
どの部分を修正すればよろしいのでしょうか。
0913nobodyさん04/05/20 23:34ID:???
すんませんワケわかんないことやってました
↑のこと忘れてください・・・
0914nobodyさん04/05/20 23:37ID:???
>>912
time + 60 * 24 * 60 * 60
これ何してんの?
0915nobodyさん04/05/21 00:18ID:2dDSzz6y
FreeBSD、もしくはLinux と Perl5 で
EAN128バーコードを作成したいのですが、
何か良い方法はありませんでしょうか?
GD::BarcodeではEAN128は出力できないし、
まともなサーバサイドアプリケーションは100万円程するしで
悩んでいます。。
0916nobodyさん04/05/21 00:33ID:???
>>915
そりゃコーディング以前に設計の問題だろ
0917nobodyさん04/05/21 01:06ID:???
Perlモジュールスレで質問していたら Barcode::Code128 を試してみろと教えてあげたところだが
スレ違いなので教えてあげない
0918nobodyさん04/05/21 04:22ID:hNvgkOa1
@ニフティで、
下のどっちのやりかたでもエラーとなってしまうのですが、(ほかサーバではOK)
対処方法ご存じのかたいらっしゃらないでしょうか?
@ニフティ特有の事情ではないかとは思うのですが。
(なんせsendmailすら使えないし@ニフティ)

use Jcode;
Jcode::convert(\$in{'q'}, 'utf8', 'euc' );



require 'Jcode.pm';
Jcode::convert(\$in{'q'}, 'utf8', 'euc' );
091991804/05/21 04:32ID:hNvgkOa1
どうやらuseそのものが使えない気がしてきたんですが・・・
KCatch.pmをおいてuse KCatchしても、エラーがでるし。
092091804/05/21 04:41ID:hNvgkOa1
@nifty では /usr/local/bin/perl しか使えない。 通常は /usr/local/lib/perl5 以下に存在しているはずの標準ライブラリの中で、
動作させたい perl スクリプトが必要とするライブラリを全部転送する必要がある。

ということがわかったのですが、今回のeuc⇒utf8変換をできるようにするためにおいとく必要のあるライブラリはなんでしょうか?
092191804/05/21 06:09ID:hNvgkOa1
http://studioddtonline.web.infoseek.co.jp/plan/niftyefstat.html
を参考にがんばってるんだがねー。。。足りないモジュール大杉にふてー
0922nobodyさん04/05/21 06:18ID:???
ここは日記じゃないぞ
092391804/05/21 06:25ID:???
すみません、もう終わりましたので許してください。20弱のモジュール入れまくった。
0924nobodyさん04/05/21 06:34ID:???
>>907
NPHスクリプト
http://tohoho.wakusei.ne.jp/wwwcgi4.htm#NphScript
0925nobodyさん04/05/21 12:22ID:ERQd2RKf
とほほのPerl入門をコピペ改造中ですが、教えて下さい。

無料HPエリアサービス等で「http://www.server.com/~temp/」が短縮URL「http://temp.server.com」でも表示できる場合、
http://temp.server.com/index.htmを指定しても取得できないファイルが
http://www.server.com/~temp/index.htmで取得できたりするケースがあるんですが、
この場合は「短縮されてないURL」をどのように察知すればよいのでしょうか。

http://tohoho.wakusei.ne.jp/wwwperl2.htm#Sockets
↑コピペ中のソース
0926nobodyさん04/05/21 13:16ID:???
ログの特定の場所のみを書き換える方法ってどんなのがありますか?
例えば
00000000000
00000000000
という内容のログファイルがあったとして、2行目の左から5番目の文字だけを0から1に書き換える等…
0927nobodyさん04/05/21 13:17ID:???
seek
092892604/05/21 13:25ID:???
ありがとうございました
0929nobodyさん04/05/21 13:26ID:???
DBD::Pgで、
$sql = "SELECT foo FROM table WHERE bar = ? OR bar = ? OR bar …";
$sth = $dbh->prepare($sql);
しておいて、
@array = ("hage", "hige", "huge");
$sth->execute(@array);
$ref = $sth->fetchall_arrayref();
みたいなことをしたいのですが、0個以上の可変個数の要素をバインドするときって
SQL文の宣言はどういう風にすればいいのでしょうか?
要するにWHEREのOR bar = ?の個数が動的に変化して困るって事なんですが…。
0930nobodyさん04/05/21 15:45ID:???
>>925
404などのエラーになるかどうか
0931nobodyさん04/05/21 15:54ID:???
>>929
固定されたSQL文を使い回すのが bind で、
要素が可変個数になるということはSQL文も可変なはずだから、そもそもダメ。
個数が確定してから prepare せんといかん。

SQLの書き方や考え方の話は、ここよりもDBIスレあたりが妥当だろう。
0932nobodyさん04/05/21 16:18ID:???
>>931
では@arrayを受け取ってから、joinか何かで動的にSQL文を生成して
prepare、つかそういうやり方ならdoをするしか無いって事ですかね
093392504/05/21 16:32ID:ERQd2RKf
>930
「短縮されてないURL」を知るべき必要がある事をどこで察知するかじゃなく、
「短縮されてないURL」を知る方法、
ないし短縮URLでもファイルをダウンロードする方法を教えて下さい。
0934nobodyさん04/05/21 16:47ID:???
>>933
>「短縮されてないURL」を知る方法
そんなものはアクセスしなけりゃわかるわけがない。

>短縮URLでもファイルをダウンロードする方法
長いURLから短縮URLを推測して試すしかない。

スレ違いなのでここまで
0935nobodyさん04/05/21 19:38ID:???
>>925
コピペはやめて、こっちで基礎から勉強。
http://x68000.startshop.co.jp/~68user/net/
093692504/05/21 20:15ID:???
>935
すっげ、1行追加で動くようになったわ。
thx!
093791504/05/21 20:27ID:2dDSzz6y
>>917
(笑) 親切に教えてくれて有難う。
Barcode::Code128、大変参考になりました。
093890704/05/21 21:58ID:jMqF5hwG
>>924 さん
ありがとうございます。やってみます。
0939nobodyさん04/05/22 06:36ID:???
質問です。
perlスクリプトでGETメソッドから文字列を取り出したいんですが、文字列に半角#が含まれていると#とそれ以降が無視されてしまうんですが回避方法はないでしょうか?

ソース抜粋です。
$buffer = $ENV{'QUERY_STRING'};
@temp = $buffer;
foreach $x (@temp) {
 ($name, $value) = split(/=/, $x);
 $FORM{$name} = $value;
}
$str = $FORM{'str"};

これで $str には#が入ったとき以外は **tp://localhost/test.cgi?str=文字列 の文字列が思ったとおりに取り出せます。
半角=が入ったときもおかしいですが、それは使用予定のケースにないので今回はどうでもいいです。

テストサーバーの環境は
WindowsXP SP1
apache_2.0.47
ActivePerl-5.8.0.806
このようになってます。
よろしくお願いします
0940nobodyさん04/05/22 06:40ID:???
間違いがありました。
>$str には#が入ったとき以外
入りません。
#の直前までしか入りませんでした。
ちなみに $buffer にも#以前までしか入っていないようです
0941nobodyさん04/05/22 06:56ID:???
#以降はfragmentだよねえ
0942nobodyさん04/05/22 07:05ID:???
>>939
>>941さんの通り、URIでは'#'以降はフラグメントとして扱われるので、
'#'を'%23'にエスケープしておく。
CGI側で元に戻す。

いろいろ問題の多そうなソースなんで、
どこかのスクリプトを参考にして作ってださい。
(CGI.pmを使うのが一番なんだけど)
0943nobodyさん04/05/22 07:10ID:???
>>939
str=文字列 の部分に使える文字は決まってるから、
それ以外のものを使いたい場合はURLエンコードしなきゃいけない。
<scheme>://<authority><path>?<query>#<anchor>
#はこんな風に(HTMLの)アンカーとして使うと決まってるので、
鯖にも($buffer)として渡ってきてないんじゃないかな。
詳しいことはrfc2396あたりかな。英語読むと眠れなくなるんで自分で確かめてください . 。oOオヤスミ
0944nobodyさん04/05/22 07:17ID:???
>>941-943
レスを参考に調べていろいろ試してみます。
ありがとうございました。
0945nobodyさん04/05/22 07:24ID:???
試すも何も答え書いてあんじゃん
0946nobodyさん04/05/22 13:02ID:prWBgoDS
ダウンロードカウンタを設置しようと思って
http://www.csmoon.com/prog/dcnt.html ここにあるサンプルCGIを設置したんだけど
なぜかinternal Server Error が出まくって全然動かない

環境はRed Hat Linux + Apache 2.0.48です
パーミッション、転送法などが原因かな?
だれか教えて!
0947nobodyさん04/05/22 13:25ID:???
あんまり面白くないな。2点。
0948nobodyさん04/05/22 14:43ID:???
>>946
>>1を100回、大きな声を出して読め。
0949nobodyさん04/05/22 16:46ID:???
そんなここで読むのですか?
はずいです
0950nobodyさん04/05/22 16:53ID:???
恥辱プレーだから。
0951座敷荒氏04/05/22 19:43ID:PaJLGSDA
教えてくださいませm(_ _。)m
以下、内容を自分宛にメールで送信する部分です。
「$in{'_email'}」は相手のメアドをFrom:にしないで、
本文のほうに載せたい場合どうしたらいいのでしょうか?
**************************
if (!open(OUT,"| $sendmail -t")) { &error("異常停止","$!","back"); }

print OUT &jis("X-Processed: $date_now\n");
print OUT "X-SENDER: $REMOTE_HOST\[$REMOTE_ADDR\]\n";
print OUT &jis("X-AGENT: $HTTP_USER_AGENT\n");
print OUT "From: $in{'_email'}\n";
print OUT "To: $mailto_order\n";
print OUT &jis("Subject: $mail_subject [$date_num]\n");
print OUT "Content-Transfer-Encoding: 7bit\n";
print OUT "Content-Type: text/plain; charset=iso-2022-jp\n\n";

print OUT "\n";
foreach (@in) {

s/"/"/g;
s/&/&/g;
s/</</g;
s/>/>/g;

if (/^\.\t(.*)/) { print OUT &jis("$1\n"); }
elsif (/(.*)\t(.*)/) { print OUT &jis("[$1] $2\n"); }
}
print OUT "\n";

print OUT &jis("$sign\n");
close(OUT);
**************************
0952nobodyさん04/05/22 20:20ID:???
てにをはがおかしい上に何をしたいのか分からん。
0953座敷荒氏04/05/22 20:44ID:PaJLGSDA
>>952
いまはメールの差出人のところに変数$in{'_email'を入れてますが
メール本文の一行目に入れるように変更したということです。

よろしくおねがいします。
0954座敷荒氏04/05/22 20:57ID:???
>メール本文の一行目に入れるようにメール本文の一行目に入れるように変更したということです。
入れるように変更したいということです。

訂正でつ(/_<。)
0955nobodyさん04/05/22 21:24ID:???
Perl語も日本語も不十分だと不便だろ。
幼稚園生からやり直せ。
今のお前に必要な事だ。
0956座敷荒氏04/05/22 21:26ID:???
あはは
0957nobodyさん04/05/22 21:46ID:???
>Perl語
0958nobodyさん04/05/22 21:58ID:???
>>951はマルチなので放置
095982304/05/22 22:57ID:???
やっぱわがんね;;
0960nobodyさん04/05/22 22:59ID:???
>>959
monazillaのサイトになんか解説があった気がする。あと、RFCよめば?
0961nobodyさん04/05/22 23:22ID:???
>>959
ttp://age.s22.xrea.com/talk2ch/
ここのDAT差分を取得のところ。
096282304/05/22 23:24ID:???
RFCっていっぱいあってどうすればいいのか・・・
0963nobodyさん04/05/22 23:34ID:???
>>962
RFC2616。Rangeはページ138。
http://www.ietf.org/rfc/rfc2616.txt
0964座敷荒氏04/05/22 23:45ID:???
あーぁー
096582304/05/22 23:49ID:???
>>961
おそらくRange: bytesで比較するのですね。
>>963
Range Retrieval Requestsというのがありましたので、たぶんそれっぽいですね

皆様お手数かけてすいませんでした。
今日はもう時間なので、明日がんばってみますです。
ありがとう〜
0966nobodyさん04/05/23 18:00ID:fkswZRQD
$hoge = "今日はスノボーに行った。";
$str = "スノボー";

if( $hoge =~ /$str/){
}

こうするとこういうエラーが出るのですが、どうすれば直りますか。
Unmatched [ before HERE mark in regex m/スノボー << HERE / at hoge.cgi line xx.
0967nobodyさん04/05/23 18:09ID:???
\Q\E
0968nobodyさん04/05/23 18:59ID:fkswZRQD
>>967

if( $hoge =~ /\Q$str\E/){
}

こうやったらうまくいきました。
だいたい意味はわかったのですが、日本語を正規表現する時はいつも
\Q\Eで囲まないといけないのですか?
0969nobodyさん04/05/23 19:52ID:???
>>968
残念ながら、おそらくSJISをつかうなら
0970nobodyさん04/05/23 20:33ID:???
>>969
かといってEUCは一バイトずれでマッチする問題がおきやすかったりで、
よほど注意しないと日本語の正規表現はお勧めできない。

use utf8にしちまえば大丈夫らしいけど、それはそれで今度は正規表現
以外の点でいろいろめんどくさいことがあるしなぁ。
0971nobodyさん04/05/23 23:42ID:???
SJISでマッチさせると\Q\Eしても意図しないところで
マッチするから気をつけろ。
0972nobodyさん04/05/23 23:57ID:???
結局、正規表現で日本語を扱うときはどの文字コードが良いの?
いつも普通にSJIS使ってるけど
0973nobodyさん04/05/24 00:00ID:???
漏れも新規に作るサイトは UTF-8 に切替えた。HTMLもDB(Pg)も全部 UTF-8 なので割と楽。
しかし既存サイトを一部だけ UTF-8 にするんだと死にそうだ。
0974nobodyさん04/05/24 06:52ID:???
ただの文字列マッチなら、string::multibyteのindex。
マルチバイト文字を考慮して作られているので、
ずれた位置でマッチすることもありません。

Perl version 5.8.0以降なら、encoding。
マルチバイト文字の正規表現も素で使えるようになります。
(5.8.1以降ならtr///も対応。)
0975nobodyさん04/05/25 07:37ID:???
おはようございます。質問させてください。
perlでリクエストヘッダのHTTPバージョンを任意に変更したいのですが、
実現できる方法はあるでしょうか?

どなたかご回答お願い致します。よろしくお願いします。
0976nobodyさん04/05/25 07:41ID:???
>>975
何のコーディングが分からないんですか?
レス数が950を超えています。1000を超えると書き込みができなくなります。