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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
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);

であってますでしょうか?
0683nobodyさん2006/01/14(土) 06:19:45ID:???
>682
処理がどんなことしてるかは知りませんが、たかだか 800 行程度でタイムアウト起こすような
貧弱サーバーそのものの利用を考えたほうが良いのではないのでしょうか?


>671
個人的には foreach の方が perl らしくて好き

foreach my $logline (<LOG>){
  〜処理〜
}
0684nobodyさん2006/01/14(土) 06:32:02ID:???
foreachじゃリストに展開するから配列にいれるのと一緒になっちゃうだろ。
0685nobodyさん2006/01/14(土) 08:03:10ID:???
おっなるほど。 while を使うのはそゆことでしたか。
自分は 682 さんではありませんが、1つ勉強になりました。
thx
0686nobodyさん2006/01/14(土) 09:24:51ID:???
>>683

馬鹿が「perlっぽい」とか言わなくていいから。
もうこのスレに書かないほうがいいよ。

0687nobodyさん2006/01/14(土) 09:37:38ID:???
ここwebprog板だぜ
0688nobodyさん2006/01/14(土) 09:39:12ID:???
perl で書かれた CGI のソースに、$vout 変数内に a タグで mailto: のリンクが書いてあり、クライアントが
リンクを踏むと、メーラーが立ち上がるようになっています。

が、mailto: に subject と body を含めて、かつ body には改行を含めたいのですが、どうしてもエラーになってしまいます。
以下を含める場合、どのように書けばよいのでしょうか ?

<持込に関して> ← subject
↓本文
@お名前[改行]
@ご住所[改行]
@お電話番号[改行]
<問い合わせ内容詳細>

ソースは ShiftJISになっています。よろしくお願いします。
0689nobodyさん2006/01/14(土) 09:39:30ID:???
#!/usr/bin/perl
use LWP::Simple;
$url = 'http://girls.twistys.net/preview/';
for ($i=1; $i<=3; $i++) {
 $num = sprintf("%03d", $i);
 $_ = get($url.$num."/");
 s/\w*\d{1,2}\.jpg/push @jpgs, $&/eg;
 foreach $jpg (@jpgs) {
  getstore($url.$num."/".$jpg, $num.$jpg);
 }
}
0690nobodyさん2006/01/14(土) 10:13:25ID:???
>>688
このスレの質問じゃねぇし
http://www.ring.gr.jp/pub/doc/RFC/rfc2368.txt

mailto:[email protected]
?subject=%8E%9D%8D%9E%82%C9%8A%D6%82%B5%82%C4
&body=%40%82%A8%96%BC%91O%5B%89%FC%8Ds%5D%0D
%0A%40%82%B2%8FZ%8F%8A%5B%89%FC%8Ds%5D%0D%0A
%40%82%A8%93d%98b%94%D4%8D%86%5B%89%FC%8Ds%5D
%0D%0A%3C%96%E2%82%A2%8D%87%82%ED%82%B9%93%E0
%97e%8F%DA%8D%D7%3E

上を一行に合わせれ
0691nobodyさん2006/01/14(土) 10:43:53ID:???
>683
> 処理がどんなことしてるかは知りませんが、たかだか 800 行程度でタイムアウト起こすような
その行について、どんな処理をしてるかわからないのに800行で判断する、っていうのはどうかと。
行数で判断するんだったら7万行で、に置き換えてください。そして、タイムアウトするのを避ける方法を教えてください。

なんかコンビニバイト風情が、肉体労働者に「一日働いただけで疲れるのはどうかと」って言ってるのと同じかな
0692nobodyさん2006/01/14(土) 10:56:45ID:???
> foreach my $logline (<LOG>){
>   〜処理〜
> }

こんな処理を800行「程度」を越える量書くとは…… 俺のレン鯖にいないことを願おう。
0693nobodyさん2006/01/14(土) 10:57:54ID:???
タイムアウトを考えてのことなら7万行じゃ少ないんじゃない?
せめて70万行とかさ
0694nobodyさん2006/01/14(土) 11:32:10ID:???
>>690

ありがとうございます。
実は、同じようにURLエンコードして、おっしゃられたように入れてみたのですが、エラーになってしまうんです。
元に戻すとサーバエラーはでなくなるので、記述の仕方がどこか違うようなんですが
perl の独特な記述の仕方があるのかと思って書き込ませて頂きました。
0695nobodyさん2006/01/14(土) 11:33:21ID:???
無限ループ作れば1行ですむ
0696nobodyさん2006/01/14(土) 11:50:37ID:???
エラーになると言っておいてエラー内容を書かないのはなんで?

多分、ダブルクオートで囲って @ や % が変数に展開されてるに一票。
0697nobodyさん2006/01/14(土) 12:07:44ID:???
データ自体が16から32kbytes程度なら、
別にforeachでも問題なかろう。
それで問題が起きるなら、それこそ鯖が貧弱。
0698nobodyさん2006/01/14(土) 12:14:40ID:???
愚直にファイル読み込んでタイムアウトになるならファイルの構造を
見直すしかないでしょ

データの量(行数だけでは分からないだろ)も処理の内容も
分からねーのに、何か教えてほしいなんて無理
0699nobodyさん2006/01/14(土) 12:36:49ID:???
>>697

馬鹿のプロセス切るのは「鯖が貧弱」
だからじゃなくて管理がしっかりしてるからでしょ。
「問題」じゃまったくないし。

まぁ実際 32kb で切ってたら別の問題だけどね。

お前は書かないほうがいいよ。
0700nobodyさん2006/01/14(土) 12:53:21ID:???
  おチンチンびろーん
   ∩___∩
   | ノ      ヽ/⌒)
  /⌒) (゚)   (゚) | .|
 / /   ( _●_)  ミ/
.(  ヽ  |∪|  /
 \    ヽノ /
  /      /
 |   _つ  /
 |  /UJ\ \
 | /     )  )
 ∪     (  \
        \_)
0701nobodyさん2006/01/14(土) 12:56:32ID:???
>>696

使っているサーバがエラー番号などが出ない仕様なんです。
「サーバエラーが発生しました…」という文章しか出ないので。

確かにダブルクォートで囲って有ります。$vout に代入されているようなんですが…。

その場合はどうすればいいでしょうか ?
0702nobodyさん2006/01/14(土) 13:23:01ID:???
サーバで実験しない
よいこの約束
0703nobodyさん2006/01/14(土) 15:29:20ID:???
>>699
ログが十分に小さければ、foreachとwhileの違いだけで、変わる状況なんて無いね。
仮に、それで問題が起きるなら、プロセス辺りのメモリ割り当てが
かなり小さいぐらいしか考えられない(鯖が貧弱)。
ってことなんだが(苦笑)。

4年書き続けてきたけど、もうだめぽか、ここも。
0704nobodyさん2006/01/14(土) 15:36:47ID:???
10万行ループなどMTの再構築に比べればたいしたことない
0705nobodyさん2006/01/14(土) 15:53:30ID:???
>>701
たのむからローカルでやってくれ
0706nobodyさん2006/01/14(土) 16:33:57ID:???
>>701
他人の管理下にあるサーバで実験しない。自分が動かしているサーバで
実験すれば、そのログを見てデバッグできる。
>>1に書いてある通り、エラーの内容も貼れないんじゃ質問以前の問題だ。

>>703
4年もいるんだったらスルーすることぐらい覚えろよ。
0707nobodyさん2006/01/14(土) 18:00:04ID:???
>foreach( <> )
とか書いてある時点でダメに決まってるじゃん。

それとも4年前からこんな感じだったの?
07087032006/01/14(土) 18:36:01ID:???
>>707
私の書き方は>>336を参照してください。
短いファイルなら、ロックする時間をできるだけ短くするように書いてます。
0709nobodyさん2006/01/14(土) 19:59:22ID:???
> while( <$FH> )
普通こうする。読み込みなら文句なしに最強。

> foreach( @FILE )
いわずと知れたKEMT仕様。そして何故か入門者ご用達。
でも頻繁に書き込み(書き込みロック)が必要な場合好んで使う人も。

> foreach( <$FH> )
謎仕様。ファイル開きっぱなしで配列展開。KEMTもびっくり。
0710nobodyさん2006/01/14(土) 20:31:18ID:???
>>709
while は最強っていうか、単に昔から Perl の参考書に多い処理ってだけじゃ?
0711nobodyさん2006/01/14(土) 21:02:12ID:???
<$FH> は他のメソッドなり何なりにかわるかもしれんが、
それでも逐次読み出しか一気にメモリに読み出してしまうかに大別できるでしょ
多分。
0712nobodyさん2006/01/14(土) 21:10:27ID:???
自分のスクリプトでforeachからwhileに置き換えられるところは置き換えたんですが、その際に1つ疑問が出ました。

リファラのログを取ってて最大件数500件で、501件目が来たら古いリファラは削除して新しいリファラを追加するって処理の時に
現在が何件のログが貯まってるかを調べる時にはwhileだと一旦最後までループさしてカウンタをカウントアップさせて総数を得て、
その次にまたwhileで処理って感じになると思うんですが、

foreachでメモリに負担 なのと whileでDISK I/Oに負担とじゃ他のユーザーも同時に使ってるサーバー上ではどの処理がやさしいんでしょか?

今までforeachしか使ってなくてそれを否定された感があってちょっと自信難儀に陥ってまして助言とか意見があれば参考にしたいと思います。
0713nobodyさん2006/01/14(土) 21:41:50ID:???
>>712
おれならメモリに突っ込んでやるけど
テスト環境を用意できるならベンチとってみれば?

0714nobodyさん2006/01/14(土) 21:56:12ID:???
大抵のシステム(OS)はファイルにアクセスするときに先読みやキャッシングをしてくれるので
Perlで二度アクセスするときのIOは気にする必要は小さなファイルであればいりません。

逆に、プログラムの中でキャッシング的な目的でメモリに読み込もうとすると
OS等の低レベルキャッシングとアプリケーションレベルのキャッシングが
物理メモリに配置されることになって、特別な事情がない限り非効率的です。


ちなみにそういうファイルを後から読み込みたいときは専用のモジュールがあります。
Text::Backwords (名前うろ覚え)
今回のケースではメモリ、IOともにもっとも効率がよくなるかと。
0715nobodyさん2006/01/14(土) 21:59:37ID:???
途中で書き足したら意味が解らん。ヤバス。
まぁ要は専用のモジュール使えって事で
0716nobodyさん2006/01/14(土) 22:04:45ID:???
>>714
File::ReadBackwards ?
0717nobodyさん2006/01/14(土) 22:10:51ID:???
メモリ使用量が数百KBレベルの差しかないんだったら、処理が高速な方を選択するよ。
さっさと処理を終らせてメモリを開放させてあげるほうが共用サーバでは重要だし。
0718nobodyさん2006/01/14(土) 22:19:54ID:???
普通はメモリに読み込まないほうがメモリ使わなくて高速だからね。
どうもそこらへんわかってないやつが多すぎる。
0719nobodyさん2006/01/14(土) 22:24:28ID:???
メモリ数百k無駄遣いしてまで共有サーバーで自分のプロセス優先するのね。
「共有サーバーではそっちが重要」とか思い込み激し杉
0720nobodyさん2006/01/14(土) 22:38:45ID:???
>>719
細かい読み込み(しーく)も、鯖に負担かけるんじゃないの?
携帯も初期はそれで問題になったわけだし
良し悪しは良くわからんけど。
0721nobodyさん2006/01/14(土) 22:44:26ID:???
>718
お前は全部分かってないな
0722nobodyさん2006/01/14(土) 22:54:26ID:???
初心者スレで無理に玄人ぶるのはみっともないね
0723nobodyさん2006/01/14(土) 23:01:51ID:???
>>720

システムのキャッシュが破棄されるほどの間隔をおいてアクセスする場合、
そんな長い時間アプリケーションレベルでメモリを確保しとくのは他のプロセスの邪魔。
そしてそのメモリの消費がさらにシステムのキャッシングを圧迫するという悪循環。

普通はアプリケーションレベルでは間欠・逐次的な読み込みでも。
OSがHDなどと協力してアクセスのあったファイルを物理メモリに先読みしてるので
間欠シークは発生しない。

「特定の状況下」で「ハードからソフトまでを知り尽くした」上でのキャッシングは
当然否定しないし、むしろ俺の理解の及ぶ範囲ではないが。

# 窓達だとデフォルトでディスクキャッシュ用メモリの確保量が少ないから効果あるかもね。
0724nobodyさん2006/01/14(土) 23:03:58ID:???
>>723
前提がおかしくない?つーか自分に都合良い前提にしてない?
0725nobodyさん2006/01/14(土) 23:16:26ID:???
そんなつもりはないんだけれど。
どこが違和感あるのか言ってもらえんと説明のしょうが……
0726nobodyさん2006/01/14(土) 23:27:26ID:???
一般にプロセスは太ると死ぬまで痩せない。
理解が充分でない自覚がある場合はメモリを節約するアプローチで概ね間違わない気がするよ。
0727nobodyさん2006/01/14(土) 23:30:48ID:???
>>723 の言ってるのは
レン鯖で他のユーザの使用率とかも分からないのに
変に考えて小手先の技使ったって無駄ってことでは。

いまどきI/Oのアクセスをユーザが気にしなきゃならんOSなんて
レン鯖で使ってないよ。
しかも言語がPerlなんだよね。

頻繁に叩かれるスクリプトで、ガバッとメモリ喰うと
そっちの方でディスクにアクセスがかかるかも知れないってのを
心配してるんじゃないのかな。
0728nobodyさん2006/01/14(土) 23:36:57ID:???
ともかく変な思い込みでperlのメモリに乗せまくるなと
while( <$fh> )も結局は物理メモリのキャッシュから読み込んでる訳で、
遅くないから心配するなと。
0729nobodyさん2006/01/14(土) 23:39:43ID:???
遅い遅くないの前に、逐次処理しかできないのって不便じゃない?
それで済むならいいけどさ
0730nobodyさん2006/01/14(土) 23:40:09ID:???
鯖用途のHDだとHD内部のキャッシュメモリサイズも民生品とは桁違いだったり
0731nobodyさん2006/01/14(土) 23:49:08ID:???
>729
便利・不便じゃなくてシーケンシャルアクセスをどうやるかでしょ。

foreach( @ ) も foreach( <> ) もやりたい事は(多くの場合)シーケンシャルアクセス。
0732nobodyさん2006/01/14(土) 23:50:31ID:???
スクリプトで一番怖いのが、ファイルロックで
プロセスがプロセスキューに溜まる事だと考えてる。
ファイルリードより、スワップの方がコスト高そうだし。
だから、なるべく早くロックを開放することを考えてるよ。

でも、実際そこまで厳しい状態はほとんど知らないし、
そこまで考える必要があるかどうかは分からんけど。
0733nobodyさん2006/01/15(日) 00:01:11ID:???
Perl【の】コーディング【を】初心者【に】質問【する】スレ
0734nobodyさん2006/01/15(日) 00:04:02ID:???
先に読み込んでおいてからロック解除して後で書き込みロックするってことは
書き込み頻度低いってことでしょ?
(そうじゃなきゃ編集衝突するよね?)

メモリに展開する必要ないじゃん。
0735nobodyさん2006/01/15(日) 00:04:24ID:???
ロックは怖いね。
NASとか使ってると、鯖の構成とか製品によっては
フロントの鯖から、ロックファイルが見えるまでにタイムラグがあったりする。
0736nobodyさん2006/01/15(日) 00:04:59ID:???
みなさん色々ないけんありがとうございます。
読んでいった感じ、「メモリには優しく」 というのを感じました。

ただまた1つ疑問がw
DB 使ってるとして、巨大なテーブルが戻ってきちゃう場合はどうするんでしょ?
さすがにこれはしょがないんでしょうか・・・
0737nobodyさん2006/01/15(日) 00:07:52ID:???
SQLでLIMITとか使う
0738nobodyさん2006/01/15(日) 00:08:55ID:???
>>736
1. DB に処理できることは DB にやらせる
2. 表示なら巨大なものは最初から表示できないから無駄なものは取得しない

いずれでもない場合ってこと?
0739nobodyさん2006/01/15(日) 00:15:22ID:???
>736

普段どうやってDBアクセスしてるの?
まさか一度二次元配列にぶちこむとかやってないよね?
0740nobodyさん2006/01/15(日) 00:21:05ID:???
>739
いやDBは使ったこと無いです(興味あるっちゃありますが・・・)

>737,738
たとえば得られたテーブルが (巨大とはいえないけどとりあえず) 5項目程度で1000行だとして、
SQL文で500行目〜700行目だけ欲しいっていうことって出きるんですか?
出来るならそれで解決なんですが ^^;
0741nobodyさん2006/01/15(日) 00:23:02ID:???
>>740
> SQL文で500行目〜700行目だけ欲しいっていうことって出きるんですか?
できる
0742nobodyさん2006/01/15(日) 00:29:05ID:???
SQLの応答が巨大だからってそれが直にメモリに展開されるわけじゃないから
0743nobodyさん2006/01/15(日) 00:32:01ID:???
Perl側に持ってきちゃったら展開されると思うけど
0744nobodyさん2006/01/15(日) 00:39:40ID:???
>741
なるほろ。 解決しました
thx
0745nobodyさん2006/01/15(日) 00:40:24ID:xHRm9xcd
>>740
sql limit offsetあたりをキーワードに検索をかけると幸せになれるぞ。
つか、スレ違いっぽいな。
0746nobodyさん2006/01/15(日) 01:00:08ID:???
ああスレ違いだageんなバカ
0747nobodyさん2006/01/15(日) 01:05:57ID:a4Y6+QOP
>>746
そんなつまらん事なら書き込むな、このボケ。つか志ねよ。
0748nobodyさん2006/01/15(日) 01:06:45ID:???
>>747
はいはいわろすわろす
0749nobodyさん2006/01/15(日) 13:13:53ID:???
Perlについて学び始めの者ですが、SSIをHTML内に埋め込んだ様な使い方ができると知ってふと思ったのですが…

-sample.html-
<html>
<head>
<!--#exec cmd="sample.pl"-->
こんにちは
</body>
</html>

-sample.pl-
print"<title>sample</title>\n";
print"</head>\n";
print"<body>\n";

…これって良いのでしょうか?
Perlのパスも記述せず、文法的にも…
一応ちゃんと動作してるんですが、何か物凄く間違ってる気がしてなりません…。
0750nobodyさん2006/01/15(日) 13:27:44ID:???
>>610の話題はhttp://pc8.2ch.net/test/read.cgi/tech/1134327348/523-648のことだよね。
利点が分からないなら無理して使う必要はないし、お好みでどうぞ。
ちなみにCGI.pmは標準でインストールされていて、もし入っていなくてもCPANから落として@INC内に入れれば使えます。


# モジュールが重いとか言っていたら、DBIもJcodeもutf8も使っていられませんよ。CGI.pmが重いなら、MovableTypeを使うなんて論外ですね。
0751nobodyさん2006/01/15(日) 13:41:01ID:???
うわぶり返し(; ^ω^)
0752nobodyさん2006/01/15(日) 14:35:28ID:???
まだやりたらないみたいですね^^^
■ このスレッドは過去ログ倉庫に格納されています