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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/05/25(水) 06:36:28ID:PVpWgcdf
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0133nobodyさん2005/05/30(月) 19:04:21ID:???
>>132
「Scalar::Utilの」って言ってくれてるんだから、まずは自分で調べてみましょう。

perldoc Scalar::Util
0134106,107,1082005/05/30(月) 19:34:37ID:???
くそっ、ばれたか!
0135nobodyさん2005/05/30(月) 19:37:51ID:2nqscNNy
>>133
私の素人用の本には載っていなくて、検索でなんとか
【@bool = DBI::looks_like_number(@array);リストの各要素について、数値に見え
ばTRUE、そうでなければFALSEを返します。未定義、あるいは空文字であれば、undef
もしくは空文字を返します。】
ってのは見つけたのですが、そもそもScalar::Utilってのがさっぱり分かりません。
素人考えで昨日から if( DBI::looks_like_number($value) && @wk_list[0] eq $value ){
とか色々やってるんですが、もう疲れました。先生、そろそろ答えを。。
0136nobodyさん2005/05/30(月) 19:44:32ID:???
ちっ!さすがに質問まで自作自演じゃあなかったか。
0137nobodyさん2005/05/30(月) 19:45:46ID:Xh5clFyG
うざいやつら...
0138nobodyさん2005/05/30(月) 20:29:17ID:???
よくわからんが、(一時的に)数値も文字として比較しては駄目なのか?
0139nobodyさん2005/05/30(月) 20:42:20ID:2nqscNNy
>>138
比較対象データが、数値・文字混在で1000件ほどあって、比較元が
数値の場合は良いのですが、文字の場合、先に違うデータ(数値?)と
一致してしまうんです。
0140nobodyさん2005/05/30(月) 21:11:58ID:???
ん?
@bool = DBI::looks_like_number(@array);
なら
if (DBI::looks_like_number($value))
は必ず真にならないか?
wantarray でちゃんと 0 か 1 で返してくれてるのかな。

あと
if( DBI::looks_like_number($value) && @wk_list[0] eq $value ){
の @wk_list[0] eq $value の部分
は、「数字の場合」、なんだから
$wk_list[0] == $value になるのでわ。
同じかも知らんが一応。

つーか数字に見えるかどうかくらい、そのモジュール使わなくても自作でできると思うがw
0141nobodyさん2005/05/30(月) 21:19:22ID:???
>135
君はまずモジュールというものを知るべきだ。
その後、CPAN を知ることにより、より幸せになれるであろう。

ttp://search.cpan.org/search?query=Scalar%3A%3AUtils&mode=all
ttp://search.cpan.org/~gbarr/Scalar-List-Util-1.15/lib/Scalar/Util.pm

で、Perl が使える環境で perldoc Scalar::Util って実行したら下と同じドキュメントが見られるはず。
ちなみに、@wk_list[0] だとスライスなので、$wk_list[0] の間違いだと思う。
>123 に従って書いてみるとこんな感じ。

use Scalar::Util qw(looks_like_number);
if(looks_like_number($wk_list[0]) && looks_like_number($value) ? $wk_list[0] == $value ; $wk_list[0] eq $value) {}

「数字のように見える」だから君の求めている結果と違う可能性はあるけどね。
0142nobodyさん2005/05/30(月) 21:27:57ID:???
それ使うと、$value が '123' か 123 か見分けられんの?
0143nobodyさん2005/05/30(月) 22:04:45ID:???
>>142
looks like number = 数値のように見える

'123'と123を見分けるにはPerlレベルでは無理だし、見分けても意味ない。
0144nobodyさん2005/05/30(月) 22:05:43ID:???
DBIにもlooks_like_number()はあるが、それだけのためならScalar::Utilの方を使うべきだろうな
0145nobodyさん2005/05/30(月) 22:08:01ID:???
ああ、一応数値と文字列を見分けることもできるか。
ttp://search.cpan.org/~gaas/Perl-API-0.01/

これでperlapiの殆どの関数を利用できるようになる。
0146nobodyさん2005/05/31(火) 06:36:25ID:???
$ENV{'TZ'} がないとき、サーバのタイムゾーンってどうやればわかるのかな?
JST とか GMT とか EST とかそういうの。
0147nobodyさん2005/05/31(火) 08:23:28ID:???
perl -e 'print `date`, "\n";'
0148nobodyさん2005/05/31(火) 08:43:42ID:???
おお、見れた! thx!
windows perl じゃ取れなかったけどw
0149nobodyさん2005/05/31(火) 08:45:01ID:???
>>146
タイムゾーン関係の設定ファイルがあるがlibcのバージョンや
OSの作法によっていろいろ違いがあり、ポータブルなのを自前
で書くのはたいへんなのでDateTime::TimeZoneモジュールを使
うのが楽だろう。

use DateTime::TimeZone;
use DateTime;

my $tz = DateTime::TimeZone->new(name => 'local');
print $tz->name, "\n";

my $dt = DateTime->now;
print $tz->short_name_for_datetime($dt), "\n";
0150nobodyさん2005/05/31(火) 08:48:39ID:???
use POSIXしてstrftimeの%Zという手もあるな。

use POSIX;
print strftime "%Z", localtime;
0151nobodyさん2005/05/31(火) 10:01:32ID:???
うは いろいろ試してみたけど POSIX 軽く鬱るくらい便利だなw すげえ。

>>149 も ありー。
でも必要なモジュール多いし揃えても何故か動かなかったw スマン。
0152nobodyさん2005/05/31(火) 11:03:00ID:TIA+apXZ
ここでいいのかどうかわかりませんが…

習作でperlでライブラリ及びdbを使わずに(なるべく多くの環境で動くことを目標に)
2ch風の掲示板を作ろうとしています。
んで、排他処理について質問…というか意見を伺いたいです。

板(blist.dat)、スレ(tlist.dat)、書き込み(スレid.dat)があります。
権限を持っていれば、板とスレも作成/論理削除が可能で、
同時に更新される可能性があります。
数は板・スレッド共に、00〜ffまで持てる物とします。

排他処理はロックファイルのリネーム方式で行おうと考えています。
なるべく軽快に動かしたい為、必要な時に必要な所だけロックをかけようと思っており、
そういう意図で必要になるロックファイルは
・lock_blist(板一覧用)
・lock_tlist(スレッド一覧用)
・lock_スレッドid(個別スレッド用)
となります。

これで組むと、ロックファイルが板の数*256個となり、最大で65536個になってしまうのですが、
これは設計としてアリ…というか必然なのでしょうか。それとも、ダメダメ(工夫の余地あり)なのでしょうか。

もちろんここに書き込む時点で多いなーという疑問を持っているのですが、
任意の一スレッドに書き込むたびに掲示板全体をロックするというのは、
それはそれで違うかなという気がしています。。

ご意見などありましたら、ご教授お願いします。
0153nobodyさん2005/05/31(火) 11:12:03ID:???
書き込むたびにスレ一覧も更新するんじゃないの?

レス数とか
0154nobodyさん2005/05/31(火) 11:17:57ID:???
あ、、、、
そうか。。。


その通りでした…orz

何ではまってたんだろう…ありがとうございますorz
0155nobodyさん2005/05/31(火) 16:14:18ID:???
お願いします。

簡単なデータベースを動作させたいと思っています。
1つのページに2×4個データを表示させたいんです。
もちろんそれ以上の情報があれば次のページへと移動です。

この「2つ目で改行・8個目でページ終了、さらに次のページ移動やページ数を計算」
というものを勉強したいのですが、どこかに良いサイトや参考となるCGIはありませんか?
0156nobodyさん2005/05/31(火) 17:58:58ID:???
たくさんあるデータをページ単位にするのとそれをページ内で
どう表示するかはわけて考えた方がいいだろうな。

前者は自分で作ってもいいが、Data::Pageとかそれっぽいのが
CPANにあるから適当に探して気に入ったものがあれば使うのも
いいだろう。次のページあるかないかとか、このページにある
データはいくつかなんてのはもちろんよく考えれば簡単に計算
で求まるとはいえめんどうだからね。もし自分で書くとしても
だらだらとスクリプトのあちこちでその場で計算しないで、
うまく手続きをまとめておくことをお勧めする。

後者はあんまり知らないのだがどうせ作るんならn×mで一般的
に作っておくと気がかわったときにいいかもしれん。

あとhtmlベタでスクリプトに埋め込むよりはTemplate Toolkit
とか使った方がすっきりするよ。
0157nobodyさん2005/05/31(火) 18:51:34ID:md7jEE3a
PHPでいうincludeをperlでやるにはどうすればいいんですか?
0158nobodyさん2005/05/31(火) 19:16:24ID:???
>>157
いちばん近いのはdoじゃないかと思う

0159nobodyさん2005/05/31(火) 19:19:00ID:???
ファイルのパーミッションを調べる方法はございますでしょうか。

statでは調べられないみたいですが、もしもございましたら
ご教授いただきたい次第です。
0160nobodyさん2005/05/31(火) 19:20:33ID:???
ちゃんと stat のリストの中にあるよ。
01611572005/05/31(火) 19:41:37ID:???
>>158
ありがとうございます
早速やってみます!
0162nobodyさん2005/05/31(火) 20:41:06ID:???
>>160
勉強になりました。
有難うございました
0163nobodyさん2005/06/01(水) 05:35:45ID:???
モジュールの中を見てるみると

require Exporter;
require DynaLoader;
@ISA = qw(Exporter DynaLoader);
bootstrap なんか別のモジュール?;

みたいな流れがよくあるんですが、
これって何をやっているんでしょう?
0164nobodyさん2005/06/01(水) 10:36:57ID:???
ExporterとDynaLoaderのマニュアル嫁
0165nobodyさん2005/06/01(水) 12:03:09ID:???
>>164
んー、Exporterのほうはぐぐってみても日本語化されたマニュアルが見つからないのです。
動的にモジュールをロード?しているっぽいんですかね。
これを使えば、引数からモジュール名を得て、インポートするモジュールを選べたりするのでしょうか。
0166nobodyさん2005/06/01(水) 12:26:27ID:???
>>165
ぐぐり方が悪すぎるんじゃ...

Exporterとperlをキーワードにして日本語のページを検索すると
普通に出てきますが...
0167nobodyさん2005/06/01(水) 21:46:59ID:???
>>163
Exporterはモジュールのシンボル(通常はサブルーチン)を呼び出し元に輸出するためのモジュール。
DynaLoaderはCなどで書かれた外部サブルーチン(XS)をロードするモジュール。
詳しいことはぐぐるなりマニュアル読むなりせよ。

オブジェクト指向でPurePerlなモジュールを書く分にはどちらも無関係。
0168nobodyさん2005/06/01(水) 23:13:36ID:4wa3Dv1b
すみません。sendmailを使ってメールを送る際に
ファイルを添付することは出来ませんか?
0169nobodyさん2005/06/01(水) 23:38:04ID:???
>>168
できる。でもsendmailそのまま使ってあとは自分で作るのはお勧めしない。
search.cpan.orgでmailとかMIMEとかキーワードに検索するといろいろでて
くるのでなるべく利用するのが吉かと。
0170nobodyさん2005/06/02(木) 07:19:19ID:???
>>167 "PurePerl" って何?
その言い方から予想するとプラグマ以外の他のモジュール使わないで単独で動くモジュールってことかな。
0171nobodyさん2005/06/02(木) 07:21:43ID:???
DynaLoaderはXS専用じゃないよな。
0172nobodyさん2005/06/02(木) 12:06:12ID:???
>>170
PurePerlってのは他の言語で書いたライブラリに依存せず、Perlのみで書かれたコードのこと。
どんなモジュールを使っているかは関係ない。
標準ライブラリだと、CGI.pmはPurePerlで、POSIX.pmはPurePerlじゃない。
といってもそんな厳密なものではなく、例えばData::Dumperなんかはコンパイル済みライブラリがあれば
その(速い)ルーチン、無ければPurePerlルーチンを自動的に選択して使用する。
非PurePerlモジュールに依存したPurePerlモジュールをPurePerlというか否かも意見の分かれ目だな。

>>171
まあXSインターフェイスを使わなくてもDynaLoaderを使うことはあるわな。
ここでは単に「外部サブルーチン」という意味でXSとした。
0173nobodyさん2005/06/02(木) 17:34:11ID:???
>>172 おおなるほど!(゜∀゜) 勉強になったよありがとう!
0174nobodyさん2005/06/02(木) 18:02:31ID:???
my ($i, $j) = (0, 0);
foreach (1 .. 10) { $i++; } continue { $j++; }
print " ($i , $j) \n";

こういうコードを実行すると、結果が (10 , 10) ってなるんだけど、これはいいの?w
(10 , 9) ってなってほしかったんだけど・・・ orz
0175nobodyさん2005/06/02(木) 19:32:12ID:???
>>174
どこからどう考えても (10,10) なのだが・・・。

foreach節の最後に last until $i < 10; とでも付け加えれば
最後の continue は実行されないが。
0176nobodyさん2005/06/02(木) 19:41:55ID:???
>>174
ラクダ3版の「4.4.3 foreachループ」の最後のあたりに
はっきりこのように書いてある。

while文と同様に、foreach文もcontinueブロックを持つことが
できる。continueブロックは、ループが普通に実行された場合
でも、nextが実行された場合でも、ループの各繰り返しの最後
に必ず実行される。
0177nobodyさん2005/06/02(木) 20:09:01ID:QYKowdcj
if(-e $saitama){
print $saitama;
}

すいません↑これって何をしてるんですか?
-eで$saitamaが存在しているのかどうかを調べているんでしょうか
0178nobodyさん2005/06/02(木) 20:12:30ID:???
> -eで$saitamaが存在しているのかどうかを調べているんでしょうか

正解。
0179nobodyさん2005/06/02(木) 20:15:16ID:QYKowdcj
ありがとうございました
0180nobodyさん2005/06/02(木) 20:40:27ID:???
my %d;
$text =~ s/\A([^\n]*)\n//s;
$d{title} = $1;

こんなのが出てきたんですけど、$1は、「上の正規表現『s/\A([^\n]*)\n//s』で一番最初にマッチングしたもの」であってますか?
0181nobodyさん2005/06/02(木) 21:05:27ID:???
>>180
一番最初の括弧の中にマッチしたもの。
0182nobodyさん2005/06/02(木) 21:38:25ID:U6HelXRG
すいません。教えて下さい。

名前 住所 電話
A氏 東京 1111111111
B氏 大阪 2222222222
C氏 愛知 3333333333
D氏 広島 4444444444

上記のようなデータファイルがあって、B氏だけの内容を変更したい時、
ファイルを出力用 ">" で開いて再度1レコードずつ書き込めばできる
のですが、出力用で開くと一旦データが全て消えて危険性が高いので、
入出力両用 "+<" 等で開き、他のレコードは保持したまま、B氏のレ
コードだけを書き換えるようなことは出来るのでしょうか?
0183nobodyさん2005/06/02(木) 21:45:15ID:???
レコードのサイズを固定長にする。
0184nobodyさん2005/06/02(木) 21:55:58ID:???
別ファイルに書いて、成功したらばrename
0185nobodyさん2005/06/02(木) 22:00:22ID:U6HelXRG
>>183
他にも項目があって固定長には出来ないのですが、固定長にすると
対象レコードのみ書き換えられるのでしょうか?
>>184
成功したかどうかはどう判断すれば良いでしょうか?
0186nobodyさん2005/06/02(木) 22:19:38ID:???
>>185
エラーが発生せずに、書き込み、クローズが完了したら成功。
もっと気にするなら、読み込んでベリファイ。
0187nobodyさん2005/06/02(木) 22:22:01ID:???
if (変更前のファイルサイズ - 変更前の変更行のサイズ == 変更後のファイルサイズ - 変更後の変更行のサイズ) { rename 〜 } とかな。
他にも方法はいくらもあるけど、上のもそうだがいちいち聞くな、自分で考えろと。
0188nobodyさん2005/06/03(金) 06:02:35ID:???
mod_rewriteをつかって
http://www.hoge.com/aaa/bbb/ccc.html へのアクセスが
http://www.hoge.com/index.cgi?aaa/bbb/ccc.html となるように書き換えをさせています。
RewriteRuleは→ ^(.*)$ index.cgi?$1 [L,QSA] こんな感じで。

で、http://www.hoge.com/aaa/bbb/ccc.html?ddd にHTMLフォームからPOSTで適当なクエリを送って、
そいつを取得したいのですが、
QUERY_STRING には aaa/bbb/ccc.html&ddd が入っているものの、
フォームからポストしたクエリが標準入力に来ていないっぽいのです。
フォームからポストするクエリの量を変えてやると CONTENT_LENGTH の値が変わるので、
全く送られていないわけではないみたいなのですが…
いったいどこに行ってしまったのか心当たりはありませんでしょうか?
01891882005/06/03(金) 07:13:27ID:???
自己レス
なんか全然別のつまらないところでミスっていただけでした……
板汚しすみません……
0190nobodyさん2005/06/03(金) 09:54:19ID:lSpNwut+
超初心者でもわかるPHPの書籍探してるんですが、できれば、教えて頂きたいのですがよろしいでしょうか?
0191nobodyさん2005/06/03(金) 10:01:33ID:???
だめに決まってるでしょ。
0192nobodyさん2005/06/03(金) 10:02:31ID:???
PHPのスレが別にあるから、そっちで聞きなさい
0193nobodyさん2005/06/03(金) 16:31:13ID:p0YkzVQc
sub lengthw {
local $_ = shift;
-(tr/\x00-\x7f//)+2*length
}

↑これはどんなことをしてるんでしょうか
lengthwは
if((lengthw $x) < 50){} のような使い方をしているみたいですが

どなたか分かる方がおりましたら解説希望です。
0194nobodyさん2005/06/03(金) 17:23:46ID:???
if ( (文字列 $x のバイト数 x 2) - ($x の中のアスキー文字の数) > 50 ) { }
なにがしたいのかはよくわからん。
0195nobodyさん2005/06/03(金) 17:24:10ID:???
不等号逆だー orz
0196nobodyさん2005/06/03(金) 18:09:23ID:???
>>194
$_がunicode文字列でbytesプラグマの影響範囲内でなければ
lengthはバイト数じゃなくて文字数だな。

もしそうならアスキーの範囲は1,それ以外は2で文字幅を
数えてるような気がする。

条件が示されてないのでなんともいえんが。
01971932005/06/03(金) 18:27:26ID:p0YkzVQc
>>194-196
お答えありがとうございました!

というか

local $_ = shift;#←これがよく分かってないんです。
-(tr/\x00-\x7f//)+2*length #←これは_$が略されてるのは想像つくんですが。。

0198nobodyさん2005/06/03(金) 18:45:47ID:???
>>196
結局見てみないとわからんねw

>>197
local $_ = shift;
↓=
local $_ = shift @_;
OK?
01991932005/06/03(金) 18:52:05ID:p0YkzVQc
うはー「@_」が略されてたんですね。
わけ分かりませんでした。ありがとうございました!

ちなみにbytesプラグマの影響範囲内ではありません。
0200nobodyさん2005/06/03(金) 18:56:41ID:???
perlって略すような書き方が多いから、解析するのに苦労するよね。
use Time::Local
とか意味分かんないし
0201nobodyさん2005/06/03(金) 18:58:28ID:???
use Time::Local のどこが意味分かんないの?
0202nobodyさん2005/06/03(金) 19:12:25ID:???
use Time::Local って「Timeと言うクラスのLocalって関数を使えるようにしますよ」って意味でいいのかな?
0203nobodyさん2005/06/03(金) 19:23:19ID:???
うーむ、略すような書き方とか解析するとか以前に、
それは単に君が勉強が足りてないだけのような気が。
0204nobodyさん2005/06/03(金) 19:47:19ID:???
use Time::Local;
↓=
BEGIN {
    require 'Time::Local.pm';
    import Time::Local;
}
アンダースタンンドゥッ!?
0205nobodyさん2005/06/03(金) 19:59:28ID:???
BEGINって何ですか?
0206nobodyさん2005/06/03(金) 20:25:00ID:???
>>204
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_require_VERSION

>>205
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlmod.html#Package_Constructors_and_Destruc
0207nobodyさん2005/06/03(金) 21:08:38ID:???
Time::Localでどんなことが出来るようになるの?
0208nobodyさん2005/06/03(金) 21:17:01ID:???
それぐらいぐぐれ。調べれば分かることを聞くスレじゃない。
0209nobodyさん2005/06/03(金) 21:21:50ID:???
>>207
http://search.cpan.org/~drolsky/Time-Local-1.11/lib/Time/Local.pm

>>208
Perl に関してはググるより前に perldoc れ or CPAN れが必要な気がする。
0210nobodyさん2005/06/03(金) 21:26:58ID:???
ぱーるどくれ!しーぱんれ!
0211nobodyさん2005/06/03(金) 21:27:04ID:???
>>209
「れ」が余計です。
0212nobodyさん2005/06/03(金) 21:38:29ID:p0YkzVQc
$a = $x if ($x !~ /[$kw]$/ or $rest !~ /^[$kw]/) and ($rest !~ /^[$kt]/ and $x =~ /[$kk]$/)
こんなのが出てきましたけど、私にはチンプンカンプンです。
これだけで申し訳ないのですが、↑が分かる人がいましたら、解説願います。
0213nobodyさん2005/06/03(金) 21:44:52ID:???
おいおい、片っ端から質問していくつもりかよ・・・?
0214nobodyさん2005/06/03(金) 23:02:32ID:???
>>212
>>7
0215nobodyさん2005/06/04(土) 14:08:36ID:???
>>211
ググ「れ」のもじりだからおk
0216nobodyさん2005/06/04(土) 19:40:24ID:???
>>215
言語感覚が滅茶苦茶だな。
0217nobodyさん2005/06/04(土) 22:52:44ID:???
( ゚Д゚)…
0218nobodyさん2005/06/04(土) 23:48:24ID:???
ファイルサイズの単位をバイトからメガバイトにして小数点第三位以下を切捨てするにはどうすればよいですか?

たとえば12345678を11.77にしたいです。
0219nobodyさん2005/06/04(土) 23:55:29ID:???
my $chinko = 12345678;
my $manko = 100;

print int($chinko / (1024 * 1024) * $manko) / $manko;
0220nobodyさん2005/06/05(日) 00:02:38ID:???
ありがとう!
0221nobodyさん2005/06/05(日) 00:43:39ID:???
printf "%.2f",12345678/1024/1024;
0222nobodyさん2005/06/05(日) 04:55:26ID:???
それ切り捨てじゃないし
0223nobodyさん2005/06/05(日) 13:21:23ID:???
変数名なんとかしろよw
0224nobodyさん2005/06/05(日) 15:28:16ID:???
質問があります。
↓のような場合で、

for($i=0;$i<=10;$i++){
$po[$i] .= int(rand(6));
}

これはあくまで例なのですが、似たような場合などでも、
randで選ばれる数字が同じものが続けて入ってしまう事が良くあるのですが、
これをもっとばらけさせたいのですが、何か方法があるのでしょうか?
上手く説明できずにすみませんが何卒よろしくお願いします。
0225nobodyさん2005/06/05(日) 16:27:58ID:???
>>224
0〜5までの数字から完全にランダムに選んだ場合、
直前と同じ数字になる確率は1/6もあるわけで、
10回も続けてやれば一度でも同じになる確率は
8割以上だからまあ当たり前だろうな...

同じ数字が続くのがいやならひとつ前の数字を
保存して同じ数字にならないように細工すりゃ
いいんじゃねーの。

お手軽コース:
同じ数字の間はやり直す

少し考えたコース:
0〜4までの乱数を求めて、前の数字と等しいか
大きければ1を加える。

0226nobodyさん2005/06/05(日) 16:42:19ID:???
>>224
コード書いてみたがね。
同じ数字が並びそうなら振りなおすなも。

my @numbers;
my $last = $num = -1;
for(my $i = 0; $i <= 10; $i++){
$num = int(rand(6)) while($last == $num);
$numbers[$i] = $last = $num;
}
print @numbers;

# 11回振ってるようだが、いいんきゃーも?
0227nobodyさん2005/06/05(日) 18:10:57ID:???
WindowsのMySQL+DBIの使い方で困ってます。詳しい方、教えてくれないでしょうか。

下のテーブルをセレクトしたいだけなんですが、mysqlのコマンド上ではちゃんと表示される日本語がPerlで出力させるとクエスチョンマークで表示されてしまいます。

↓こういう風に表示させたい。
>2005-06-05 17:27:47<>0<>ニュースタイトル!<
>2005-06-05 17:27:48<>0<>news title!<

↓こういう風になってしまう。
>2005-06-05 17:27:47<>0<>?????????<
>2005-06-05 17:27:48<>0<>news title!<

どうやったら日本語を出力できるんでしょうか。どなたかご教授お願いします。m(__)m

◆ソース(perl v5.8.6)
$dbh = DBI->connect("DBI:mysql:$dbname", $dbuser, $dbpass, {PrintError => 0, RaiseError => 0, AutoCommit => 0});
$datasp = $dbh->selectall_arrayref(q{
SELECT * FROM NEWS
});
for($n = 0; $n < scalar(@$datasp); $n++){
printf(">%s<>%s<>%s<\n",$datasp->[$n][0], $datasp->[$n][1], $datasp->[$n][2]);
}
0228nobodyさん2005/06/05(日) 18:11:25ID:???
上の続き・・・

◆テーブル
| NEWS_DATE       | NEWS_IMPORTANCE | NEWS_TITLE     |
| 2005-06-05 17:27:47 |                 0 | ニュースタイトル! |
| 2005-06-05 17:27:48 |                 0 | news title!      |

◆DBステータス
mysql Ver 14.7 Distrib 4.1.12a, for Win32 (ia32)
Connection id: 1
Current database: testdb
Current user: root@localhost
SSL: Not in use
Using delimiter: ;
Server version: 4.1.12a-nt
Protocol version: 10
Connection: localhost via TCP/IP
Server characterset: sjis
Db characterset: sjis
Client characterset: sjis
Conn. characterset: sjis
0229nobodyさんNGNG
前回と同じ値だからといって再度乱数を発生させると、ループがかさばる可能性もあるですよ。

my @dice_seed = (1..6);
my @dice_rand;
for(reverse (0..$#dice)){
push @dice_rand, splice @dice_seed, rand $_, 1;
}
みたいな。。。
0230nobodyさん2005/06/05(日) 19:24:15ID:???
>>227
たぶんこれ。オレも以前はまった。

ttp://www.mysql.gr.jp/frame/modules/bwiki/?FAQ
の「mysql コマンドでは大丈夫なのに、PHP,perl,accessなどで文字が ? に化けるのは? 」
02312272005/06/05(日) 20:35:05ID:???
>>230
ログイン直後に SET NAMES sjis を追加したらできました!
ありがとう!!!
もう、perlあきらめてphpで開発しようかと思ってたら
phpでも同じだったんですね・・・

◆ソース(変更後)
$dbh = DBI->connect("DBI:mysql:$dbname", $dbuser, $dbpass, {PrintError => 0, RaiseError => 0, AutoCommit => 0});
$dbh->do('SET NAMES sjis');    # ←追加
$datasp = $dbh->selectall_arrayref(q{
SELECT * FROM NEWS
});
for($n = 0; $n < scalar(@$datasp); $n++){
printf(">%s<>%s<>%s<\n",$datasp->[$n][0], $datasp->[$n][1], $datasp->[$n][2]);
}
0232 ◆5KhTfX3Q0E 2005/06/05(日) 23:16:56ID:???
はじめまして、よろしくお願いします。

1: HTMLを取得して例えば
<A href="http://www.**.co.jp/~sample/image/a.jpg">
<A href="image/a.jpg">
<A href=http://www.**.co.jp/~sample/image/a.jpg>
<A href=image/a.jpg>
とあるものをすべて
<A href="http://www.**.co.jp/~sample/image/a.jpg">
に統一したい。
2:
$url = $ENV{'QUERY_STRING'};
$url =~ s/$0//gi;
$surl = $url;
if($surl !~ /\/$/){$surl =~s/(.*)\/.*/$1\//i;}
use LWP::Simple;
$html = get $url;
&jcode'convert(*html,'sjis');
#携帯で見れるようにしたいのでテーブル等不要と思われるものを削除
#出来ればここも1行に統一できればうれしいです
$html =~ s/<(?:TABLE|TD|TR|TH|script|TBODY|font|B|U|I|center|form|dl|dt).*?>//gi;
$html =~ s/<\/(?:TABLE|TD|TR|TH|script|TBODY|font|B|U|I|center|form|dl|dt).*?>//gi;

3: 相対パスと絶対パスの相互の方法がまったく思い浮かばずにいます

これぐらいでよろしいのでしょうか。よろしくお願いいたします。
■ このスレッドは過去ログ倉庫に格納されています