Perlコーディング初心者質問スレ Part 42
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/05/25(水) 06:36:28ID:PVpWgcdf【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0133nobodyさん
2005/05/30(月) 19:04:21ID:???「Scalar::Utilの」って言ってくれてるんだから、まずは自分で調べてみましょう。
perldoc Scalar::Util
0134106,107,108
2005/05/30(月) 19:34:37ID:???0135nobodyさん
2005/05/30(月) 19:37:51ID:2nqscNNy私の素人用の本には載っていなくて、検索でなんとか
【@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:Xh5clFyG0138nobodyさん
2005/05/30(月) 20:29:17ID:???0139nobodyさん
2005/05/30(月) 20:42:20ID:2nqscNNy比較対象データが、数値・文字混在で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:???君はまずモジュールというものを知るべきだ。
その後、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:???0143nobodyさん
2005/05/30(月) 22:04:45ID:???looks like number = 数値のように見える
'123'と123を見分けるにはPerlレベルでは無理だし、見分けても意味ない。
0144nobodyさん
2005/05/30(月) 22:05:43ID:???0145nobodyさん
2005/05/30(月) 22:08:01ID:???ttp://search.cpan.org/~gaas/Perl-API-0.01/
これでperlapiの殆どの関数を利用できるようになる。
0146nobodyさん
2005/05/31(火) 06:36:25ID:???JST とか GMT とか EST とかそういうの。
0147nobodyさん
2005/05/31(火) 08:23:28ID:???0148nobodyさん
2005/05/31(火) 08:43:42ID:???windows perl じゃ取れなかったけどw
0149nobodyさん
2005/05/31(火) 08:45:01ID:???タイムゾーン関係の設定ファイルがあるが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;
print strftime "%Z", localtime;
0151nobodyさん
2005/05/31(火) 10:01:32ID:???>>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:md7jEE3a0159nobodyさん
2005/05/31(火) 19:19:00ID:???statでは調べられないみたいですが、もしもございましたら
ご教授いただきたい次第です。
0160nobodyさん
2005/05/31(火) 19:20:33ID:???0163nobodyさん
2005/06/01(水) 05:35:45ID:???require Exporter;
require DynaLoader;
@ISA = qw(Exporter DynaLoader);
bootstrap なんか別のモジュール?;
みたいな流れがよくあるんですが、
これって何をやっているんでしょう?
0164nobodyさん
2005/06/01(水) 10:36:57ID:???0165nobodyさん
2005/06/01(水) 12:03:09ID:???んー、Exporterのほうはぐぐってみても日本語化されたマニュアルが見つからないのです。
動的にモジュールをロード?しているっぽいんですかね。
これを使えば、引数からモジュール名を得て、インポートするモジュールを選べたりするのでしょうか。
0166nobodyさん
2005/06/01(水) 12:26:27ID:???ぐぐり方が悪すぎるんじゃ...
Exporterとperlをキーワードにして日本語のページを検索すると
普通に出てきますが...
0167nobodyさん
2005/06/01(水) 21:46:59ID:???Exporterはモジュールのシンボル(通常はサブルーチン)を呼び出し元に輸出するためのモジュール。
DynaLoaderはCなどで書かれた外部サブルーチン(XS)をロードするモジュール。
詳しいことはぐぐるなりマニュアル読むなりせよ。
オブジェクト指向でPurePerlなモジュールを書く分にはどちらも無関係。
0168nobodyさん
2005/06/01(水) 23:13:36ID:4wa3Dv1bファイルを添付することは出来ませんか?
0169nobodyさん
2005/06/01(水) 23:38:04ID:???できる。でもsendmailそのまま使ってあとは自分で作るのはお勧めしない。
search.cpan.orgでmailとかMIMEとかキーワードに検索するといろいろでて
くるのでなるべく利用するのが吉かと。
0170nobodyさん
2005/06/02(木) 07:19:19ID:???その言い方から予想するとプラグマ以外の他のモジュール使わないで単独で動くモジュールってことかな。
0171nobodyさん
2005/06/02(木) 07:21:43ID:???0172nobodyさん
2005/06/02(木) 12:06:12ID:???PurePerlってのは他の言語で書いたライブラリに依存せず、Perlのみで書かれたコードのこと。
どんなモジュールを使っているかは関係ない。
標準ライブラリだと、CGI.pmはPurePerlで、POSIX.pmはPurePerlじゃない。
といってもそんな厳密なものではなく、例えばData::Dumperなんかはコンパイル済みライブラリがあれば
その(速い)ルーチン、無ければPurePerlルーチンを自動的に選択して使用する。
非PurePerlモジュールに依存したPurePerlモジュールをPurePerlというか否かも意見の分かれ目だな。
>>171
まあXSインターフェイスを使わなくてもDynaLoaderを使うことはあるわな。
ここでは単に「外部サブルーチン」という意味でXSとした。
0174nobodyさん
2005/06/02(木) 18:02:31ID:???foreach (1 .. 10) { $i++; } continue { $j++; }
print " ($i , $j) \n";
こういうコードを実行すると、結果が (10 , 10) ってなるんだけど、これはいいの?w
(10 , 9) ってなってほしかったんだけど・・・ orz
0175nobodyさん
2005/06/02(木) 19:32:12ID:???どこからどう考えても (10,10) なのだが・・・。
foreach節の最後に last until $i < 10; とでも付け加えれば
最後の continue は実行されないが。
0176nobodyさん
2005/06/02(木) 19:41:55ID:???ラクダ3版の「4.4.3 foreachループ」の最後のあたりに
はっきりこのように書いてある。
while文と同様に、foreach文もcontinueブロックを持つことが
できる。continueブロックは、ループが普通に実行された場合
でも、nextが実行された場合でも、ループの各繰り返しの最後
に必ず実行される。
0177nobodyさん
2005/06/02(木) 20:09:01ID:QYKowdcjprint $saitama;
}
すいません↑これって何をしてるんですか?
-eで$saitamaが存在しているのかどうかを調べているんでしょうか
0178nobodyさん
2005/06/02(木) 20:12:30ID:???正解。
0179nobodyさん
2005/06/02(木) 20:15:16ID:QYKowdcj0180nobodyさん
2005/06/02(木) 20:40:27ID:???$text =~ s/\A([^\n]*)\n//s;
$d{title} = $1;
こんなのが出てきたんですけど、$1は、「上の正規表現『s/\A([^\n]*)\n//s』で一番最初にマッチングしたもの」であってますか?
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:???0185nobodyさん
2005/06/02(木) 22:00:22ID:U6HelXRG他にも項目があって固定長には出来ないのですが、固定長にすると
対象レコードのみ書き換えられるのでしょうか?
>>184
成功したかどうかはどう判断すれば良いでしょうか?
0187nobodyさん
2005/06/02(木) 22:22:01ID:???他にも方法はいくらもあるけど、上のもそうだがいちいち聞くな、自分で考えろと。
0188nobodyさん
2005/06/03(金) 06:02:35ID:???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 の値が変わるので、
全く送られていないわけではないみたいなのですが…
いったいどこに行ってしまったのか心当たりはありませんでしょうか?
0189188
2005/06/03(金) 07:13:27ID:???なんか全然別のつまらないところでミスっていただけでした……
板汚しすみません……
0190nobodyさん
2005/06/03(金) 09:54:19ID:lSpNwut+0191nobodyさん
2005/06/03(金) 10:01:33ID:???0192nobodyさん
2005/06/03(金) 10:02:31ID:???0193nobodyさん
2005/06/03(金) 16:31:13ID:p0YkzVQclocal $_ = shift;
-(tr/\x00-\x7f//)+2*length
}
↑これはどんなことをしてるんでしょうか
lengthwは
if((lengthw $x) < 50){} のような使い方をしているみたいですが
どなたか分かる方がおりましたら解説希望です。
0194nobodyさん
2005/06/03(金) 17:23:46ID:???なにがしたいのかはよくわからん。
0195nobodyさん
2005/06/03(金) 17:24:10ID:???0196nobodyさん
2005/06/03(金) 18:09:23ID:???$_がunicode文字列でbytesプラグマの影響範囲内でなければ
lengthはバイト数じゃなくて文字数だな。
もしそうならアスキーの範囲は1,それ以外は2で文字幅を
数えてるような気がする。
条件が示されてないのでなんともいえんが。
0197193
2005/06/03(金) 18:27:26ID:p0YkzVQcお答えありがとうございました!
というか
local $_ = shift;#←これがよく分かってないんです。
-(tr/\x00-\x7f//)+2*length #←これは_$が略されてるのは想像つくんですが。。
0198nobodyさん
2005/06/03(金) 18:45:47ID:???結局見てみないとわからんねw
>>197
local $_ = shift;
↓=
local $_ = shift @_;
OK?
0199193
2005/06/03(金) 18:52:05ID:p0YkzVQcわけ分かりませんでした。ありがとうございました!
ちなみにbytesプラグマの影響範囲内ではありません。
0200nobodyさん
2005/06/03(金) 18:56:41ID:???use Time::Local
とか意味分かんないし
0201nobodyさん
2005/06/03(金) 18:58:28ID:???0202nobodyさん
2005/06/03(金) 19:12:25ID:???0203nobodyさん
2005/06/03(金) 19:23:19ID:???それは単に君が勉強が足りてないだけのような気が。
0204nobodyさん
2005/06/03(金) 19:47:19ID:???↓=
BEGIN {
require 'Time::Local.pm';
import Time::Local;
}
アンダースタンンドゥッ!?
0205nobodyさん
2005/06/03(金) 19:59:28ID:???0206nobodyさん
2005/06/03(金) 20:25:00ID:???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:???0208nobodyさん
2005/06/03(金) 21:17:01ID:???0209nobodyさん
2005/06/03(金) 21:21:50ID:???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:???0212nobodyさん
2005/06/03(金) 21:38:29ID:p0YkzVQcこんなのが出てきましたけど、私にはチンプンカンプンです。
これだけで申し訳ないのですが、↑が分かる人がいましたら、解説願います。
0213nobodyさん
2005/06/03(金) 21:44:52ID:???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 $manko = 100;
print int($chinko / (1024 * 1024) * $manko) / $manko;
0220nobodyさん
2005/06/05(日) 00:02:38ID:???0221nobodyさん
2005/06/05(日) 00:43:39ID:???0222nobodyさん
2005/06/05(日) 04:55:26ID:???0223nobodyさん
2005/06/05(日) 13:21:23ID:???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:???0〜5までの数字から完全にランダムに選んだ場合、
直前と同じ数字になる確率は1/6もあるわけで、
10回も続けてやれば一度でも同じになる確率は
8割以上だからまあ当たり前だろうな...
同じ数字が続くのがいやならひとつ前の数字を
保存して同じ数字にならないように細工すりゃ
いいんじゃねーの。
お手軽コース:
同じ数字の間はやり直す
少し考えたコース:
0〜4までの乱数を求めて、前の数字と等しいか
大きければ1を加える。
0226nobodyさん
2005/06/05(日) 16:42:19ID:???コード書いてみたがね。
同じ数字が並びそうなら振りなおすなも。
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:???下のテーブルをセレクトしたいだけなんですが、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さん
NGNGmy @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:???たぶんこれ。オレも以前はまった。
ttp://www.mysql.gr.jp/frame/modules/bwiki/?FAQ
の「mysql コマンドでは大丈夫なのに、PHP,perl,accessなどで文字が ? に化けるのは? 」
0231227
2005/06/05(日) 20:35:05ID:???ログイン直後に 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]);
}
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: 相対パスと絶対パスの相互の方法がまったく思い浮かばずにいます
これぐらいでよろしいのでしょうか。よろしくお願いいたします。
■ このスレッドは過去ログ倉庫に格納されています