Perl コーディング初心者質問コーナー Part34
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001前スレの連投で気分崩したので後よろ
04/04/05 16:01ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0877nobodyさん
04/05/19 20:03ID:???さっさと消えろ。
では、次の人どうぞ。
0879nobodyさん
04/05/19 20:30ID:???0880nobodyさん
04/05/19 20:52ID:???テキストカウンターなのですが、
<!--#exec cgi="./counter.cgi?id=tes&md=4" -->
とするとSSIエラーが出ます。
?以降を外せば動くんですが・・・。
0882nobodyさん
04/05/19 21:07ID:???しかし>>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:???POSTでアップロードしてから戻ると「セキュリティ保護のため、〜〜〜」
ってことならもう少し盛り上がったんだろうけどねぇ。
HTTPヘッダのLocationですっとばすぐらいしか策を思いつかないが、
Perlには関係ないか。
0887nobodyさん
04/05/19 21:54ID:???ある一つのデータファイルに対して、二つ以上の
Perlプログラムからファイルの読み書きを行う場合、
flockを使っていれば排他処理は問題ないですよね?
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);
}
ヘッダーとボディ部分の間は空行で区切ったのですが、これではダメなのでしょうか?お気付きの方はぜひとも教えてくださいませ。
0892nobodyさん
04/05/19 23:22ID:???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...
これを避ける簡単な方法ってないですか?
0896nobodyさん
04/05/20 00:54ID:???0897nobodyさん
04/05/20 00:57ID:UfxuQY5Mばかでした
結局
= ~→=~
お騒がせスマソ
0898nobodyさん
04/05/20 02:58ID:746RqQ7wひとつづつopenしてgrepならできるんだけど。
0899nobodyさん
04/05/20 03:14ID:???0901nobodyさん
04/05/20 05:07ID:???grep -nH 特定の文字列 `find ディレクトリ -type f`
# find ディレクトリ -type f | xargs grep -nH 特定の文字列
# find ディレクトリ -type f -exec grep -nH 特定の文字列 {} \;
0902nobodyさん
04/05/20 05:55ID:???apacheなら
http://httpd.apache.org/docs/howto/ssi.html#includingtheresultsofacgiprogram
0905nobodyさん
04/05/20 20:22ID:???それを find にやらせるか、それとも perl が自分でやるか、というだけの違い
0906nobodyさん
04/05/20 20:25ID:???0907nobodyさん
04/05/20 22:11ID:???perlでレスポンスヘッダに含まれるHTTPのバージョンを
変更したいのですが、できるのでしょうか?
0909nobodyさん
04/05/20 22:56ID:???うまく動かないようですね。で、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:???typoでsjisじゃなくjisになってましたワン
というか、直に指定してやるしかないのでしょうか?
$lineの入力として複数ファイルを同時に扱う時に、
複数の文字コードがあったりすると困るのですが…。
0912nobodyさん
04/05/20 23:25ID:???# ローカル変数を定義する
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:???↑のこと忘れてください・・・
0915nobodyさん
04/05/21 00:18ID:2dDSzz6yEAN128バーコードを作成したいのですが、
何か良い方法はありませんでしょうか?
GD::BarcodeではEAN128は出力できないし、
まともなサーバサイドアプリケーションは100万円程するしで
悩んでいます。。
0917nobodyさん
04/05/21 01:06ID:???スレ違いなので教えてあげない
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' );
0919918
04/05/21 04:32ID:hNvgkOa1KCatch.pmをおいてuse KCatchしても、エラーがでるし。
0920918
04/05/21 04:41ID:hNvgkOa1動作させたい perl スクリプトが必要とするライブラリを全部転送する必要がある。
ということがわかったのですが、今回のeuc⇒utf8変換をできるようにするためにおいとく必要のあるライブラリはなんでしょうか?
0921918
04/05/21 06:09ID:hNvgkOa1を参考にがんばってるんだがねー。。。足りないモジュール大杉にふてー
0922nobodyさん
04/05/21 06:18ID:???0923918
04/05/21 06:25ID:???0924nobodyさん
04/05/21 06:34ID:???NPHスクリプト
http://tohoho.wakusei.ne.jp/wwwcgi4.htm#NphScript
0925nobodyさん
04/05/21 12:22ID:ERQd2RKf無料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:???0928926
04/05/21 13:25ID:???0929nobodyさん
04/05/21 13:26ID:???$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 = ?の個数が動的に変化して困るって事なんですが…。
0931nobodyさん
04/05/21 15:54ID:???固定されたSQL文を使い回すのが bind で、
要素が可変個数になるということはSQL文も可変なはずだから、そもそもダメ。
個数が確定してから prepare せんといかん。
SQLの書き方や考え方の話は、ここよりもDBIスレあたりが妥当だろう。
0932nobodyさん
04/05/21 16:18ID:???では@arrayを受け取ってから、joinか何かで動的にSQL文を生成して
prepare、つかそういうやり方ならdoをするしか無いって事ですかね
0933925
04/05/21 16:32ID:ERQd2RKf「短縮されてないURL」を知るべき必要がある事をどこで察知するかじゃなく、
「短縮されてないURL」を知る方法、
ないし短縮URLでもファイルをダウンロードする方法を教えて下さい。
0934nobodyさん
04/05/21 16:47ID:???>「短縮されてないURL」を知る方法
そんなものはアクセスしなけりゃわかるわけがない。
>短縮URLでもファイルをダウンロードする方法
長いURLから短縮URLを推測して試すしかない。
スレ違いなのでここまで
0935nobodyさん
04/05/21 19:38ID:???コピペはやめて、こっちで基礎から勉強。
http://x68000.startshop.co.jp/~68user/net/
0936925
04/05/21 20:15ID:???すっげ、1行追加で動くようになったわ。
thx!
0937915
04/05/21 20:27ID:2dDSzz6y(笑) 親切に教えてくれて有難う。
Barcode::Code128、大変参考になりました。
0938907
04/05/21 21:58ID:jMqF5hwGありがとうございます。やってみます。
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:???0942nobodyさん
04/05/22 07:05ID:???>>941さんの通り、URIでは'#'以降はフラグメントとして扱われるので、
'#'を'%23'にエスケープしておく。
CGI側で元に戻す。
いろいろ問題の多そうなソースなんで、
どこかのスクリプトを参考にして作ってださい。
(CGI.pmを使うのが一番なんだけど)
0943nobodyさん
04/05/22 07:10ID:???str=文字列 の部分に使える文字は決まってるから、
それ以外のものを使いたい場合はURLエンコードしなきゃいけない。
<scheme>://<authority><path>?<query>#<anchor>
#はこんな風に(HTMLの)アンカーとして使うと決まってるので、
鯖にも($buffer)として渡ってきてないんじゃないかな。
詳しいことはrfc2396あたりかな。英語読むと眠れなくなるんで自分で確かめてください . 。oOオヤスミ
0945nobodyさん
04/05/22 07:24ID:???0946nobodyさん
04/05/22 13:02ID:prWBgoDShttp://www.csmoon.com/prog/dcnt.html ここにあるサンプルCGIを設置したんだけど
なぜかinternal Server Error が出まくって全然動かない
環境はRed Hat Linux + Apache 2.0.48です
パーミッション、転送法などが原因かな?
だれか教えて!
0947nobodyさん
04/05/22 13:25ID:???0949nobodyさん
04/05/22 16:46ID:???はずいです
0950nobodyさん
04/05/22 16:53ID:???0951座敷荒氏
04/05/22 19:43ID:PaJLGSDA以下、内容を自分宛にメールで送信する部分です。
「$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いまはメールの差出人のところに変数$in{'_email'を入れてますが
メール本文の一行目に入れるように変更したということです。
よろしくおねがいします。
0954座敷荒氏
04/05/22 20:57ID:???入れるように変更したいということです。
訂正でつ(/_<。)
0955nobodyさん
04/05/22 21:24ID:???幼稚園生からやり直せ。
今のお前に必要な事だ。
0956座敷荒氏
04/05/22 21:26ID:???0957nobodyさん
04/05/22 21:46ID:???0959823
04/05/22 22:57ID:???0962823
04/05/22 23:24ID:???0963nobodyさん
04/05/22 23:34ID:???RFC2616。Rangeはページ138。
http://www.ietf.org/rfc/rfc2616.txt
0964座敷荒氏
04/05/22 23:45ID:???0965823
04/05/22 23:49ID:???おそらくRange: bytesで比較するのですね。
>>963
Range Retrieval Requestsというのがありましたので、たぶんそれっぽいですね
皆様お手数かけてすいませんでした。
今日はもう時間なので、明日がんばってみますです。
ありがとう〜
0966nobodyさん
04/05/23 18:00ID:fkswZRQD$str = "スノボー";
if( $hoge =~ /$str/){
}
こうするとこういうエラーが出るのですが、どうすれば直りますか。
Unmatched [ before HERE mark in regex m/スノボー << HERE / at hoge.cgi line xx.
0967nobodyさん
04/05/23 18:09ID:???0968nobodyさん
04/05/23 18:59ID:fkswZRQDif( $hoge =~ /\Q$str\E/){
}
こうやったらうまくいきました。
だいたい意味はわかったのですが、日本語を正規表現する時はいつも
\Q\Eで囲まないといけないのですか?
0970nobodyさん
04/05/23 20:33ID:???かといってEUCは一バイトずれでマッチする問題がおきやすかったりで、
よほど注意しないと日本語の正規表現はお勧めできない。
use utf8にしちまえば大丈夫らしいけど、それはそれで今度は正規表現
以外の点でいろいろめんどくさいことがあるしなぁ。
0971nobodyさん
04/05/23 23:42ID:???マッチするから気をつけろ。
0972nobodyさん
04/05/23 23:57ID:???いつも普通にSJIS使ってるけど
0973nobodyさん
04/05/24 00:00ID:???しかし既存サイトを一部だけ UTF-8 にするんだと死にそうだ。
0974nobodyさん
04/05/24 06:52ID:???マルチバイト文字を考慮して作られているので、
ずれた位置でマッチすることもありません。
Perl version 5.8.0以降なら、encoding。
マルチバイト文字の正規表現も素で使えるようになります。
(5.8.1以降ならtr///も対応。)
0975nobodyさん
04/05/25 07:37ID:???perlでリクエストヘッダのHTTPバージョンを任意に変更したいのですが、
実現できる方法はあるでしょうか?
どなたかご回答お願い致します。よろしくお願いします。
レス数が950を超えています。1000を超えると書き込みができなくなります。