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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
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
何のコーディングが分からないんですか?
0977nobodyさん04/05/25 07:52ID:???
>>976 さん
例えば普通なら
GET http://www.yahoo.co.jp HTTP/1.0
とリクエストを送りますが、このHTTP/1.0の部分をHTTP/0.9とか
HTTP/1.2など任意に変更したいのです。

その実現方法が分からず、質問させていただいています。
0978nobodyさん04/05/25 07:56ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0979nobodyさん04/05/25 20:18ID:???
>>977
LWPモジュールはHTTP/1.0と1.1しか対応してないので、
IO::Socket::INETモジュールまたはネットワーク関数(素のソケット)で書くしか。
0980nobodyさん04/05/26 03:45ID:???

なんかCGIのログが頻繁にぶっ飛ぶ(0バイトになる)んですが、
ファイルロック以外でこんな状況になるのはどんなミスが多いんでしょうか?
漠然とした質問で申し訳ないっす。
0981nobodyさん04/05/26 03:47ID:???
>>980
△▲ WebProg 初心者の質問 Part8 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1078568723/
0982nobodyさん04/05/26 03:59ID:???

>>981
ああ、すみません。通信間の問題ではないと思うんです。

ファイルロックはflock使ってて、しかもそのプログラム自体にはほとんどアクセスがない状態なんです。
んで、それなのに1日2回くらい飛ぶんです。
さらに、実際には使ってるサーバーが複数プロセスが同時に動かないようになってるんで、
実際んとこファイルロックさえいらん、って状況なんです。

で、ハマってしまって全く原因が分からないから、そーゆう時はどんなミスが多いのかなー?
と言った内容の質問です!長くてすみませぬ。

0983nobodyさん04/05/26 04:06ID:???
だーかーらー、スレ違いだって言ってるの
0984nobodyさん04/05/26 05:25ID:???
>>982
肉屋でトマト頼みますか?
0985nobodyさん04/05/26 16:10ID:???
次スレキボン
0986nobodyさん04/05/26 16:48ID:???
じゃあ立ててくる
0987nobodyさん04/05/26 16:54ID:kkhhiYmo
立ちました

【次スレ】
Perl コーディング初心者質問コーナー Part35
http://pc5.2ch.net/test/read.cgi/php/1085557731/

過去ログのpart30〜32がpc2にもpc5にも見つからんのだけど・・・
0988nobodyさん04/05/26 20:33ID:???
>>987
乙です
0989nobodyさん04/05/27 09:56ID:???
埋めませうか
0990nobodyさん04/05/27 17:13ID:???
ばったり書き込みなくなったしね
0991nobodyさん04/05/27 17:15ID:???
埋めときますね
0992nobodyさん04/05/27 17:15ID:???
埋め
0993nobodyさん04/05/27 17:17ID:???
埋め
0994nobodyさん04/05/27 17:18ID:???
埋め
0995nobodyさん04/05/27 17:19ID:???
埋め
レス数が950を超えています。1000を超えると書き込みができなくなります。