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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2010/06/05(土) 21:11:10ID:???
Perlのコーディングで困ってる人のスレです。

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

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

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1251989472/
06716702010/11/16(火) 03:29:36ID:???
補足です
抽出対象は「入れ子」になっていない事が前提です
つまり以下のような存在は考慮する必要はありません

<div class="hoge" id="moge">
<div class="hoge" id="moge"><a href="hage">TEST</a></div>
</div>
0672nobodyさん2010/11/16(火) 03:50:08ID:???
>>670
正規表現でm
0673nobodyさん2010/11/16(火) 05:48:42ID:MILxW7l4
Web::Scraperでいいんじゃないかな
06746702010/11/16(火) 06:45:19ID:???
>>673
ありがとうございます
Web::Scraperで簡易なテストプログラムが動作する所まで進みましたが、
今の所HTMLタグを全て除去した素のテキストしか取得してくれません
>>670で言えば「TEST」しか表示されない状態です
もう少し調べてみます
06756702010/11/16(火) 07:32:25ID:???
さらに調べました

process "mage", "hige" =>"TEXT";

process "mage", "hige" =>"HTML";
に変更してうまくいったようです
0676nobodyさん2010/11/17(水) 12:19:54ID:???
DBIの定義(ユーザ名、パス、サーバ)が面倒なので
以下のように、定義だけモジュール化しています。

use My::Module;
my $mod = My::Module->new();
my $dbh = $mod->ret_DBI;

同様に、Text::XslateをMy::Moduleに書いて
my $tx = $mod->ret_Xslate;という風に使おうと思ったのですが、
mod_perl環境下では、正しく定義されないようなのです。
(My::Module中でpath => '/var/www/html/myapp/template' としているのに、
/var/www/htmlにそんなテンプレはねぇ!と怒られます。)
何か回避策はないものでしょうか?

また、Tiantモードでも怒られまくるのですが、
「Tiantモードでテンプレートエンジンを使った書き方」講座みたいなURLを
ご存知なら、併せて教えてください。
よろしくお願いします。
0677nobodyさん2010/11/18(木) 21:33:53ID:???
何らかの Web Application Framework 使ってみればいいと思うよ。
その My::Module は singleton にすべきじゃないかな。
0678nobodyさん2010/11/18(木) 22:36:52ID:???
パンくずリスト作成
テンプレート出力
ファイルロック
そのほかモロモロ

など、自作関数がいくつかあり、今までは require してただけなんだけど、
これら関数をモジュールにしてファイルを分けるのって非効率だと思います?


なんか自分がどうやって関数とかまとめていけばいいのか分からなくなってきた orz
0679nobodyさん2010/11/19(金) 09:10:25ID:???
ファイル分けなくても
use myModule qw/function_to_use/;
できるようにすればいいんじゃない。
06806762010/11/19(金) 16:58:32ID:???
既にmod_perlに読み込まれているモジュールへの修正は、
httpdを再起動するまで反映されない事によくやく気づきました
orz

>>677
singleton初めて知りました。
稀に引数受けて挙動を変える事もあるので、
なんとなくデメリットの方が大きい気がします。
(きちんとsingletonを理解できてないだけかもしれませんが)

>>678-679
私の場合、主にメソッドを返すMy::Moduleと、
DBIやら自分の鯖へのログイン状態(WWW::Mechanize)やら、
主に定義を返すMy::Definitionに分けてます。
が、Perlしか知らないし、そのPerl関連の書籍も一冊も持ってない人間なので
参考にはしない方がいいんじゃないかなーと思います。
(参考にすべき人のご登場をお待ちしております)
0681nobodyさん2010/11/19(金) 22:46:32ID:???
perl しってるということにするにはちょっと。
0682nobodyさん2010/11/20(土) 00:34:47ID:???
>>678
捨てずに使うことを前提にすると、自分ならこんな感じ。
テンプレート出力はメールの本文作成にも使えそうだから独立したモジュールに。
ファイルロックはファイルシステム関係でまとめたパッケージに放り込む。
パンくずリストは作り次第でフレームワークのプラグイン的位置づけを考えるか、HTML生成系でまとめとくか、かな。
#デザイナーと共同作業するならできるだけテンプレートに直書きしておくのもアリだと思う
#(例えば「>」を「>」に変える程度ならソース追わなくていいように)

まあ、一部分使いたいのに余計なものが付いてくる嫌悪感の度合いで決めたらいいんじゃないかな。
あとちょこちょこ手入れるだろうからバージョンは書いといた方がいいよ。
0683nobodyさん2010/11/20(土) 00:57:44ID:???
> あとちょこちょこ手入れるだろうからバージョンは書いといた方がいいよ。

そんなつまらんことよりは、機能増やすたびにテスト書くようにして、
git なり svn に入れて一元管理するべき。
0684nobodyさん2010/11/20(土) 01:59:11ID:???
今時modperlなんて使わないでplack使いなよ。書き換える度にmodperl再起動とか面倒くさいでしょう。
ちゃんとしたMVCで書いてれば動作確認をブラウザからじゃないと出来ない、なんてことにはならないけど。
06856822010/11/20(土) 08:29:04ID:???
>>683
説明不足だったけど、
過去に納品したものに改修の依頼が入った時に$VERSION変数があるといいよという程度の話。
svnで言うならリリースごとにタグを付ける感覚かな。
0686nobodyさん2010/11/20(土) 11:53:57ID:???
文字列を置き換えする時に変数の中身を正規表現として扱わないようにしたいのですが、
この場合個別にエスケープしなければいけないのでしょうか?
my $value = "test(test)[test]{test}test";
my $replace = "(test)[test]{test}";
$value =~ s/$replace/test/g;
上のような場合に結果が「testtesttest」になるようにしたいといった感じです。
単純に置き換えしたいだけなのでraplace関数的なものがあればそれで十分なのですが…
初歩的な質問ですみません。よろしくお願いします。
0687nobodyさん2010/11/20(土) 12:21:57ID:???
$value =~ s/\Q$replace\E/test/g;
0688nobodyさん2010/11/20(土) 12:59:38ID:???
>>687
メタ文字で回避できたんですね、
もう一度よく調べて直してみようと思います。
どうもありがとうございました。
0689nobodyさん2010/11/20(土) 13:01:14ID:???
quotemeta もあるよ。
0690nobodyさん2010/11/20(土) 17:35:05ID:???
>>684
> ちゃんとしたMVCで書いてれば動作確認をブラウザからじゃないと出来ない、なんてことにはならないけど。

ちゃんとしたMVCについて詳しく。
0691nobodyさん2010/11/20(土) 20:16:33ID:???
HTML を返すかどうか (テンプレート出力とかパンくずとか)
ファイルロックほかファイル操作全般
汎用 (time で得たのを文字列で返すとか)

の3つに分けてみた。

オブジェクトにしたら便利なのは、ファイルロックとテンプレート出力ぐらいかな。。。


がんばりゅ!
0692nobodyさん2010/11/20(土) 22:47:11ID:???
>>691
github とかで晒すとアドバイスもらえていいと思うよ。
0693nobodyさん2010/11/21(日) 08:41:54ID:???
>>690
684ではないけど、少なくともMに関してはCやVが無くても(ブラウザじゃなくても)テストできるって意味じゃないかな。
#plackは使ったことないから分からないけど、Cも作り次第でテストケース作れないことはないはず
0694nobodyさん2010/11/21(日) 14:17:21ID:???
> Cも作り次第でテストケース作れないことはないはず

C に M 置いちゃう?
0695nobodyさん2010/11/23(火) 03:34:20ID:???
>>690
・Cにビジネスロジックが書かれていない
・Mに書かれたビジネスロジックは全てスクリプトから呼び出せる

大雑把に言うとこんな感じ。用はブラウザを通してしか呼び出せないロジックを生み出さないようにする。

>>693
確かにApache::TestやTest::WWW::MechanizeなどでCのテストも書けると言えば書ける。
でもそれらはLWPなどを使って、ブラウザからのアクセスを模してるだけなんだよね。
0696nobodyさん2010/11/23(火) 14:56:52ID:???
>>684
CGI::Sessionでログイン状態の確認なんかも
ブラウザなしでできる?
0697nobodyさん2010/11/24(水) 03:17:12ID:???
open(IN,"+>> po.txt");
while($_ = <IN>){
chop;
print "$_";
}
close(IN);


ファイルの内容を1行ずつ読み込んで出力したいのですが出力できません
行入力演算子が効かないのか何なのか、原因がよくわかりません
どうしたらいいでしょうか?
0698nobodyさん2010/11/24(水) 04:56:07ID:???
"+>>" を使っているからダヨ
open(IN, "po.txt"); でイイヨ
ていうかなんで "+>>" なんか使ってんだ?
06996972010/11/24(水) 05:07:13ID:???
できました
読み書き両方出来た方がいいと思って+>>付けていました
ありがとうございました
0700nobodyさん2010/11/24(水) 05:36:30ID:???
読み書き可能にするopenの仕方には'+>' '+<' '+>>'の3通りあるけど全部動作が違うダヨ
どう違うのかは参考書を見るなりして自分で調べるダヨ
0701nobodyさん2010/11/24(水) 09:25:00ID:???
読み書きしたくてファイルがなければ作って欲しくてすでにあったら
中身は消さないで欲しくて、でもappendじゃ困るというときに使える
のがないんだよなw 結局sysopenのお世話になるしかないという...
0702nobodyさん2010/11/24(水) 15:21:47ID:???
>>701
どういう状況でそんなオープンの仕方が必要になるのかよくわからんが、たとえば
my $filename = "foobar.txt";
open my $fh, -f $filename ? '+<' : '+>', $filename or die $!;
みたいなのでいいんじゃね?
0703nobodyさん2010/11/24(水) 15:57:56ID:???
>>702
むかしCGIのアクセスカウンターを自作しようとして困ったんだよね。

その方法だと-fとopenがatomicじゃないので運悪いと書いたのが消えちゃう。

結局'+>>'で開いてとじてから'+<'とかやったっけ。なんか無駄っぽいなーと
思ってすごい嫌だった記憶が。



0704nobodyさん2010/11/24(水) 16:56:30ID:???
<, >, >> これしか使った事ないし困った事もないんだけど、+>, +<, +>> ってどういう時に嬉しいの?
0705nobodyさん2010/11/24(水) 17:03:41ID:???
>>684
MVCって
 M − モジュール
 V − テンプレート
 C − スクリプト
って解釈してもおk?
0706nobodyさん2010/11/24(水) 17:13:21ID:???
>>703
排他制御したいんだったら結局flockなり使わないとだめなんでは。
'+<'でも排他的にopenはできないでしょ。
同時に2つ以上のプロセスから'+<'でopenされて書き換えられたら、
内容が消えることはないとしても本来の値と食い違う可能性があると思うが。
そこらへんはsysopenでも同様なんでは。sysopenだと排他的にopenできたりすんのかな。

>>704
あるファイルに対して読んだり書いたりを同時にしたい時に使う。
おいらも使ったことない。
0707nobodyさん2010/11/24(水) 17:43:05ID:???
>>704
更新の必要があるログを開く時

< で読み込んでも、更新しようとする時一々閉じてから開かなきゃいけないでしょ?
+< で開いておけば、seek するだけで書き出しできる。
アクセスが少なくて DISK IO が少ないなら、いったん閉じて開いてもいいとは思うけど・・・
0708nobodyさん2010/11/24(水) 18:11:30ID:???
>>706
当時は +< で開いた後さらににflockしてました。
sysopenというのがあるというのを知ったあとは、

sysopen FH, 'file', O_RDWR|O_CREAT|O_EXLOCK

で一発でできて感動したものです。

今だとDB使っちゃいますけどね。
0709nobodyさん2010/11/24(水) 18:31:11ID:???
なるほど。O_EXLOCKはBSD系だけ有効で、Linuxだと使えないんだ。
0710nobodyさん2010/11/24(水) 18:50:39ID:???

プロセス1、ファイルが存在しないと判別
プロセス2、ファイルが存在しないと判別して作成してflockまで行う
プロセス1、ファイルが存在してなかったから作成(プロセス2によりロック中)してデータ壊れる

これで壊れないか?
0711nobodyさん2010/11/24(水) 18:52:42ID:???
俺もファイルの排他で疑問に思っていたけど、
DBと同様なトランザクションの仕組みって
perlで可能なの?
0712nobodyさん2010/11/24(水) 18:58:55ID:???
perlでDBMS書けば可能。
0713nobodyさん2010/11/24(水) 19:07:57ID:???
>>712
それ、DBを使うってこと?
0714nobodyさん2010/11/24(水) 19:34:51ID:???
>>713
DBを作るってこと。
0715nobodyさん2010/11/24(水) 19:41:34ID:???
>>714
ファイルで可能?
0716nobodyさん2010/11/24(水) 20:03:34ID:???
本格的?な既存のDBと比べたらパフォーマンスは比べものにならんくらい落ちるだろうけど
まあ"DBと同様のトランザクション"は実現できるんじゃないかと。
必要な機能だけに絞って実装すればいいんだし。
インタフェースも別にSQLに準拠しなくても好きなように設計すればいいし。

DBでflockによる排他処理とか面倒なことを考えなくていいのは
DBが単独で一手に集中してそのへんを引き受けてるからで、
片や複数プロセスが素のファイルにアクセスする時にflockとかで排他処理をするのは、
競合しないよう一手に引き受けてくれるまとめ役(交通整理役、管理役)がいないからで、
だったらデータの面倒を集中的に見てくれる、独立して動作するプログラムをperlで書いて、
複数プロセスからのデータのアクセスはそいつを介してやるようにすればいい訳で、
それはつまりperlでDBシステムを書くってことになる訳で。という話。

といっても実際に作ったことがある訳じゃないんで具体的にどう作るかとかは
実際に作ってみないとわかりません。
0717nobodyさん2010/11/24(水) 20:17:47ID:???
自分でフラグ用ファイル作ればいいんじゃないの?
初心者の洞察でスマンが

とあるプロセス
my $flagfile="locked";
while(!do{ open my $fh,">",$flagfile; close $fh; }) {}
# ファイル処理
unlink $locked;

別のプロセス
my $flagfile="locked";
while (-e $flagfile) {}
# ファイル処理
0718nobodyさん2010/11/24(水) 20:25:43ID:???
>>717
残念ながらそれじゃだめだな。
「Perl 排他処理」でググれ。
0719nobodyさん2010/11/24(水) 20:30:06ID:???
>>718
別に俺には同でもいい話なんで、思いつきを書いたまで
どこらへんが残念で、なぜだめなのか、説明できるかい?

さすがにそこまで俺は深入りする気はない、すまんね
0720nobodyさん2010/11/24(水) 20:43:12ID:???
>>719
とりあえず簡単な例として、「別のプロセス」が「ファイル処理」を
開始してから終わるまでの処理中に「とあるプロセス」が動き出したら
2つのプロセスが一緒に処理してぶつかっちゃうだろ。
0721nobodyさん2010/11/24(水) 20:54:11ID:???
>>720
多少の遅延が許されるなら
while(!do{ open my $fh,">",$flagfile; close $fh; }) {}
の直後にsleep関数かませばよくね?
0722nobodyさん2010/11/24(水) 21:13:49ID:???
>>716
書こうとした事を先に書かれた orz

「まとめ役が居ないから」
これに限る。


全てのファイル操作を一手に引き受ける Apache モジュールを作って、
全ての CGI/モジュールは ファイル操作を受け持つ Apache モジュール経由で
操作すれば OK


そうすれば DB を使わないスクリプトとかでも完全なファイルロックが可能。
そのモジュールにバグが無ければだけどw
0723nobodyさん2010/11/24(水) 22:54:58ID:???
>>717
> while(!do{ open my $fh,">",$flagfile; close $fh; }) {}
このopenて、毎回必ず成功するか毎回必ず失敗するか、しかないよ。たぶん。
必ず失敗するとしたらファイルのパーミッションで弾かれるとかくらい。(他にもあるかな?)
だからwhileで「closeが成功するまで繰り返す」てのは意味ない。

まあ仮にこれで「ファイル使用中ですよ」宣言ができたとして、
前者のプロセスと後者のプロセス、それぞれ同時に1つのプロセスしか起動しないとしても
タイミングによってはまったく排他処理できない。
上のプロセスをA、下のプロセスをB、としてそれぞれ行番号つけてみる。

A1: my $flagfile="locked";
A2: while(!do{ open my $fh,">",$flagfile; close $fh; }) {}
A3: # ファイル処理
A4: unlink $locked;

B1: my $flagfile="locked";
B2: while (-e $flagfile) {}
B3: # ファイル処理

(続く)
0724nobodyさん2010/11/24(水) 22:56:39ID:???
(続き)

AのプロセスとBのプロセスは同時に任意のタイミングで動作するわけだから、
もしも次のような順番で処理が進むと…

B1: my $flagfile="locked";
A1: my $flagfile="locked";
B2: while (-e $flagfile) {}
A2: while(!do{ open my $fh,">",$flagfile; close $fh; }) {}
B3: # ファイル処理
A3: # ファイル処理
A4: unlink $locked;

B2の段階でA2のロックはかかってないので、プロセスBは次にB3の処理に入る。
その直前にプロセスAがA2でロックをかけても、プロセスBはそれに気づかない。
で、プロセスAのファイル処理(A3)とプロセスBのファイル処理(B3)が同時に(交互に)走って、
結果がわやくちゃになる、と。

どのプロセスも、自分以外のプロセスがロックをかけてないかチェックする必要があるし、
自分のプロセスが使用中なことを他のプロセスに知らせる(ロックをかける)必要がある。
そして、その時に上の方にでてきた「atmic」な処理が必要になるんだな。
つまり、ロックをチェックする処理とロックをかける処理を、OSのマルチタスク処理で
細切れにされないようにまとめて(一気に)やらないといけない。
それが可能な手段はflockやsymlinkやmkdirや、sysopenのO_EXLOCKなど、限られている。

という訳で >>721 のsleepかます処理は全く意味がないんだった。
0725nobodyさん2010/11/24(水) 23:50:30ID:???
>>723
Windows用のPerl5.8で確認してみたけどsleep(1)をそれぞれのwhile文の後に
かますとちゃんと動作するようだよ
確認してみた?
0726nobodyさん2010/11/25(木) 00:19:03ID:???
>>725
sleepかまさなくても不都合なく動作する時は動作するし
(ていうかプロセス数が少なく処理のタイミングがまばらなら大抵の場合は問題ないだろう)
sleepかましてもカチ合ってうまくいかない時はうまくいかない。
それだけのことでしょ。
逆になんでsleepかますとうまく動くのか説明してくれ。
0727nobodyさん2010/11/25(木) 00:27:18ID:???
スリープ時間がアクセス権を他のプロセスに譲るのに必要なんじゃないの?
と思ったけど?
0728nobodyさん2010/11/25(木) 00:30:56ID:???
ちなみにスリープ時間なくすと、動作が不安定化してうまくいかなかった
最初たまたまうまくいくことがあるが、すぐにどちらかのプロセスがアクセス権を独占する
0729nobodyさん2010/11/25(木) 00:52:31ID:???
> どちらかのプロセスがアクセス権を独占する
そりゃたぶんどちらかじゃなくて上の方のプロセスがいつも独占するんだろう。
おそらくそれぞれの処理をwaitを置かずに無限ループ内でひたすら繰り返すような検証スクリプトを書いたんじゃないの。
1秒もsleep入ってるんだから、それぞれ処理時間が1秒以内に完了する程度の量なら、
うまく相互の起動のタイミングが合えば延々走り続けるだろうな。
ただループを回る時間に両者で少しでも差があれば、
いつかは上の方のプロセスが処理を独占するようになる。
ループ1回につき1秒ずつ遅延があるから、そうなるまでだいぶ待たないといけんだろうけど。
0730nobodyさん2010/11/25(木) 01:02:48ID:???
>>729
いや、正確に言うとごく短時間のウエイト処理を置いた
その処理時間ではアクセス権を譲渡しきれなかった

というか、要するにウエイト時間を長くしていけばうまくいくという理解でいいのかな?
もう、これ以上この件に関わるの疲れてきたんだけど・・・
0731nobodyさん2010/11/25(木) 01:11:03ID:???
>>730
> というか、要するにウエイト時間を長くしていけばうまくいくという理解でいいのかな?
違う。ちゃんと排他制御をしないと結局のところ解決はしない。
ウェイト(sleep時間)を長くすればするほど、カチ合う確率は低くなるだろうけど、
確率が低くなるだけでカチ合わなくなる訳ではないのだ。
まあ「1秒」ってコンピュータの処理速度からしたらものすごーく長い時間だけどさ。

> もう、これ以上この件に関わるの疲れてきたんだけど・・・
おつかれさま。おやすみ。気が向いたら排他制御の仕組みをきちんと勉強してみてね。
0732nobodyさん2010/11/25(木) 01:14:16ID:???
>>730
追伸。「sleepを入れることでアクセス権の譲渡が間に合うようになる」という解釈は間違っているので、念のため。
0733nobodyさん2010/11/25(木) 01:17:43ID:???
コード晒せよと思ふた>釣り
0734nobodyさん2010/11/25(木) 02:05:15ID:???
Web上にしっかりした解説が山ほどあるんだから、>>718で終わってた話なんだけどね。煽りでも何でも無く。

>>705
Vはいいとして、
Cが遷移とかWeb関係、
MがWebじゃなくても使いまわせるロジック
乱暴だけど、MにORMだとかDBだとかを単純に対応付けるよりかはマシな説明だと思う。
07356762010/11/25(木) 09:57:28ID:???
>>734
コード晒してみて良いでしょうか。
細かい点はさておいて、MVC的に合ってるのか確認したいのです。
肝心のモジュールの中身が一番いい加減だとは思うのですが・・・
改行数の都合上、色々と端折ります。
use CGI;
use My::Module; # My::Definitionを継承、ret_xxxxメソッドが該当
use My::Session;

my $session = My::Session->new();
my $sess  = $session->chk_session; # if session expired, return undef.

if (!$sess) {
  $session->loginForm;
} elsif ($sess) {
  my $q     = CGI->new();
  my $param1 = $q->param('param1');
  my $mod   = My::Module->new();
  my $tx    = $mod->ret_Xslate;
  my $dbh   = $mod->ret_DBI;
  if (!$param1) {
    my $contents = $tx->render( 中略 );
    print $contents;
  } else {
    # 大きく中略。$returnを取得するSQL文を書いてる。
    my $contents = $tx->render("hoge.tmpl", {
      title  => "fuga",
      value => $return;
    });
    print $contents;
  }
}
0736nobodyさん2010/11/25(木) 21:42:32ID:???
何らかの WebApplicationFramework 使ってみるところからはじめればいいよ。
0737nobodyさん2010/11/25(木) 23:00:23ID:???
※ただしCatalystを除く
0738nobodyさん2010/11/26(金) 00:07:31ID:???
>>735
># 大きく中略。$returnを取得するSQL文を書いてる。
例えばこの$returnは仮に foo($param1) という呼び出しで取れるとして、
$param1がフォームからの入力値である必要は無く
コマンドラインから呼び出して foo($ARGV[0]) としても正しく動くわけで、
foo()はコントローラには無くてもいいよね。
#そう切り分けることを>705でモジュールと呼んでたのなら近い認識かも知れない

余計なお世話だけど if(!$param1) だと $param1 に "0" が入った時も真判定されるので
if ($param1 ne "") という意図ならそのように書いた方がいいよ。
0739nobodyさん2010/11/26(金) 01:03:21ID:???
ne "" だと、「"param1"というパラメータ名はあるが値は空文字列」という場合に駄目だな。
param('param1') は、param1というパラメータ自体が無かった場合はundefを返し、パラメータはあるが値が無かった場合は空文字列になる。
だから ne "" は正しくなく、「動く」のを優先するなら735のままで実は正しい。ただしたまたま動いているだけなので、ちゃんと書くならdefinedを使う。
if (not defined $param1)
あと$param1がundefだった場合に ne を使うとuninitializedのwarnが出る。
0740nobodyさん2010/11/26(金) 02:02:18ID:???
本当に余計なお世話になってしまってた。ごめんよ。
07416762010/11/26(金) 03:18:48ID:???
>>738
>>705はM - モジュールというより、M - モジュール化という方が近かったですね。
ちなみに、今現在$returnを取得するのは、各スクリプト内固有のSQLなので、
スクリプト間でSQLに重複があれば、モジュールに放り込もうとは思っています。

>>738-739
実はここ、
> my $sess  = $session->chk_session; # if session expired, return undef.
の、「return undef.」はウソで、実際には1 or 0を返しています。
if ( not defined $sess )とすると、全てのセッションが通る・・・
param1のケースを考えると、
× return 0;
○ return undef; # or return;のみ
とした方が良さそうですね。

色々とありがとうございました。
0742nobodyさん2010/11/26(金) 16:52:51ID:???
これってどういう意味でしょうか?

>$ua = LWP::UserAgent->new;
0743Perl忍者 ◆M5ZWRnXOj6 2010/11/26(金) 17:17:16ID:pwS23Ki1
低レベルなスレ
0744nobodyさん2010/11/26(金) 17:24:09ID:???
初心者質問スレですから。
教えていただけないでしょうか。>>742
0745nobodyさん2010/11/26(金) 17:37:32ID:???
>>743
やってもらいたいことがあるんだけど。
0746nobodyさん2010/11/26(金) 17:45:18ID:???
>>743
自作のショッピングカートプログラムにクレジットカード決済機能をつけたい。
その為には、決済代行業者のプログラムに接続しなきゃならない。

できるか?
0747nobodyさん2010/11/26(金) 18:07:16ID:???
>>744
忍者はスルー推奨

>>746
またお前か
0748nobodyさん2010/11/26(金) 18:07:45ID:???
>>747
誰だと思う?
0749nobodyさん2010/11/26(金) 18:31:10ID:???
my $ua = new LWP::UserAgent;
my $ua = LWP::UserAgent->new;

って同じなん?
0750nobodyさん2010/11/26(金) 19:50:57ID:???
同じだと思う、俺の中ではな。

俺だよオレ俺
0751nobodyさん2010/11/26(金) 20:12:08ID:???
結局、同じ内容でもいくつかの方法があるってことか。
必ずしも決まった形ではないようだね。
0752nobodyさん2010/11/26(金) 20:35:45ID:???
矢印を使わない書き方は間接オブジェクト記法というんだけど、
曖昧さがあってときどき期待しない解釈をされてわかりにくい
バグの元だから矢印だけを使う方がいいとperlobj(1)に書いて
あるよ。
0753nobodyさん2010/11/26(金) 21:21:45ID:???
->の意味が分からないので、具体例を教えて下さい。
0754Perl忍者 ◆M5ZWRnXOj6 2010/11/26(金) 21:49:28ID:pwS23Ki1
値の検証などできるよクレジット
あと外部プログラムにつないだりできるよ
0755Perl忍者 ◆M5ZWRnXOj6 2010/11/26(金) 21:52:42ID:pwS23Ki1
なんでもできるよ^o^

オブジェクトの理解でつまってるってほんと終わってるねw
0756nobodyさん2010/11/26(金) 22:57:56ID:???
my $ua = new LWP::UserAgent;

my $ua = LWP::UserAgent->new;
のシンタックスシュガー、だっけ?
0757nobodyさん2010/11/26(金) 23:30:39ID:???
シンタックスシュガーって何?っていう質問が来ると思うよ。
0758nobodyさん2010/11/26(金) 23:47:19ID:???
$fh->print
print $fh
0759nobodyさん2010/11/27(土) 00:29:26ID:???
>>747
SSLだからセキュリティは完璧クンか。
0760nobodyさん2010/11/27(土) 03:55:49ID:???
とあるシュガーの統語法〈シンタックス〉
0761nobodyさん2010/11/27(土) 04:38:13ID:???
むしろ

「とあるPerlの糖衣構文(シンタックスシュガー)」

思ったよりつまらんな
0762nobodyさん2010/11/27(土) 11:15:26ID:???
>>759
誰を刺してるんだ?
0763なるとくん2010/11/27(土) 19:43:14ID:40qrjSo/
宮川達彦=うちはイタチ
0764nobodyさん2010/11/27(土) 22:11:23ID:???
>>761
これ?
ttp://item.rakuten.co.jp/koyoproduck/01221/
0765nobodyさん2010/11/28(日) 00:44:24ID:???
たぶんそれだ!
0766nobodyさん2010/11/28(日) 01:05:51ID:???
>>762

> >>746
> またお前か ←
0767nobodyさん2010/11/29(月) 05:53:06ID:???
Perlの文中の配列をjavascriptの中でそのまま使いたいのですが上手くいきません

@list = (a,b,c,……);
$length = @list;

<script language="javascript">
for(i = 0; i<$length; i++){

#このfor文の中で
# $list[i] を使うとエラーになり、
# "$list[i]"だと参照できますがインデックスのiがインクリメントせず最初の要素aが繰り返し参照されます。インクリメントしてほしいです

}

どうしたらいいでしょうか?
0768nobodyさん2010/11/29(月) 06:20:49ID:???
perl の中で JavaScript を print してる部分を晒してもらわな・・・
0769nobodyさん2010/11/29(月) 06:32:34ID:???
perlで書いたCGIスクリプト中のJavaScriptで、
perl側の配列を使いたい、ということ?
でもperlで作った配列はJavaScriptからは当然見えっこないんだから
JavaScript側にもperlの@listと同じデータ列の配列を定義しておいてやらねばいけないんでは

### perlコード
my @list = (1, 2, 3);
# @list = (a, b, c) は変じゃないか? ("a", "b", "c") ならわかるけど…
my $js_array = join ', ', @list;
# @listの内容が文字・文字列の場合はこうかなちょっと冗長だけど
# my $js_array = join ', ', map "'" . $_ . "'", @list;

### JavaScriptコード
print <<EOT;
<script type="text/javascript">
list = new Array($js_array);
for (i = 0; i < list.length; i++) {
document.write(list[i]);
}
</script>
EOT

それとも JavaScript のループ内で、JavaScriptの配列の添字 (i) を使って
Perl の側の配列 (@list) の要素を取り出したいということ?
しかしその場合そもそもJavaScriptのコード側がforループになっている必要あるの?
Perl側の段階でforeach等でループ処理するべきなんでは
07707672010/11/29(月) 07:16:51ID:???
>>768
中身も書くべきでしたね
すみません


>>769
joinでまとめて変数に入れれば良かったのですね
配列として使いたかったので助かりました
ありがとうございます
■ このスレッドは過去ログ倉庫に格納されています