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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/07/27(木) 17:04:23ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0756nobodyさん2006/08/27(日) 06:54:57ID:???
>>754
ファイルから読んだ情報を同じファイルに書き戻しているように見えるのは気のせいですか。

# おまけ1: インデントはちゃんと揃えよう。
# おまけ2: 貼るコードの行の途中に全角空白を入れないで。
0757nobodyさん2006/08/27(日) 09:49:03ID:???
またKENTか(´・ω・`)
0758nobodyさん2006/08/27(日) 09:51:58ID:???
>>752
いろいろ投げっぱなしすぎ(´・ω・`)
0759nobodyさん2006/08/27(日) 10:20:20ID:???
>>758
……、そっとしておいてやれ。
07607522006/08/27(日) 10:32:46ID:wHycBp2f
>>758
すいません、まじで困ってます。
どこをどうすればいいか教えてください。m(_ _)m
0761nobodyさん2006/08/27(日) 13:26:31ID:???
>>760
出来る奴に金払ってやってもらえば?
07627512006/08/27(日) 13:32:18ID:???
>>756
あ゛…
すみません、ご指摘の通りです。

頂いた情報を調整して無事出来ました。
ありがとうございました〜

# おまけの1,2の方はすみません。>>1の文を読み違えていた為あの書き方となってしまいました。申し訳ございません。
0763nobodyさん2006/08/27(日) 13:37:46ID:???
>>760
・そのスクリプトはPHPなのでこのPerlスレで聞くのはスレ違い。
・お前は前にPHPのくだ質スレで同様の質問をして既に解答を得ている。
・そもそも件のスクリプトは無断での再配布を禁止されており、
 例え質問のためであっても本体をうpろだに上げるのは規約違反。
 お前はPHPのくだ質スレで既にそれを指摘されている。
・にもかかわらずお前はちゃっかりソースから該当部分を削って
 素知らぬ顔で再度うpしてここで聞き直した。

削除された部分:
> //================================================================
> // 【Form Mail】
> // Script by yosuke [http://www.yo-chan.com]
> // Design by noriko [http://www.cryforthemoon.com]
> //
> // ※このフォームメールの著作権は、yosuke、及び norikoにあります。
> //  無断でこのフォームメールを再配布することは禁止します。
> //================================================================


それを踏まえた上でどうすれば良いのか教えてやろう。

お前のような糞野郎にそのスクリプトを使用する資格はない。
2chにはお前のような糞野郎の相手をする暇人も居ない。
こっちは全部お見通しだ。そのまま死ぬまで困れやこのヴォケが。
0764nobodyさん2006/08/27(日) 15:38:21ID:???
>>763
mjsk!? クズだなーwww
0765nobodyさん2006/08/27(日) 16:18:21ID:???
高校生か中学生だな
宿題は済んだ?
0766nobodyさん2006/08/27(日) 17:16:25ID:hx6g770Y
ある文字列内に「5x3」といった「(数字)x(数字)」というのがあれば
「x(半角エックス)」を「×(記号)」に変換して「(数字)×(数字)」という形にしたいと思い、
if(($hoge =~ /\dx\d/)||($hoge =~ /\dX\d/)){$hoge =~ s/X|x/×/g;}
と書いてみたんですが、これだと「(数字)x(数字)」が1箇所でもあれば
その条件以外の「x(X)」も置換されてしまいます。
ダメ元で、
$hoge =~ s/\dx\d/\d×\d/g;
$hoge =~ s/\dX\d/\d×\d/g;
としてみたんですが、やっぱりダメでした...。
何か良い方法はないでしょうか?
0767nobodyさん2006/08/27(日) 17:26:46ID:???
>>766
ヒント:グルーピング
$hoge =~ s/(\d)[xX](\d)/$1×$2/g;
0768nobodyさん2006/08/27(日) 17:27:25ID:???
あああ何やってんだ俺は
iつけたほうがいい
0769nobodyさん2006/08/27(日) 17:27:46ID:???
>>766
ヒント:前後読み
$hoge =~ s/(?<=\d)x(?=\d)/×/ig;
07707662006/08/27(日) 17:50:25ID:???
>>767-768
$hoge =~ s/(\d)x(\d)/$1×$2/ig;
言われた通りの方法でできました!
括弧で括るとグループとして扱われるんですね。
大変勉強になりました。
ありがとうございました!

>>769
こちらの方法でもできました!
「前後読み」についてはちょっと分からなかったので
改めて調べてみようと思います。
まだ全然理解できていませんが、自分の中で
ものすごく幅が広がるような気がします。
ありがとうございました!

やっぱり正規表現は時間を見つけてしっかりと勉強しないといけないですね。
高くて今まで二の足を踏んでいましたが、思い切って
あのフクロウの表紙の本買ってみようと思います。
0771nobodyさん2006/08/28(月) 06:46:30ID:???
>>767
目的でいうとキャプチャリングだね。重箱の隅。
0772nobodyさん2006/08/28(月) 07:03:02ID:???
>>770
> あのフクロウの表紙の本買ってみようと思います。

フクロウも読んでおいたほうが良いのは確かだけれど、Perl をやるならラクダの表紙の本もどうぞ。Perl の正規表現について充分に詳細な説明が載っています。
「前後読み」に関しては、邦訳 P.234「5.10.1 ルックアラウンドアサーション」でほぼ完全な解説が得られます。

Perl 付属の perlrequick, perlretut, perlre の各オンラインドキュメントも参照。
0773nobodyさん2006/08/28(月) 20:16:32ID:???
出力するファイルの文字コードをutf8にしたく

use encoding 'shift-jis';
use open OUT => ":encoding(utf8)";
open O,">test.txt";
print O "hoge";
close O;

こんなコードを書いたのですが、ファイルに日本語が含まれていないと
shift-jisになってしまいます。半角英数字だけのファイルでもutf8に
するにはどうすればいいんでしょうか。
0774nobodyさん2006/08/28(月) 20:26:13ID:????BRZ(1002)
         ,. -‐'''''""¨¨¨ヽ
         (.___,,,... -ァァフ|
          |i i|    }! }} //|
         |l、{   j} /,,ィ//|
        i|:!ヾ、_ノ/ u {:}//ヘ 
        |リ u' }  ,ノ _,!V,ハ |
       /´fト、_{ル{,ィ'eラ , タ人
     /'   ヾ|宀| {´,)⌒`/ |<ヽトiゝ
    ,゙  / )ヽ iLレ  u' | | ヾlトハ〉
     |/_/  ハ !ニ⊇ '/:}  V:::::ヽ 
    // 二二二7'T'' /u' __ /:::::::/`ヽ
   /'´r -―一ァ‐゙T´ '"´ /::::/-‐  \   
   / //   广¨´  /'   /:::::/´ ̄`ヽ ⌒ヽ  
  ノ ' /  ノ:::::`ー-、___/::::://       ヽ  }
_/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::...       イ 
0775nobodyさん2006/08/28(月) 20:39:31ID:???
>>773
英語だけならASCIIでもShift-JISでもUTF-8でも全く同じだから。
英語だけのファイルを、お前の使ってるエディタがShift-JISとして認識するようになってるだけ。

と、エスパー回答してみる。
0776nobodyさん2006/08/28(月) 20:53:01ID:???
>>775
ありがとうございます。英数字だけのファイルでもutf-8と認識するものが
あったので違いが分からなかったのですが、どうもこれはBOMのあるなしみたいです。
0777nobodyさん2006/08/28(月) 20:59:37ID:???
すみません。Catalystのモデル周りで詰まっていまして、
質問させて頂いてもよろしいでしょうか

CREATE TABLE TblDiary(
parano int4
order_no int4
belong_dno int4
have_illustno int4
PRIMARY KEY(parano)
);

CREATE TABLE TblIllust(
illustno int4
illust_name text,
PRIMARY KEY(illustno)
);

上記の「TblDiary」と「TblIllust」という2つのテーブルがあって、
TblDiary.have_illustnoとTblIllust.illustnoを結合(1対1)させたいのですが、

my $table = $c->model('DBIC::TblDiary');
$table->has_one('illust_bind' => 'Test::Model::DBIC::TblIllust', 'illustno');
my $records = $table->search(
{belong_dno => $dno},
{order_by => 'order_no'},
{prefetch => ['illust_bind']}
);

と書いた場合、TblDiary.paranoとTblIllust.illustnoが結合してしまいます。
これを、本来望んでいるTblDiary.have_illustnoとTblIllust.illustnoを
結合するにはどのようにコーディングすればよろしいでしょうか。
お手数をおかけしますが、どうかご教授の程、よろしくお願いいたします。
07787772006/08/28(月) 21:06:47ID:???
>>777ですが、TblDiaryテーブルの「have_illustno」を結合するカラムとして
指定したいのですが、どのように指示を出せば良いのか途方にくれております。
TblDiaryテーブルの「TblDiary」と結合するのは、おそらく指定がなく、
主キーだからだと思うのですが・・・

質問に不備な点等がありましたら、申し訳ございません。
その場合は、ただちに訂正・修正をさせて頂きます。
07797772006/08/28(月) 21:09:41ID:???
>TblDiaryテーブルの「TblDiary」と結合するのは、

申し訳ないです

→TblDiaryテーブルの「parano」

の間違いでございます。
0780nobodyさん2006/08/28(月) 22:28:36ID:????BRZ(1020)
テーブルやカラム名がキモくてちゃんと見てないけどsearchの引数がおかしいよ
0781nobodyさん2006/08/28(月) 23:33:39ID:???
>>780
レスありがとうございます。
searchの引数指定が変ですか・・・

第1引数にwhere、第2にorderだと思いましたが、
prefetchを入れる順や書き方などに問題があるでしょうか?
今の状態でも動いてはいますが、怖いので確認してみます。

テーブル名とカラム名がキモくて申し訳なく・・・
 
0782windows恐るべし2006/08/29(火) 00:32:33ID:f+0FCMVu
すいませんが、質問させて下さい。
状況:
以前までUNIXサーバーでPerlを使っていたのですが、
新しくWindows2003ServerのIIS6.0へCGIプログラムを移動することになり問題発生です。
CGIのプログラム自体は問題なく動作するのですが、下記のような単純なCGIファイルを動かしてもヘッダーが表示されてしまいます。
--------------------------------------------
#!/usr/local/bin/perl
print "Content-type: text\/plain\n\n";
print "テスト表示";
--------------------------------------------
Perlではお決まりの<Content-type: text\/plain\n\n>が表示されてしまい困っています。
消してしまえばいいのかもしれませんが、ローカル環境でPerlが動かなくなってしますので消したくありません。
どうかよろしくお願いいたしますm(._.)m
0783nobodyさん2006/08/29(火) 00:50:42ID:???
教えて下さい。
↓サブジェクトが本文にめりこんで送信されるのですが

Subject: *************
Content-Transfer-Encoding: 7bit
Content-type: text/plain; charset=ISO-2022-JP
以下本文

原因が判りません・・・

ソース
($mailto,$sbj,$contents) = @_;
&jcode'convert(*sbj,'jis');
&jcode'convert(*contents,'jis');
open(MAIL,"| $snd_path -t") || &print_error('送信失敗',' BACK ','javascript:history.back()');
print MAIL "Return-Path: $snd_from\n";
print MAIL "From: $snd_from\n";
print MAIL "To: $mailto\n";
print MAIL "Subject: $sbj\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n\n";
print MAIL "$contents\n";
close(MAIL);
0784nobodyさん2006/08/29(火) 01:00:32ID:???
$mailtoの最後の文字が"\n"
0785nobodyさん2006/08/29(火) 01:00:41ID:???
>>782
すごいあてずっぽうに言っちゃうけど、
print "Content-type: text/html\n\n" if $ENV{PERLXS} ne "PerlIS";
とかじゃだめなのかね?

>>783
とりあえず、変数じゃなくて直に書いて一回試してみれば?
それで普通に送れたら変数の中身の問題だし、それでもだめならそこだけじゃわからなそう。
07867832006/08/29(火) 01:17:39ID:???
助言有難うございます。
明日頭をクリアにして試してみます。
07877822006/08/29(火) 01:29:42ID:UjdAC5jX
ありがとうございました。
無事問題解決しました。
勉強になりましたw
0788nobodyさん2006/08/29(火) 01:51:15ID:???
IISで#!/usr/local/bin/perl は、いいのか?
0789nobodyさん2006/08/29(火) 02:08:44ID:???
ただのコメントになるだけでしょう
0790windows恐るべし 2006/08/29(火) 03:35:02ID:UjdAC5jX
#!/usr/local/bin/perl
0791windows恐るべし 2006/08/29(火) 04:00:17ID:UjdAC5jX
たしかにIISでは意味のない指定でした。
ご指摘ありがとうございました。
07927772006/08/29(火) 16:08:32ID:???
自己レス失礼いたします。
>>777の件ですが、望む通りの動きをするコーティングができました。

my $table = $c->model('DBIC::TblDiary');
$table->belongs_to(illust_bind => 'Test::Model::DBIC::TblIllust', 'have_illustno');
my $records = $table->search(
 {
  belong_dno => $dno
 },
 {
  order_by => 'order_no',
  prefetch => ['illust_bind']
 }
);

「belongs_to」にて最後に繋げたい、主キーではないカラム名を指示するだけだったようです。

お見苦しい質問をいたしまして、本当に申し訳ございませんでした。
0793nobodyさん2006/08/29(火) 17:11:56ID:???
報告乙かれ〜
0794nobodyさん2006/08/31(木) 13:13:45ID:???
簡易データベース(?)を作成しています。日付に関するソートで質問があります。
-------------
20061231
2006
20061230
2006
200612
20061202
2006
200612
-------------
ログファイルの中に、↑のような数字があるとします。
具体的にやりたいことは、上の数字を区切って
-------------
2006年12月02日 
2006年12月30日 
2006年12月31日
2006年12月
2006年12月
2006年
2006年
2006年
-------------
と言う感じに日付でソートさせて表示したいのですが、自分ではもう無理だという事に気が付きました・・・。
日付で区切る方法は分かるのですが、上の様に日付でソートさせることって可能でしょうか?
よろしくお願いします・・・ orz
0795nobodyさん2006/08/31(木) 13:21:32ID:???
8桁に満たない場合は一時的に9で8桁に埋めてソート
末尾から9を消す
0796nobodyさん2006/08/31(木) 14:47:31ID:????BRZ(1002)
数字以外(0x3a以上のchar)で埋めてcmpソートした方が楽じゃねぇの
0797nobodyさん2006/08/31(木) 16:29:21ID:???
別に埋める必要はなくてケツに9よりコードが後の文字をひとつ
くっつけてcmpすりゃいいだけじゃないか。

my @list = qw(
20061231
2006
20061230
2006
200612
20061202
2006
200612
);

foreach (sort { $a."Z" cmp $b."Z" } @list) {
print $_, "\n";
}
0798nobodyさん2006/08/31(木) 16:30:03ID:???
エポックに変換しれ
0799nobodyさん2006/08/31(木) 16:38:46ID:????BRZ(1002)
アッー!
0800nobodyさん2006/08/31(木) 18:23:37ID:???
このケースで「エポックに変換」して sort ってえらくめんどくさい事に
ならないか? それともいい関数があるのかなあ。
普通に
sort { length $b <=> length $a or $a <=> $b } @list

でいいじゃん。or 797 のやり方。
############ お試しソース ############
use Time::Local ;
sort { &conv($a ) <=> &conv ($b) } @list ;
sub conv ($) {
 my $uru = sub { # 閏年の計算。
  return $_[0] % 400 == 0 ? 1 : $_[0] % 100 == 0 ? 0 : $_[0] % 4 == 0 ? 1 : 0 ;
 } ;
 my @dat = # ソートの優先順位を付けるための小細工。
  length $_[0] == 8 ? ( $_[0] =~ /^(¥d{4})(¥d{2})(¥d{2})$/, 0, 0, 0 ) :
  length $_[0] == 6 ? ( $_[0] =~ /^(¥d{4})(¥d{2})$/, 0, 23, 59, 58 ) : # 日付まで分かってるものよりも後にするため。
            ( $_[0] =~ /^(¥d{4})$/, 12, 0, 23, 59, 59 ) ; # 月まで分かってるものよりも後にするため。

 my $day = ( 31, $uru->($dat[0]) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 30 )[$dat[1] - 1] ;
 $dat[2] = $day if $dat[2] == 0 ; $dat[0] -= 1900 ;$dat[1] -= 1 ;
  return timelocal reverse @dat ;
}

0801nobodyさん2006/08/31(木) 21:04:32ID:???
my $day のとこ。12 月が 30 日までしかないよ
適当に書くんじゃなかった orz...
0802nobodyさん2006/08/31(木) 22:15:24ID:???
>>800
そういえば元の例にないからわからないが、年や月が違うのが混じってたときは
どの順番にするつもりなのだろうか。

797だとこうなるが、

2005
20061102
200611
20061202
200612
2006

800の1行の奴だとこうなるはず

20061102
20061202
200611
200612
2005
2006
08038002006/08/31(木) 23:07:28ID:???
>>802
ああ、そうですね。想定してませんでした。どっちだろ?
# 当方のエポック変換の結果は 797 に沿う。
# 同じ挙動を書いたつもりが… 大恥 orz...
0804nobodyさん2006/09/01(金) 00:12:23ID:gD6GWfb4
プログラム言語で会話する奴って、たまーにいるけどキモイ
0805nobodyさん2006/09/01(金) 00:54:37ID:???
8からその桁分を引いて得た桁数分だけ0を付加。
さらにxを付加し、さらにそのあとに付加した0の数を書く。
2006 → 20060000x4
200612 → 20061200x2
とする。
で、ソート後にx以降の桁分だけ0を削除を削除すればいい
0806nobodyさん2006/09/01(金) 09:03:38ID:???
>>805
それ何もつけないでソートしたのとかわらないんじゃ。
ネタ?
0807nobodyさん2006/09/01(金) 13:34:36ID:???
時々文字数が少ないものを後に持ってくるお馬鹿ソートがあったりするから。
0808nobodyさん2006/09/01(金) 15:02:42ID:???
それだと >>796 でいいよね
0809nobodyさん2006/09/01(金) 18:44:03ID:???
で、質問したやつはどこ行った?
08107942006/09/01(金) 20:03:39ID:???
失礼しました。。。。
皆様方のお力で、無事解決致しました・・・ orz
本当にありがとうございました・・・。 orz
0811nobodyさん2006/09/02(土) 22:53:43ID:???
チェックボックスについての質問です。

ページを表示させるさいに
デフォルトのチェックボックスはチェックした状態にしておき、
チェックボックスのチェックを外してsubmitするとチェックオフ。
またチェックしなおしてsubmitでチェックした状態に戻る。

というプログラムを作りたいのですが

print "<input type=\"checkbox\" name=\"test\" value=\"checked\" checked />";
と書いてしまうとチェックを外してsubmitしてもまたチェックされた状態で表示されてしまうし
print "<input type=\"checkbox\" name=\"test\" value=\"checked\" $test />";
こういうふうに書くと最初に表示したときにチェックがされてない常態になってしまいます。

どういった処理の仕方をすればうまくいくのでしょうか。
0812nobodyさん2006/09/02(土) 22:59:18ID:???
エスケープうざいから print qq{}; とか使えよ。。。(´・ω・)

<input type="submit" name="submit" value="submit" />
として、name=submit の値がなく、test がなかったらチェック、submit の値があったら ノーチェック、でいいんじゃない?
0813nobodyさん2006/09/02(土) 23:10:37ID:???
正規表現の説明を見ているときに「ゼロ幅表明」という言葉が出てきていたのですが、
どのような意味でしょうか。

検索してはみたのですが
「成功か失敗を返す、繰り返し使うべきでない」
のような説明でよく分かりませんでした。
08148112006/09/02(土) 23:26:42ID:???
>>812
おお!出来ました!どうもありがとう。

というか<input type="submit">にもnameつけることが出来たんですね。
htmlの勉強からやり直してきます。
0815nobodyさん2006/09/02(土) 23:37:41ID:???
半角のスペース「 」とマッチさせたいのですが・・・。
0816nobodyさん2006/09/03(日) 00:09:56ID:???
>>813
ゼロ幅表明自体が分からないという事?

ゼロ幅表明の、単語境界(¥b)とか、直前のマッチ位置(¥G)とかは、
マッチングはするけど、¥w, ¥d とかと違って文字幅が無い。
マッチングが成功しても、注目している文字の位置は変わらない。

繰り返し使うなっていうのは、
位置を変えずにいくらでもマッチできるから(/¥b¥b¥b¥b¥b/)
オートマトンの注目位置が動かなくて非効率って事だと思う。

説明あまり良くないかも知れないけど、多分そんな感じ。
0817nobodyさん2006/09/03(日) 00:53:10ID:???
>>816
丁寧な説明ありがとうございした。
0818nobodyさん2006/09/03(日) 06:31:32ID:???
>>815
半角空白をはじめとする空白文字 (Perl の正規表現で言うところの /\s/ にマッチする各文字) はデフォルトでは正規表現のメタキャラクタではありません。
パターン中にそのまま書けばそのままそのものとして解釈されます。

というかこの程度は既に自力で解決してそうね。
0819nobodyさん2006/09/03(日) 06:49:55ID:???
>>815
もし解決してなかったら、どうぞ。

/ /;
0820nobodyさん2006/09/03(日) 14:12:46ID:???
日本語以外で書かれたメッセージを排除したいと思っているんだけど、

厨な俺だと日本語かどうかを判別する方法って、
if($hogehoge !~ /\W+/) { エラーメッセージ表示のサブルーチンへ }
しか思いつかない。
もう少ししっかり日本語を判別できる方法ってある?
0821nobodyさん2006/09/03(日) 14:20:55ID:???
正規表現でマルチバイト文字が含まれているか調べるとか
0822nobodyさん2006/09/03(日) 16:08:59ID:???
CGIをいじっていたら、サーバーではエラーは出ず正常表示されるものの、
うまく動かない(予期しない動作に)状態になってしまいました。

そこで、デバッグしようと思うのですが、
ロギングするようなライブラリはないでしょうか。
printfデバッグを助けてくれるようなものでよいのですが。
0823nobodyさん2006/09/03(日) 16:16:07ID:UFgEMuAo
とりあえず、これ発見したので使ってみるす
http://d.hatena.ne.jp/rainydaidoh/20060702
0824nobodyさん2006/09/03(日) 16:19:06ID:UFgEMuAo
log4perlってのもあるんんすね。
でも、日本語の情報すくねーヽ(`Д´)ノ ウワァァン!!
http://search.cpan.org/~mschilli/Log-Log4perl/
0825nobodyさん2006/09/03(日) 17:05:04ID:???
Data::Dump
0826nobodyさん2006/09/03(日) 17:32:35ID:UFgEMuAo
>>823
getTime();がないって言われる・・・

>>825
マニュアルないすか?
0827nobodyさん2006/09/03(日) 23:40:40ID:FWwio3vA
質問です、お願いします。
perlにて中規模サイトを構築しようとしているのですが、オブジェクト指向で
作りたいと思っています。
その時にクラス(パッケージ)間で共通して使いたい変数をどう扱えばいいのか
が分かりません。
イメージとしては
use vars qw( '$dbh' , '$conf' );
のような感じで、パッケージのどこからでも参照できる方法があれば教えて下さい。

やはり名前空間を越える事は出来ないのでしょうか
0828nobodyさん2006/09/03(日) 23:50:49ID:???
オブジェクト指向をパールで学ぼうとするのは無謀じゃないだろうか
0829nobodyさん2006/09/03(日) 23:51:00ID:???
>>827
オブジェクト指向とか言う前に、Perlの基本を勉強した方が良いよ
0830nobodyさん2006/09/04(月) 00:10:36ID:???
> qw( '$dbh' , '$conf' );

これはないなwww
0831nobodyさん2006/09/04(月) 00:13:49ID:???
>>828
Perlはほんの少しの小細工でOOPを実装してるから、入るだけなら逆に易しいと思うよ。
ハッシュリファレンスくらい理解してる必要があるけど。
0832nobodyさん2006/09/04(月) 00:18:45ID:kGmJ+csQ
てゆうか、出来るのこれ?
パッケージのどこからでも参照できる方法
0833nobodyさん2006/09/04(月) 00:31:17ID:???
わからんな。
「$パッケージ::hoge」 とかじゃだめなの?
0834nobodyさん2006/09/04(月) 00:41:37ID:???
質問者さんが Module 化するという前提の基なら、

$ cat Foo.pm
#!/usr/bin/env perl
use Exporter ;
use vars qw( $foo $bar @ISA @EXPORT );
@ISA = qw( Exporter );
@EXPORT = qw ( $foo $bar );
$foo = $bar = 1 ;
1;

$ cat var.pl
#!/usr/bin/env perl
use Foo ; # ライブラリパスは通せよ
print $foo . $bar . "\n" ;

という風な感じでアクセス変更可能。
同一ファイル内だったら use varsもしくは our したうえで
$Foo::foo にアクセスする事ができるはず。
0835nobodyさん2006/09/04(月) 00:45:21ID:???
>>834
それ Foo.pm の1行目間違ってないか。
そこは #! じゃなくて、package だろ
0836nobodyさん2006/09/04(月) 00:52:53ID:???
ご指摘の通りパッケージ宣言が抜けてました orz...

$ cat Foo.pm
package Foo;
use Exporter ;
use vars qw( $foo $bar @ISA @EXPORT );
@ISA = qw( Exporter );
@EXPORT = qw ( $foo $bar );
$foo = $bar = 1 ;
1;
0837nobodyさん2006/09/04(月) 00:53:14ID:???
OO でやるということなら、パッケージ変数をエクスポートするのはちょっと微妙かも。
完全修飾名でアクセスさせるのが良い作法っぽい気がするよ。

また、どちらを選ぶにしてもドキュメントにその旨書いておくことを強く推奨。
0838nobodyさん2006/09/04(月) 01:05:41ID:???
どうせ、dbhとかだろ
シングルトンなConfig.pmとかでいいんでないの?
0839nobodyさん2006/09/04(月) 01:23:41ID:kGmJ+csQ
と言う事は設定を処理し定義するパッケージを用意し、
毎回ファイルごとに読み込む感じになるようですね。
なんか手間がかかるので正しい方法じゃないように感じていたのです。

こうゆう状況って絶対発生しますよね?

0840nobodyさん2006/09/04(月) 01:27:25ID:???
CGI+Perlという選択しておきながら、そんな事気にするのは矛盾。
0841nobodyさん2006/09/04(月) 01:35:30ID:kGmJ+csQ
それを言われると困りますね。
0842nobodyさん2006/09/04(月) 07:51:08ID:???
表を作っています。
セルが3×3で次の表ができるように組んでいるんですが、
最後の表が、9に満たない場合、空白セルで埋めるようにしたいと思ってます。

で、
$bはデータが存在した最終セルのセル個数+1です。

for($a = $b;$a/9 =~ /\./;$a++){
空白のセルを生成する内容
}

セルにふられたナンバーが9で割って小数点が含まれる場合、空白のセルを生成する、という形なんですが、
これだとfor構文にマッチしてないようです。

どこが問題なのでしょうか?
お教えくださいますようお願いします。
0843nobodyさん2006/09/04(月) 08:36:50ID:???
>>842
数値と文字列を混同してるからじゃないの?
普通は9で割った時に余りがあるかどうかで判断するだろう。

for($a = $b;$a % 9 > 0;$a++)

$bが+1されとるのもよく分からんが…。
0844nobodyさん2006/09/04(月) 08:41:19ID:???
>>843
ありがとうございます。
整数かどうかは%なんですね。
それがわからなかったから無茶苦茶な処理をしてました。

+1してる理由は、1セル目が0として計算されてるからでした。

本当に有難う御座いました。
0845nobodyさん2006/09/04(月) 10:41:57ID:???
>>844
>整数かどうかは%なんですね。
調べ直せ
0846nobodyさん2006/09/04(月) 10:53:00ID:???
>>845
はい
0847nobodyさん2006/09/04(月) 21:34:50ID:uUuOcfs4
>>837
Perl5.8以降についてくるFile::statとかがんがんExportしてるよ
とかよけいな事を言ってみる
0848perl初心者2006/09/05(火) 01:27:41ID:cFDKud4F
すいません、簡単なことを聞きたいんですけど、メールフォームの作り方を
学んだんですけど、その本には、sendmail.iniの設定を変える必要があると
のことですが、ホスティング(ロリポップやさくら)の場合、単に、
$sendmail = '/usr/sbin/sendmail';みたいな感じで設定して終わりでいいんでしょうか?
sendamil.iniをいじるのは、自分でサーバを持っているときとかのみですか?
0849nobodyさん2006/09/05(火) 02:33:24ID:???
わかんなかったら、まず試しに実行してみればいいと思うよ (´・ω・`)
0850nobodyさん2006/09/05(火) 02:55:37ID:???
>>847
ツッコミさんくー。
File::stat を見てみたら、デフォルトのエクスポートは関数オーバーライドだけだけれど、エクスポート可能な変数はたくさんあるね。
デフォルトではない (明示的に指定しなければインポートされない) ので、この文脈では問題ないんじゃないかな。
0851 ◆.PT9876/4U 2006/09/05(火) 20:00:39ID:???
当方, JavaScript なら多少 自信あり.
しかし perl は訳解りません.
そんなわけで基本処理は JavaScript でやることにして
log 書き込みだけを perl でやる hybrid 掲示板を作ってます.

んで, server が nifty なので logfile が cgi-bin にあると
Ajax の読み込みに失敗するようです.
なので "homepege" directory に logfile を置く必要があります.
perl で このようなことが可能でしょうか ?
(調べた限りでは このようなことをやってる CGI は見当たらないので)

もし可能なら ちょこっとアドバイスなど おねげぇ〜しますだ.
0852nobodyさん2006/09/05(火) 20:22:39ID:???
>>851
可能。
google: perl open
0853 ◆.PT9876/4U 2006/09/05(火) 20:25:58ID:???
>>892
おありがとうごぜぇ〜ますだ !
0854nobodyさん2006/09/05(火) 20:39:43ID:???
上のヒントで分かるかな。
open "path/to/homepege/logfile";
というように読み書きするファイルのパスを指定すればOK。
0855 ◆.PT9876/4U 2006/09/05(火) 20:56:15ID:???
>>854
ご親切にどうも ありがとうございます.
MacPerl で local check をやっている関係で
delimiter の違いが (思い違いの) 原因でした.
"できる" と解っただけで方向性が決まりました.

んで, (骨組みだけ) 無事成功しました !
■ このスレッドは過去ログ倉庫に格納されています