Perlコーディング初心者質問スレ Part 51
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/07/27(木) 17:04:23ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0792777
2006/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:???末尾から9を消す
0797nobodyさん
2006/08/31(木) 16:29:21ID:???くっつけて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:???0800nobodyさん
2006/08/31(木) 18:23:37ID:???ならないか? それともいい関数があるのかなあ。
普通に
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:???適当に書くんじゃなかった orz...
0802nobodyさん
2006/08/31(木) 22:15:24ID:???そういえば元の例にないからわからないが、年や月が違うのが混じってたときは
どの順番にするつもりなのだろうか。
797だとこうなるが、
2005
20061102
200611
20061202
200612
2006
800の1行の奴だとこうなるはず
20061102
20061202
200611
200612
2005
2006
0803800
2006/08/31(木) 23:07:28ID:???ああ、そうですね。想定してませんでした。どっちだろ?
# 当方のエポック変換の結果は 797 に沿う。
# 同じ挙動を書いたつもりが… 大恥 orz...
0804nobodyさん
2006/09/01(金) 00:12:23ID:gD6GWfb40805nobodyさん
2006/09/01(金) 00:54:37ID:???さらにxを付加し、さらにそのあとに付加した0の数を書く。
2006 → 20060000x4
200612 → 20061200x2
とする。
で、ソート後にx以降の桁分だけ0を削除を削除すればいい
0807nobodyさん
2006/09/01(金) 13:34:36ID:???0809nobodyさん
2006/09/01(金) 18:44:03ID:???0810794
2006/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:???<input type="submit" name="submit" value="submit" />
として、name=submit の値がなく、test がなかったらチェック、submit の値があったら ノーチェック、でいいんじゃない?
0813nobodyさん
2006/09/02(土) 23:10:37ID:???どのような意味でしょうか。
検索してはみたのですが
「成功か失敗を返す、繰り返し使うべきでない」
のような説明でよく分かりませんでした。
0814811
2006/09/02(土) 23:26:42ID:???おお!出来ました!どうもありがとう。
というか<input type="submit">にもnameつけることが出来たんですね。
htmlの勉強からやり直してきます。
0815nobodyさん
2006/09/02(土) 23:37:41ID:???0816nobodyさん
2006/09/03(日) 00:09:56ID:???ゼロ幅表明自体が分からないという事?
ゼロ幅表明の、単語境界(¥b)とか、直前のマッチ位置(¥G)とかは、
マッチングはするけど、¥w, ¥d とかと違って文字幅が無い。
マッチングが成功しても、注目している文字の位置は変わらない。
繰り返し使うなっていうのは、
位置を変えずにいくらでもマッチできるから(/¥b¥b¥b¥b¥b/)
オートマトンの注目位置が動かなくて非効率って事だと思う。
説明あまり良くないかも知れないけど、多分そんな感じ。
0818nobodyさん
2006/09/03(日) 06:31:32ID:???半角空白をはじめとする空白文字 (Perl の正規表現で言うところの /\s/ にマッチする各文字) はデフォルトでは正規表現のメタキャラクタではありません。
パターン中にそのまま書けばそのままそのものとして解釈されます。
というかこの程度は既に自力で解決してそうね。
0820nobodyさん
2006/09/03(日) 14:12:46ID:???厨な俺だと日本語かどうかを判別する方法って、
if($hogehoge !~ /\W+/) { エラーメッセージ表示のサブルーチンへ }
しか思いつかない。
もう少ししっかり日本語を判別できる方法ってある?
0821nobodyさん
2006/09/03(日) 14:20:55ID:???0822nobodyさん
2006/09/03(日) 16:08:59ID:???うまく動かない(予期しない動作に)状態になってしまいました。
そこで、デバッグしようと思うのですが、
ロギングするようなライブラリはないでしょうか。
printfデバッグを助けてくれるようなものでよいのですが。
0823nobodyさん
2006/09/03(日) 16:16:07ID:UFgEMuAohttp://d.hatena.ne.jp/rainydaidoh/20060702
0824nobodyさん
2006/09/03(日) 16:19:06ID:UFgEMuAoでも、日本語の情報すくねーヽ(`Д´)ノ ウワァァン!!
http://search.cpan.org/~mschilli/Log-Log4perl/
0825nobodyさん
2006/09/03(日) 17:05:04ID:???0827nobodyさん
2006/09/03(日) 23:40:40ID:FWwio3vAperlにて中規模サイトを構築しようとしているのですが、オブジェクト指向で
作りたいと思っています。
その時にクラス(パッケージ)間で共通して使いたい変数をどう扱えばいいのか
が分かりません。
イメージとしては
use vars qw( '$dbh' , '$conf' );
のような感じで、パッケージのどこからでも参照できる方法があれば教えて下さい。
やはり名前空間を越える事は出来ないのでしょうか
0828nobodyさん
2006/09/03(日) 23:50:49ID:???0830nobodyさん
2006/09/04(月) 00:10:36ID:???これはないなwww
0831nobodyさん
2006/09/04(月) 00:13:49ID:???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:???$ 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 にアクセスする事ができるはず。
0836nobodyさん
2006/09/04(月) 00:52:53ID:???$ 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:???完全修飾名でアクセスさせるのが良い作法っぽい気がするよ。
また、どちらを選ぶにしてもドキュメントにその旨書いておくことを強く推奨。
0838nobodyさん
2006/09/04(月) 01:05:41ID:???シングルトンなConfig.pmとかでいいんでないの?
0839nobodyさん
2006/09/04(月) 01:23:41ID:kGmJ+csQ毎回ファイルごとに読み込む感じになるようですね。
なんか手間がかかるので正しい方法じゃないように感じていたのです。
こうゆう状況って絶対発生しますよね?
0840nobodyさん
2006/09/04(月) 01:27:25ID:???0841nobodyさん
2006/09/04(月) 01:35:30ID:kGmJ+csQ0842nobodyさん
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:???数値と文字列を混同してるからじゃないの?
普通は9で割った時に余りがあるかどうかで判断するだろう。
for($a = $b;$a % 9 > 0;$a++)
$bが+1されとるのもよく分からんが…。
0844nobodyさん
2006/09/04(月) 08:41:19ID:???ありがとうございます。
整数かどうかは%なんですね。
それがわからなかったから無茶苦茶な処理をしてました。
+1してる理由は、1セル目が0として計算されてるからでした。
本当に有難う御座いました。
0847nobodyさん
2006/09/04(月) 21:34:50ID:uUuOcfs4Perl5.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:???ツッコミさんくー。
File::stat を見てみたら、デフォルトのエクスポートは関数オーバーライドだけだけれど、エクスポート可能な変数はたくさんあるね。
デフォルトではない (明示的に指定しなければインポートされない) ので、この文脈では問題ないんじゃないかな。
しかし perl は訳解りません.
そんなわけで基本処理は JavaScript でやることにして
log 書き込みだけを perl でやる hybrid 掲示板を作ってます.
んで, server が nifty なので logfile が cgi-bin にあると
Ajax の読み込みに失敗するようです.
なので "homepege" directory に logfile を置く必要があります.
perl で このようなことが可能でしょうか ?
(調べた限りでは このようなことをやってる CGI は見当たらないので)
もし可能なら ちょこっとアドバイスなど おねげぇ〜しますだ.
おありがとうごぜぇ〜ますだ !
0854nobodyさん
2006/09/05(火) 20:39:43ID:???open "path/to/homepege/logfile";
というように読み書きするファイルのパスを指定すればOK。
ご親切にどうも ありがとうございます.
MacPerl で local check をやっている関係で
delimiter の違いが (思い違いの) 原因でした.
"できる" と解っただけで方向性が決まりました.
んで, (骨組みだけ) 無事成功しました !
申す訳ねぇ〜デスだ.
すれ違い気味に OS10.3 って今でも手に入ります ?
なんか, 10.4 の評判はいまいちみたいなので...
OS さえ手に入れば爺さんに鞭打って...
0859nobodyさん
2006/09/06(水) 01:12:56ID:???0860nobodyさん
2006/09/06(水) 02:06:39ID:???0861nobodyさん
2006/09/06(水) 03:34:58ID:KUgOOpEJreturn 0;
}
for( my $n = 0; $n < @w; $n++ ) {
if( $w[$n] == $d ) {
return $n;
}
}
return -1;
これ↑と同じ処理を、1行か2行で書けないでしょうか?
0862nobodyさん
2006/09/06(水) 04:11:01ID:???return $d == -1 ? 0 : (@_ = grep { $_ == $d } @w) ? $_[0] : -1;
自分の分からないコードを書くと保守性が下がるよ。その点注意。
0863nobodyさん
2006/09/06(水) 06:01:51ID:???まあ、grep 部分を grep { $w[$_] == $d } 0 .. $#w に
すりゃいいだけだけど。
0864nobodyさん
2006/09/06(水) 10:55:39ID:???http://pc8.2ch.net/test/read.cgi/hp/1156837689/
Perl使いの皆様、どなたかこの板違いの馬鹿どもの議論を、
一言でサラリと解決してやってください。
初心者が質問しにくい状況になっていて非常に迷惑です。
論点は
『CGIファイル(CGIスクリプト)はプログラムであるか?』
ということらしいです。
これだけだと、答えが出しにくいかもしれませんが
よろしくお願いします。
前スレでCGI=プログラムと言い出していたものがいて、
それが尾を引いて、わけのわからない展開になっていますが、
どなたか解決を・・・
0865nobodyさん
2006/09/06(水) 11:03:36ID:???いらん話を他スレに持ってくるな。
0869nobodyさん
2006/09/06(水) 16:18:30ID:???勿論反応してるのもね。
召喚されてるように聞こえる...
それはさて置き, とりあえずマジレス.
ここで言うのもアレだけど perl って知れば知るほどアレルギー反応が...
要するに目的を達成するために しかたなくやってるだけで深く追求したくない.
したがって居座るつもりは さらさらありません.
さて, 結果報告 :
nifty は やっぱり だめぽ でした.
(XMLHttpRequest は "同一 domain" 限定で読み込みが可能.
nifty は見かけ上, 別サーバーのように見える)
そこで xrea で試したところ, どうにか動作はするように...
しかし あっしには理解不能なエラーが...
それでも back ボタンを押すと書き込めてるのですが...
作りかけで恥ずかしいのですがリンク貼っておきます.
alter.s225.xrea.com/hybrid/hybrid.html
思い違いかも知れないけど, 書きこみに失敗.
細かいところを作り込まなければならないので
あまり時間を浪費したくない.
そんな訳で深く原因追求してません.
0874nobodyさん
2006/09/06(水) 20:36:10ID:???エラーなんてでてないが? 直した? それとも、投稿後の画面遷移のこと?
だとしたら、JavaScript側でsubmitしてるんだから、画面遷移があるのは当たり前だろう。
どうせならform.submit()せずに、投稿もXmlHttpRequest使えばいいじゃん。何の為のAjaxなんだか。
Perlにアレルギー起こすのはいいが、JavaScriptも微妙だし、もうちょっとがんばれ。
0875nobodyさん
2006/09/06(水) 20:40:12ID:???画面遷移をなくせたはず。
どうもありがとう.
一応チェックしてますがテクニカルな話題は なさそうでふ.
>>873
print "Content-type: text/html \n\n";を
書き加えてエラーは出なくなりますた.
>JavaScript側でsubmitしてるんだから
>画面遷移があるのは当たり前だろう
よく考えれば当然なんですが見落としてました.
>投稿もXmlHttpRequest使えばいいじゃん
こちらは以前作ったサンプルを転用しました.
で, 書きこみの方は未研究です.
これでうまくいくのなら万々歳ですだ.
>確かレスポンスとして 204 No Content を返すと
さっそく調べて実験してみます.
本当に ありがとう !!!
0877nobodyさん
2006/09/06(水) 21:47:22ID:???0878876
2006/09/07(木) 18:11:47ID:4yMYFWbI色々やってみましたが, 何か勘違いしてるのか思い通りに行きません.
[やってみたこと]
1. print"Status:204 No Content\n\n";
2. print"Location:http://alter.s225.xrea.com/hybrid.html\n\n";
3. それぞれ一行空けてみたり...書きこむ場所を変えてみたり...
いっそ, 振り出しのファイルを読み込んで...
でも, やりかたが今ひとつわかりましぇ〜ん.
>>875
そんなに邪険にしなくても...
0879nobodyさん
2006/09/08(金) 01:47:11ID:???公開サーバではなくローカル・マシン上で、www.kent-web.com で配布されている
sunbbs を利用しています。このコードを眺めつつ、ちょくちょく改造しているの
ですが、投稿されたデータに http:// で始まる文字列があった場合、自動的に
その文字列にリンク・タグを追加してくれる auto_link という処理を見つけました。
<sample-1>
sub auto_link {
$_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1<A HREF=\"$2\" TARGET=\"_blank\"><B>$2<\/B><\/A>/g;
}
これを応用し、同じく sunbbs 内のワード検索サブルーチンに、ヒットした検索
キーワード部分を色付きでマーキングする処理を作ってみました。
<sample-2>
sub auto_marker {
$_[0] =~ s/$word/\<font\ color=\"\#FF0000\"\>\<b\>$word\<\/b\>\<\/font\>/g;
}
これで「おおむね」期待通りの処理をしてくれるのですが、検索キーワードの中に、
ひらがなやカタカナの長音記号「ー」が含まれていると、記事はヒットするらしい
ものの、肝心の記事を表示してくれない、という問題に悩まされています。
ヒットする「らしい」というのは、検索結果:12件 などという結果だけはちゃんと
表示されるからです。
ちなみに、<sample-2>の処理を外すと、色付き表示は当然されないものの、ヒット
した結果はちゃんと表示されます。
このことから、自分が書いた<sample-2>の処理中に、この問題を引き起こす原因が
含まれているのではないかと判断しています。
どなたか「そこはこう書かなきゃダメじゃん」というご指摘をいただけませんでしょうか。
どうぞよろしくお願いいたします。
0880nobodyさん
2006/09/08(金) 01:53:21ID:???置換後のテキストで "<", ">", "#", 半角スペース、ダブルクォートとかは、
バックスラッシュ入れなくていい。
0881nobodyさん
2006/09/08(金) 02:31:26ID:???↓
s/\Q$word\E/
とかじゃないの?
0882nobodyさん
2006/09/08(金) 10:07:26ID:???0883879
2006/09/08(金) 18:17:53ID:???どうもです。できました。感謝です。
しかしそれはどういう意味があるのでしょう?
あと検索キーワードが一つのときはきちんと動作しましたが、
複数のキーワードを半角スペースで区切って入れた場合、
結果は正しくヒットするけれども、赤マークはされませんでした。
スペース(%20)が邪魔をしているんだろうということは分かるのですが、
それ以上のことが分からないです。
0884nobodyさん
2006/09/08(金) 19:14:56ID:???ぐぐれ
0885nobodyさん
2006/09/08(金) 21:10:52ID:???0886nobodyさん
2006/09/08(金) 22:27:06ID:d2vLYLwUフォームにフリーワードを入力させて
CSVのデータとマッチさせ、
マッチしたデータを表示させるCGIを
作成しようと思っています。
それで、yahooやgoogleのように
表示件数を○件毎という風にして、
画面の下のほうに
1 2 3 4 5 6 7 8 9 .....
と次の○件、という感じにしたいな
と考えています。
同じような仕様で、参考になるソースを
ご存知の方、居ませんでしょうか。。
0889nobodyさん
2006/09/08(金) 23:11:11ID:???quotemetaと同じそうだ。
0890nobodyさん
2006/09/08(金) 23:13:20ID:???また、件数を割って得た数が割りきれなければ総ページ数を+1する
ってとこかなぁ
0892nobodyさん
2006/09/08(金) 23:44:38ID:???わざわざNon-parsed Headerする意図が(ry
■ このスレッドは過去ログ倉庫に格納されています