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

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

■ このスレッドは過去ログ倉庫に格納されています
00019882005/12/08(木) 22:48:27ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0583nobodyさん2006/01/10(火) 23:29:17ID:???
>>581
エスケープ対象が2.に示したものだけなら、シフトJISの2バイト目には来ないので大丈夫だろう。
05845812006/01/11(水) 02:32:30ID:???
>>582,583

レスありがとうございます。
JISコードの場合は <>&"' が全部出てくる可能性があるんですね。
非常に勉強になります。。

ちなみに、タグ文字をエスケープ(< など)で現れる
セミコロンは自体は大丈夫でしょうか?
(日本語の1byte目とくっついて文字化けなど)

とりあえずはSJISのエスケープでやってみます。
ありがとうございました。
0585nobodyさん2006/01/11(水) 03:01:58ID:???
>>584
範囲内にあるかは>>582のページと適当なASCIIコード表をつき合わせればわかる。
ttp://adlib.rsch.tuis.ac.jp/~akira/lect/softa/ascii.html とか
--------------------------------81=====9F---------------E0=====FC-: SJIS全角 上位
----------------40=============================================FC-: SJIS全角 下位
に対しセミコロンは3Bで範囲外
そもそも、範囲内だったしてもamp;のように1byte目となる位置は必ずアルファベットでしょうが
0586nobodyさん2006/01/11(水) 09:19:18ID:???
>プログラムは JIS コード
これは絶対外せないルールなのか?
0587nobodyさん2006/01/11(水) 10:05:55ID:CQ4aDWhi
http://www.hero.ne.jp/~db/
このCGIをダウソしたんですが、CGIを設定することができずに困ってます
とりあえずウェブスペースにうpしたら「500 Internal Server Error」と表示されました
どなたかお願いします
0588nobodyさん2006/01/11(水) 10:41:24ID:???
日曜日とかがCGI休みのサーバとかじゃない?
05895872006/01/11(水) 10:49:16ID:???
http://www.hero.ne.jp/~db/herodb-othersite.shtml
このあたりの設定も満足にできていません

>>588
たぶん自分のコーディングミスだと思います
05905872006/01/11(水) 10:56:49ID:???
http://www.breeze.jp/s02_faq_01.php#q23
ここに設置しようと思ってます
0591nobodyさん2006/01/11(水) 11:22:37ID:???
Web製作板でやれ
0592nobodyさん2006/01/11(水) 12:01:21ID:???
コーディング以前の問題
05935872006/01/11(水) 15:39:23ID:CQ4aDWhi
そうですか・・
薄々聞く場所を間違えたのではないかと思っていましたが
お邪魔しました
他をあたります
レスありがとうございました
0594nobodyさん2006/01/11(水) 18:11:07ID:???
こんな感じでURLから文書取ってくるのを書いたのですが、

use strict;
use warnings;
use utf8;
binmode(STDOUT,':encoding(shiftjis)');
use LWP::UserAgent;
my($ua,$req,$res);
$ua = LWP::UserAgent->new;
$ua->timeout(10);
$req = HTTP::Request->new( GET => $ARGV[0] );
$res = $ua->simple_request($req);

この状態で$res->header('Content-Type')を出力するとなぜか二重になって返ってきます。
例えばYahooにアクセスさせて出力すると
text/html;charset=euc-jptext/html; charset=euc-jp
なんて文字列が返ってきます。
これはおかしいと思うのですが、なにか間違えていますか?

HTTP::ResponseはActive Perl 5.8.7についてたやつで、バージョン1.52です。
0595nobodyさん2006/01/11(水) 18:12:22ID:???
for構文(hogeの所は違う処理)がプログラム全体でちょくちょく出てくる場合って、
$iにはmyとかつけてあげた方が負荷的には少なかったりする?
再利用されるならグローバル変数でも問題なさそうな気がするけど、
こういう所って負荷を気にするならどうするのかなとちょっと質問。
もっと気をつけるところはあるんだろうけど、とりあえずやれるだけはやっておきたいので。
0596nobodyさん2006/01/11(水) 18:27:30ID:???
負荷云々の前に use strict しろと小一時間
0597nobodyさん2006/01/11(水) 18:50:18ID:???
つーか $ua-get() を使わないのは何で
0598nobodyさん2006/01/11(水) 18:55:27ID:rynIEcBA
JavaScriptのscreen.availHeightの様に、モニタの表示サイズを参照したりする事はできますか?
0599nobodyさん2006/01/11(水) 18:59:22ID:???
それぞれのOSのAPIでも使ってろ、と
0600nobodyさん2006/01/11(水) 19:07:41ID:???
>>597
リダイレクトを自動的に処理させたくないのでsimple_requestを使っています。
また $ua->get をつかっても、やはりContent-Typeが二重になって返ってきます。

今気がつきましたが、Googleにアクセスすると完全に二重ではなく
text/htmltext/html; charset=Shift_JIS
という、すごい中途半端な感じになります…。
0601nobodyさん2006/01/11(水) 19:14:24ID:???
$ua->max_redirect(0)
ってしたらリダイレクトされんと思うが
0602nobodyさん2006/01/11(水) 19:26:15ID:???
>>600
それリスト ("text/html", "text/html; charset=Shift_JIS")
as_stringでprintしてみ
0603nobodyさん2006/01/11(水) 19:30:17ID:???
html中のMETAも読むみたいだね。
解決策は>>602が言っているようにリストで返ってくるから、配列で受け取る。
0604nobodyさん2006/01/11(水) 19:48:01ID:???
>>601
そうすればgetメソッドでもできましたか。
しかし、個人的に見た目にすぐわかるのでsimple_requestを使っておきます。

>602-603
なるほど。リストでしたか。
解決できました。本当にどうもありがとう。

META要素も読んでいるのですか?
HTTP関係のモジュールは継承がすごくてどのモジュールをperldocすればいいのか…。
0605nobodyさん2006/01/11(水) 19:54:11ID:???
というか
use utf8;
意味解って使ってるか?
0606nobodyさん2006/01/11(水) 20:20:40ID:???
>>605
はい、スクリプト中のリテラルをすべてUTF-8として扱い、
それらをUTF-8フラグ付き文字列に変換するということですよね。

今回のスクリプトではマルチバイトの文字がないので意味はないですが、
よく、スクリプトを作るに出力するエンコードをbinmodeですぐ変換できるようにつけていました。
その習慣で今回もつけてしまいました。すいません。
0607nobodyさん2006/01/11(水) 20:59:00ID:???
おまいがやりたいのは
use encoding 'utf8';
じゃないのか? まぁどっちでもいいのかもしれんけど。

use utf8;
$useutf8したからこんな変数名も使える = '中身';
print $useutf8したからこんな変数名も使える;
exit;
0608nobodyさん2006/01/11(水) 21:19:14ID:???
>>604
> META要素も読んでいるのですか?
LWP::Protocol::httpがLWP::Protocolのcollect()を呼び出していて、
そこでHTML::HeadParserをrequireしてる。
0609nobodyさん2006/01/11(水) 22:10:05ID:???
>>607
encondingプラグマはスコープがグローバルなはずなので、
他のエンコードで書かれたモジュールで問題が起きませんか?
マルチバイト使ったモジュールなんかそう無いので気にする必要ないかもしれませんが、
自分で何か作った時に、「した覚えがないのにUTF-8化されている」のはなんかハマる気がします…。

>>608
LWP::UserAgentからちょっと呼んでみました…。
…私には荷が重いようで…。
よくわからないので、headerメソッドの第1要素を使っておきます…。
どうもありがとうございます。
0610nobodyさん2006/01/12(木) 01:27:01ID:???
プログラム板でスレ違いといわれたのでこちらで聞き直します。

CGI を書くときには 有名なとほほさんの http://www.tohoho-web.com/cgi/wwwperl.txt のように
環境変数を直接読むのが普通です。
ただ、近頃は、CGI.pm を使うの方法も増えているようです。
でも、聞いた話によると、CGI,pmを読み込む分、環境変数を直接扱うより遅くなるそうですし、
使えない環境もあるそうです。
なんか、CGI.pmのマニュアル見ても難しそうだし、結局、CGI.pmを使うメリットというのは何なのでしょう?

0611nobodyさん2006/01/12(木) 01:31:28ID:???
CGI.pmって200KBぐらいあるよね
バイナリかよ、って笑っちゃうぐらい
今は物好きしか使ってないんじゃない?
06126102006/01/12(木) 01:40:26ID:???
>611
環境変数直接扱い → CGI.pm
と変わってきたけど、結局、今はまた環境変数直接扱いの方が見直されてきたということで良いんでしょうか?
0613nobodyさん2006/01/12(木) 01:57:56ID:???
>>610
POSTのマルチパートも扱いが楽。
mod_perlもサポート。
ってところかな。

普通に使ってる。
0614nobodyさん2006/01/12(木) 07:19:00ID:???
有用なCPANモジュールの多くがCGI.pmを使ってるからな
パフォーマンス的に問題が無ければ
何も考えないでCGI.pm使っておけば問題ないよ
0615nobodyさん2006/01/12(木) 07:28:05ID:???
そうかとほほが普通か…。
0616nobodyさん2006/01/12(木) 07:42:43ID:???
>614
逆を言えば、パフォーマンス的に問題があるかどうかわからない場合、CGI.pm使わない方が良い?
0617nobodyさん2006/01/12(木) 07:59:39ID:???
>>616
1日に何万ヒットもあったりレン鯖でCPUやメモリの制限に引っかかるようだったら
自前で用意したりカスタマイズしたほうが良いんじゃない
単純にデコードだけしたいんならCGI::Liteでもいいんじゃね?
結局はケースバイケース
0618nobodyさん2006/01/12(木) 08:07:57ID:???
パフォーマンス、パフォーマンスと初心者ほど過剰に気にするが、
パフォーマンスに困るぐらいのアクセスがあってから言えってんだ。
0619nobodyさん2006/01/12(木) 09:08:02ID:???
初心者でもアクセス数の多い企業サイトを担当することはある。

いや、俺のことだが。
0620nobodyさん2006/01/12(木) 12:42:21ID:???
後から修正すると大変だから最初に気をつけた方がいいしな。
0621nobodyさん2006/01/12(木) 12:48:54ID:???
その場合はすでにあるフレームから外れたことはしない方がいい。
初心者のうちは。
0622nobodyさん2006/01/12(木) 13:25:04ID:???
パフォーマンスもいいけど、セキュリティにも気を配ってくれよ。

なんて言っても、痛い目を見ないと分かってくれないわけだが。
0623nobodyさん2006/01/12(木) 14:15:30ID:???
>>622
初心者だから踏み台にされてることにも気が付かない。これ。
0624nobodyさん2006/01/12(木) 14:28:34ID:???
>>619
可哀想に。下手すれば一瞬で信用を失うな。
0625nobodyさん2006/01/12(木) 14:41:25ID:???
CGI.pmとか重すぎるし
フォームをパースするだけにしか使わんから
自作した
0626nobodyさん2006/01/12(木) 14:47:32ID:fUom/aNQ
%VALUE = (1 => "#602000", 2 => "#FF0000", 3 => "#008040", 4 => "#0000BB");
%COMMENT = (1 => "未設定", 2 => "重要", 3 => "ビジネス", 4 => "個人用");
%CLASS = ("#602000" => "none", "#FF0000" => "important", "#008040" => "business", "#0000BB" => "personal");

こんなハッシュがある状態で、
$color = "#008040";
という変数を使って、
%COMMENTの"ビジネス"を取得って可能でしょうか。
0627nobodyさん2006/01/12(木) 14:51:45ID:???
可能だけどデータ構造を再考したほうがいいよ。
0628nobodyさん2006/01/12(木) 15:07:23ID:fUom/aNQ
できました!
ハッシュのキーと値をペアで取り出せるeach関数なんていうのがあったんですね!

%VALUE = (1 => "#602000", 2 => "#FF0000", 3 => "#008040", 4 => "#0000BB");
%COMMENT = (1 => "未設定", 2 => "重要", 3 => "ビジネス", 4 => "個人用");
%CLASS = ("#602000" => "none", "#FF0000" => "important", "#008040" => "business", "#0000BB" => "personal");
$color = "#008040";
while (($key, $value) = each (%VALUE)) {
  if ($color eq $value) {
    while (($new_key, $value) = each (%COMMENT)) {
      if ($key eq $new_key) {
        $comment = $value;
      }
    }
  }
}
print $comment;

ありがとうございました。
0629nobodyさん2006/01/12(木) 18:06:27ID:???
データ構造悪すぎ。そんなもん普通ループいらんぞ。
例えばこう内側のループが消えるように。
while (($key, $value) = each (%VALUE)) {
  if ($color eq $value) {
    $comment = $COMMENT{ $value };
    last;
  }
}
0630nobodyさん2006/01/12(木) 18:07:26ID:???
やっちゃった。
$COMMENT{ $value }; → $COMMENT{ $key };
0631nobodyさん2006/01/12(木) 18:36:39ID:???
my $comment;
{
 my %temp = reverse %VALUE;
 $comment = $COMMENT{$temp{"#008040"]}
}

が楽だと思う。
0632nobodyさん2006/01/12(木) 19:21:41ID:Xjv4jYTd
■ド素人です。
更新めんどくてperlでhtmlファイル管理、生成のプログラム書いてみたんだけど、なにせド素人なもんで、そんで質問以下の構造のモノって鯖に負担になりますか?
-------------
上:ヘッダ一部、トップlogo部分
左;左メニュー、左メニューに日記の新着記事、左メニュー広告欄
中:中央センター上部広告、本文(※)、フッタ
右:右リンクメニュー、右メニューの広告欄
 部品的に見てこれらでレイアウト(構成)されてるサイトなんですが「本文(※)」以外は、全ページの共通表示部分になるのです。
 要するに、サイト全体の共通部分を上記の様に部品別に.logでバラバラに保存してそれをCGIでHTML生成する時に、上記の部品を一回一回読み込んで、配列に代入して、printで出力。
本文は別のログに保存してあって、それだけブラウザで編集可能、それも同時に読み込んで行って、htmlとして出力される作り。
 本文が保存されているlogファイルは、数十ページの本文内容を、件名<>本文<>etcの様に、<>で区切って、改行別に保存(ページ数が増えるとドンドン重たくなる)
 で、問題はここから★
 サイト全体でページ数が200〜300ぐらいになるのです。(更新すりゃもっと増加)
こう言った作りだと、共通表示部分、例えば、「左メニュー.log」のコンテンツへのリンクを変更すれば、サイトのページ300ファイルを全部更新(html生成)し直さなくちゃいけない訳です。
 ちなみに300ファイル一気に生成するわけではなくって、同じスクリプトを複数設置しているのでサイトのテーマ別、例えば「サイト案内」のコンテンツだけで10ファイルあって、
それらを複数のスクリプトで計300ファイル程度を生成する作りです。
 なにせド素人なもんで、変な無鉄砲なモノした組めないです。情けない
 これって、とゆうか、配列の乱用?と計、数メガにのぼるhtml生成って負担になりますか?
なんか自分で書いてて、何がなにやらよく分からん様になってきた。アホ文失礼。orz
0633nobodyさん2006/01/12(木) 19:24:13ID:vLiWBj2u
ド素人じゃないのにド素人を装って教えを請うのはみっともない
それともっと簡潔に
でなきゃサイトを晒すか・・・
0634nobodyさん2006/01/12(木) 19:32:13ID:???
>>632
> 本文が保存されているlogファイルは、数十ページの本文内容を、件名<>本文<>etcの様に、<>で区切って、改行別に保存(ページ数が増えるとドンドン重たくなる)

本文が再帰してるように読める
0635nobodyさん2006/01/12(木) 19:33:31ID:???
> 数メガにのぼるhtml生成
ここが意味不明。
1つのHTMLファイルが数メガになるのか?
0636nobodyさん2006/01/12(木) 19:50:39ID:vLiWBj2u
まずテーマごとにそのテーマの ID を決める
ログファイルは月ごとぐらいで更新する (といっても1年で1000ページとか行かないだろうから1年あたり1つのログでいいかも)
(ただそのファイルがぶっ飛んだらその年のページが全部飛ぶことになるので月ごとが安全っちゃ安全か)
ページ (行ね) には必ず ID を割り振る

これを条件として、CGI には テーマ ID、ログファイル名、ページ ID を渡す
ページ ID が取得できなければそのログ一覧を。
ログファイル名が取得できなければログ一覧 (各月の一覧か隔年の一覧なのかは自分で決めてね)
テーマ ID が取得できなければテーマ一覧を表示する。

こうすればページあたりのヒット数とか、テーマ別ヒット数とかが用意に取得できるようになる
0637nobodyさん2006/01/12(木) 19:51:47ID:vLiWBj2u
投稿したあとフトおもった
ディレクトリで分けてもいいな
./テーマ ID /ログファイル
んでテーマ ID とするディレクトリにテンプレート用 HTML を置いておくとか
0638nobodyさん2006/01/12(木) 20:47:10ID:???
> CGI.pm

というかクエリー取得のためだけに CGI.pm 使ってる人って十中八九
「なんちゃってモジュール使っちゃってます厨」
でしょ。

おまえら資源のムダだから大人しく自分で車輪の再発明してろと(ry
0639nobodyさん2006/01/12(木) 22:17:59ID:???
>>632
メニュー部分をSSIで呼び出すようにすれ。
表示は重くなるけど、悪くないトレードオフだと思う。
0640nobodyさん2006/01/12(木) 23:13:08ID:???
>>638
資源の無駄なんてことを言うレベルなら Perl やめるべきだと思うが
0641nobodyさん2006/01/12(木) 23:14:10ID:???
>>632
普通にblog使ったら?
今あるデータをコンバートする方向で。
システム作るより、コンバータ書いた方が楽だと思う。

どういうデータにしたら良いかは、実際にここログとか無料のblogに入ってみて、
データを書き出してみれば分かるはず。
その形式で出力するように、今あるデータに対するフィルタを書く。
0642nobodyさん2006/01/12(木) 23:14:14ID:pW3y8Hzc
いわゆるURLのオートリンクをやりたいのですが
http://hoge.com/ho/ge というのと hoge.com/hoge/ge が両方

<a href="http://hoge.com/ho/ge">hoge.com/ho/ge</a> というリンクになる
変換をしたいと思います。 これを正規表現で一発でやるというのは出来るのでしょうか?
0643nobodyさん2006/01/12(木) 23:17:32ID:vLiWBj2u
接頭語 (http とか ttp とか) がないと辛いんじゃないかな
0644nobodyさん2006/01/12(木) 23:19:36ID:???
>>642
正規表現で処理する以前に、
hoge.com/hoge/ge
がURLであるかどうか、判断できないような…。

www*.hoge.com/hoge/ge
とかならURLと見なして処理することも出来るだろうけど。
0645nobodyさん2006/01/12(木) 23:24:33ID:???
>>632
サーバー側でやるような処理じゃないよ。ローカル側で処理すべき。

そもそも300ファイルすべてに左メニューとか右メニューとか必要なの?
上部に1本、パンくずリンクでもあれば済むんじゃないの?
なんの情報も生まない、しかも広告入りのメニューが左右を延々占領するのもかなわん。ユーザビリティの履き違えかエロサイトの仕様だ。
0646nobodyさん2006/01/13(金) 00:00:39ID:???
>>640

精々頑張ってCGIモジュール読み込むか車輪の再発明してるといいよ。
0647nobodyさん2006/01/13(金) 00:08:31ID:???
ドメイン.(com|net|org|jp)/(パス文字列)+
くらいで大雑把にとか。
0648nobodyさん2006/01/13(金) 00:28:25ID:???
>>646
テンプレみたいな捨て台詞ですね:-P
0649nobodyさん2006/01/13(金) 00:29:47ID:42x/OYc6
>648
テンプレみたいなあげ足取りですね
0650nobodyさん2006/01/13(金) 00:30:59ID:???
「車輪の再発明」なるものを避けるには天麩羅もまた一興
0651nobodyさん2006/01/13(金) 00:35:03ID:???
実際クエリ取得→CGIモジュールな人間は
おまえらどこでそんな中途半端なモジュールの使い方覚えてきたのかと。
0652nobodyさん2006/01/13(金) 00:37:15ID:???
某配布の大御所…
0653nobodyさん2006/01/13(金) 00:41:22ID:???
>>647 その線でやってみました。 これで今のところ希望する動作をしてます。

$domain = '[\w\-]+\.[\w\-\.]+';
$path = '\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+';
s/(http:\/\/|\b)($domain($path)?)/<a href=\"http:\/\/$2\">$2<\/a>/g;
0654nobodyさん2006/01/13(金) 00:47:54ID:???
微笑ましい記述に萌え
0655nobodyさん2006/01/13(金) 00:51:26ID:???
653じゃないけど、
ちゃんと取得できてるのか確認しながらコーティングするとこうなるんよ
0656nobodyさん2006/01/13(金) 01:00:29ID:???
これってwarningsで警告出ないんだっけ?
0657nobodyさん2006/01/13(金) 01:07:46ID:???
>>653
メールアドレスも引っかかるじゃん。
0658nobodyさん2006/01/13(金) 01:14:20ID:???
メールアドレスもスキーム付いてればUR(I|L)だけどね。
0659nobodyさん2006/01/13(金) 01:25:35ID:???
\.[a-z]{2,6}\/ が見つかった前後で、URI として認められない文字列 (改行、空白、全角) が出てきた範囲を抜き出せばいいかも
正規表現で出来そうだけど、俺には無理w
0660nobodyさん2006/01/13(金) 01:59:59ID:???
>>658
普通にリンクされるならまだいいけど、@以前が切れる。
[email protected]ならfoo@<a href="http://example.com">example.com</a>みたいに。
06616532006/01/13(金) 02:23:13ID:???
11 a.m. のa.m.がリンクになってしまった… あと\bは\sの間違い。これでメールには
対処おk。

$domain = '[\w\-]+(\.\w[\w-]*\w)+';
$path = '\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+';
s/(http:\/\/|\s)($domain($path)?)/ <a href=\"http:\/\/$2\">$2<\/a>/g;

ドメイン名のそれぞれの部分は一文字より多いという姑息な手段で対処。
0662nobodyさん2006/01/13(金) 02:32:04ID:???
やってみた。ドメイン名の左側に@が付くものは除外。
TLDがないと色々誤爆しそうなので幾つか勝手に固定。
http://user:[email protected]/ みたいものまでは考えないことにする。

my $regex_http = q{(?:h?t?t?p?:?//|(?<![@\w\-./]))([\w\-.]+(?:com|net|org|jp)/?[\w\-.!~*'();\/?:\&=+\$,%#]*)};
s|$regex_http|<a href="http://$1">http://$1<;/a>|g;
06636532006/01/13(金) 03:26:13ID:???
>>662
ありがとうございます。 一生懸命読解を試みました。 (?:)とか(?<!)等は探して理解しました。
なるほど、玄人な道具ですね。 それから正規表現を|でくくると中でいちいち/をエスケープ
しなくていいというのも便利な技で参考になりました。 それからURLに使われる特殊
文字ってもっとあったのですね。 

1つ質問。q{}ってなんでしょうか? ある種のクオートな気がしますが記述を
見つけられませんでした。
0664nobodyさん2006/01/13(金) 03:33:08ID:???
>>663
クォートとクォートのような演算子
ttp://namazu.org/~tsuchiya/perl/info/perl-ja_44.html#SEC44
0665nobodyさん2006/01/13(金) 05:21:58ID:???
open(LOG,"$datfile");
flock(LOG, LOCK_EX);
@alldata = <LOG>;
close(LOG);
foreach $data (@alldata){

中略

}
print "<p>完了しました。</p>";

という構文で、ファイルの各行の文字列を読み取って、処理を行う、という動作をさせ、
終了時に「完了しました。」の文字列を表示、という風にしているのですが、
ファイルの行数が少なかった頃は何の問題もなく処理を完了していたのですが、
800行を超えた辺りから、「完了しました。」の文字を表示しないこともあります(ブラウザは完了したような振る舞いをします)。
また、処理の結果を見ても、ファイルの途中までしか処理されていないようです。
恐らくforeach文の回数が多すぎるからだと思うのですが、何か対処法は御座いませんでしょうか?

お教え下さいますようお願い致します。
0666nobodyさん2006/01/13(金) 09:05:02ID:???
>>665
コマンドラインでもダメってこと?
まさかレン鯖で実験してたりしないだろうな。
レン鯖だとしたら時間でプロセス切られてるだけだと思うが。
0667nobodyさん2006/01/13(金) 13:00:33ID:???
>>662-664
正規表現には qr// を。
http://perldoc.jp/docs/perl/5.6.1/perlop.pod#item_qr_STRING_imosx
0668nobodyさん2006/01/13(金) 19:51:25ID:???
とりあえず暇なのでオートリンク自分もアップしてみる。

http://2ch-eva.under.jp/uploader/file/src/up0018.txt

ftpにも対応しようとしたが挫折。ていうか正規表現でやることじゃないな。

というかこんな未熟な俺にも言わせてほしいことといえば
キャラクタクラスの中で \ 使うなよと。

# なんで\dじゃなくて[0-9]なんて書いてるんだorz
0669nobodyさん2006/01/13(金) 20:34:19ID:???
>>668
\d は UTF-8 フラグ付きの '1' (全角) にもマッチする。
[0-9] だとマッチしない。
0670nobodyさん2006/01/13(金) 21:05:28ID:???
そうだったのか。まだまだ読み込みが足りんわ。サンクス。

今度は中途半端に\d使ったことが…… orz
0671nobodyさん2006/01/14(土) 00:23:37ID:???
>>665
どうしても配列に格納しなけりゃならんのでなけりゃ、以下を試してみないか。

while (<LOG>) {
  # 何ぞ処理
}
0672nobodyさん2006/01/14(土) 00:49:22ID:???
変数のスコープについて質問。 設定を別ファイルで定義してrequire して使おうと思います。

# 設定ファイル settei.pl
$CFG_HOGE=1;
$CFG_MOGE=2;
1;

#!/usr/local/bin/perl
require 'setttei.pl';

print "hoge=$CFG_HOGE, moge=$CFG_MOGE\n";

さて、これでuse strictを付け加えるとCFG_*変数に対してエラーが出ます。 そこで両方の

ファイルでmyとしたら設定はプログラムの方では見えないんですね。 こういうことを
use strict
で行うのはどうすればいいのでしょうか?
0673nobodyさん2006/01/14(土) 00:52:41ID:???
行き当たりばったりで strict してもあんまりいいことないよ。


なんてこといってるとどうしょうもなくなるか。

パッケージとか名前空間とかで検索してみな。
06746722006/01/14(土) 01:50:37ID:???
>>673
ありがとうございます。 模索してみました。

トライ1:
すべての$CFG_*を$main::CFG_*にする。 これでコンパイル出来、前と同じ振る舞いになりました。 
しかしmain::だらけでうっとうしい。

トライ2:
settei.pl の頭にpackage main;と加える。 main::はsettei.plの中は無し。
こうしてメインで$main::CFG_*と参照すればやはり機能しました。

しかしメインで直に$CFG_と参照するように出来る方法が分かりませんでした。 メインで
my $CFG_* と宣言するとsettei.plでされた設定はメインでは見えませんでした。
う〜ん、よく分からん。
06756722006/01/14(土) 02:11:55ID:???
>>673
こんなのはどうでしょうか。 今までCFG_と付けてたのをやめてsetttei.plは
package CFG;
$HOGE=1;
$HOGE=2;
1;

そしてメインではこれらを$CFG::HOGE, $CFG::MOGEで参照。 これが綺麗かな?

0676nobodyさん2006/01/14(土) 02:44:14ID:???
>>672
#--- MyConf.pm ---
package MyConf;
use strict;
use base 'Exporter';
our @EXPORT = qw($Foo $Bar);
our($Foo, $Bar) = (1,2);
1;
__END__

#!/usr/local/bin/perl -w
use strict;
use MyConf;
print $Foo, $Bar;
__END__
0677nobodyさん2006/01/14(土) 03:24:19ID:???
私が最近好んで使ってる方法ですが・・・
◆ config.pl
my(%config) = (
 'fuga' => 1,
 'hoge' => 2,
 'gagaga' => "SEGA"
);
sub returnconfig{
 return %config;
}

◆ main.cgi
require 'config.pl';

my(%config) = &returnconfig();
print $config{'fuga'};


わざわざ呼ばなきゃいけない&同じ内容がメモリ内に2つ存在するので効率悪いっちゃ悪いですが・・・
0678nobodyさん2006/01/14(土) 03:32:05ID:???
>>677
んなことするくらいだったらタブ区切りの設定ファイルを
読み込んでハッシュに入れた方が管理も楽でしょ
0679nobodyさん2006/01/14(土) 03:43:59ID:???
>>677
#--- config.file ---
use strict;
{
  foo => 1,
  bar => 2,
  baz => [ 'a'..'z' ],
};
__END__

#!/usr/local/bin/perl -w
use strict;
my $conf = do '/path/to/config.file' or die;
print $conf->{'baz'}[7];
__END__

>>678
設定ファイルを Perl で書ける。
06806722006/01/14(土) 04:43:19ID:???
>>679
do ファイル; なんて出来ちゃうんですか。 これもなかなか美しいですね。
0681nobodyさん2006/01/14(土) 04:44:08ID:???
>>677
#--- 設定
package Setup;
use strict;
sub get{
bless( {
 foo => 1,
 hoge => 2,
 array => [1,2,3]
} , $_[0] );

}
1;
__END__

#!/usr/local/bin/perl
use strict;
use Setup;
my $setup => Setup->get;
print $setup->{'foo'};
print $setup->{'array'}->[0];
__END__
0682nobodyさん2006/01/14(土) 05:58:58ID:???
遅くなりました。返信有難う御座います。

>>666
レン鯖です。
やはりタイムアウト的な処理でしたか。
それを避ける方法は御座いますでしょうか?

>>671
open(LOG,"$datfile");
while ( $data = <LOG> ) {

処理

}
close(LOG);

であってますでしょうか?
■ このスレッドは過去ログ倉庫に格納されています