Perlコーディング初心者質問スレ Part 43
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/08/12(金) 01:26:47ID:mHnZWvqz【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0375名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:05:32ID:???サブルーチンの第一引数とか
0376名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:07:43ID:???0377名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:12:45ID:???@hoge = (1 ,2, 3);
↓
$hoge[0] == 1
@_ = (1 ,2, 3);
↓
$_[0] == 1
ok?
0378374
2005/09/11(日) 23:22:07ID:???レスありがとうございます。
>377の例、わかりやすかったです
特に個別に名前はつけてないけどこーゆー配列(変数)だよ、っていう事なんでしょうか。
もしかしてすごくアホな事聞いてるかもしれないんですが、さっきの
if ($_[0] eq 'bye')
コレ、いきなり出てきたんです。>377で言う@_ = (1 ,2, 3); みたいなのがなくて。
@_ = (1 ,2, 3); がないのに、一体何と比較してるんだろう???となってしまったんですが…
0379名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:29:33ID:???サブルーチンの引数は、勝手に @_ に入ります。
というか、基本なんだからマニュアルか、本を読もうよ…。
0380374
2005/09/11(日) 23:37:29ID:???すみません。実は本読んでもよくわかりませんでした。
もうちょいスクリプトいじってみて、悩んでみます…
0381名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:41:56ID:???その本、巻末に索引付いてませんか?
そこで、$_ と @_ を探しましょう。
0382nobodyさん
2005/09/12(月) 17:57:25ID:???-----
$classname = 'bar'
return "foo::".$classname->new();
-----
みたいに、変数に入ってる値でクラスを呼び出すことはできないのでしょうか?
(この例だと、foo::barを呼び出したいです)
foo::??の??の部分を変数にして動的に変えたいですが、何かやり方はありますか?
0383nobodyさん
2005/09/12(月) 18:25:32ID:???0384nobodyさん
2005/09/12(月) 20:53:06ID:???use strict; を使ってるなら
no strict 'refs';
使ってないなら
$a = 'aaa';
&{$a."::new"}();
0385nobodyさん
2005/09/12(月) 20:54:01ID:???use strict; を使ってるなら
no strict 'refs';
$a = 'aaa';
&{$a."::new"}();
使ってないなら
$a = 'aaa';
&{$a."::new"}();
0386nobodyさん
2005/09/12(月) 20:56:53ID:???$obj = "foo::$classname"->new();
もできるんじゃないかな。
0388nobodyさん
2005/09/12(月) 22:46:32ID:Giee4nr4print table(TR,(td("")));
この書き方だとエラーになるようなんですが
0390nobodyさん
2005/09/13(火) 11:31:37ID:???ファイルを開いて処理する時に
open (FILE,"<$list");
while(<FILE>){
chomp;
my (undef,$addr,$svr,$uer,$pass) = split(/<>/,$_);
&get($addr,$svr,$usr,$pass);
}
close FILE;
と、
open (FILE,"<$list");
my @getlist = <FILE>;
close FILE;
foreach my $usrdata(@getlist){
chomp($usrdata);
my (undef,$addr,$svr,$uer,$pass) = split(/<>/,$usrdata);
&get($addr,$svr,$usr,$pass);
}
ってどちらが速いいですか?
会社の人は「whileよりforeachのほうが速い」って言うのですが、
何回ベンチ取ってもwhileのほうが1割近く速くなるんです。
私のベンチの取り方が問題?
読み込むファイルの大きさは1kb程度のものです。
0391nobodyさん
2005/09/13(火) 12:15:30ID:???その例ならwhileの方が普通は早そうでベンチとも一致する。
my @getlist = <FILE>;
でファイル全体を一行ずつにばらした配列を作るのが余計な
手間になるからね。
ただ一般的には往々にして直観はあてにならないのできちんと
ベンチをとって評価するのが正道。
0392nobodyさん
2005/09/13(火) 12:28:09ID:???0393nobodyさん
2005/09/13(火) 14:15:39ID:???0394382
2005/09/13(火) 14:15:41ID:???386さん
うまくいきました。ありがとうございました。
0396nobodyさん
2005/09/13(火) 20:13:08ID:???掲示板CGIなどで、特定の投稿を編集をするとき、一括読み込みをしないでデータを書き換える方法はありますか?
0397nobodyさん
2005/09/13(火) 21:19:34ID:???0399390
2005/09/14(水) 00:52:53ID:???>>393
ありがとうございます。
会社の人が言うように、whileよりforeachのほうが速いケースってあるんだろうか・・・
と思う今日この頃。
0401nobodyさん
2005/09/14(水) 23:20:56ID:???use CGI;
use Image::Magick;
$cgi = new CGI;
$fh = $cgi->param('picFile');
$i = new Image::Magick;
$i->Read($fh); #これができない
print "Content-type: image/jpeg¥n¥n";
$i->Write('jpeg:-'); #何も出力されない
フォームで選択されたファイルをどうにかしてファイルハンドルとして
PerlMagickに読み込ませたいのですが、うまく行きません。
現在は標準入力のデータを一旦ファイルに書き出し、
それを読み込んで加工する方法を取っておりますが、明らかに非効率だと思うのです。
いい方法はございませんでしょうか。
0402nobodyさん
2005/09/14(水) 23:24:25ID:???0403401
2005/09/14(水) 23:57:54ID:???$fhはファイルハンドルじゃないってことですか?
でも
read($fh, $buf, 1024);
という風にできるから・・・
0404nobodyさん
2005/09/15(木) 01:10:00ID:???PerlMagickと組み合わせて使ったことはないのでよくわからんが、
ファイルハンドルがほしいのなら
$fh = $cgi->upload('picFile');
を使う方がいいんじゃないかと。(ただしCGIモジュール2.47以降)
詳しくはCGIモジュールのPODの「CREATING A FILE UPLOAD FIELD」を
をよく読むといいだろう。
0405nobodyさん
2005/09/15(木) 13:41:48ID:3HNHstcis/ba/ば/g;
s/bi/び/g;・・・・みたいに何十行もえんえん続けるようなのでなく、
もっと効率的に動いて効率的に書けるような方法ありますか?
0406nobodyさん
2005/09/15(木) 14:12:50ID:???そおんなもんとっくに誰かが作ってるだろうと思い検索したらあったよ
ttp://pitecan.com/OpenPOBox/romakana/
0407401
2005/09/15(木) 15:53:13ID:???uploadとは盲点でした。が、状況は変わらず・・・。
ファイルハンドルを渡す時は
$i->Read(¥*fh);
とするとリファレンスあったので、これも試してみました。
PerlMagickにこだわるあまりCGIの方が疎かになっているようなので、
色々可能性を模索したいと思います。
0409401
2005/09/15(木) 17:18:27ID:???あ、ほんとだ。リファレンスにも書いてあるし、何故見落としてたんだろう・・・orz
おかげさまでうまく行きました。ありがとうございました。
0410nobodyさん
2005/09/16(金) 08:23:19ID:0dogEF/n本当に申し訳ないです
知らない方がいらっしゃるのであれば申し訳ないのですがネットゲーム「罪と罰」のようなCGIを利用し、
複数のプレーヤーの様々な数値(ステータスなど)を参加者全体で共有するどういった内容で行なわれているのでしょうか?
ついでにもう一つの質問を。スレ違いな感はありますがどうか答えてやってください。
PerlとPHPが多くのCGIで利用されているようですが二種類の言語が存在するということは各々に得手不得手があるということですよね?
その得手不得手及び私が制作しようとしているCGIゲームではどちらが向いているのか、初心者ではどちらが学びやすいか教えてもらえるとかなり光栄です。
よろしくお願いします。
自分の質問…あまりにも馬鹿なのか基本的すぎるのか検索にすらHitしないんです…orz
0411nobodyさん
2005/09/16(金) 08:31:10ID:???もう少しちゃんと調べような。
http://www24.big.or.jp/~obo/game/ore_/gild/
これはPerlで書かれてる模様。
2つ目の質問はスレ違いだが、これ以上他のスレに誤爆されても困るので答えておく。
まずCGIと言う形では向いていない。
罪と罰もそうだけど、このタイプの設置を禁止している鯖も多い。
そしてCGIにはRubyやPython、JAVAもあればCもある。
要約するとこうだ、半年ROMってろ。
0412nobodyさん
2005/09/16(金) 08:32:08ID:???半日ROMってくる
0413nobodyさん
2005/09/16(金) 09:32:49ID:???う〜ん…
自分は船乗りなので海の上でできる趣味が無いかな?と思ったんですけどねぇ…。
本で勉強してからまた書き込みます。まずは罪と罰と同じPerlから購入してみようと思います。
オススメの書籍があるならばお教えください。
レス無くとも言われたとおりROMっているので気を悪くしないでください。
0414413
2005/09/16(金) 10:03:47ID:???私に出てきてほしい場合は(限りなくそんな場合無いとは思いますが…)乗船期間以外であれば「あの時のゲームCGI初心者」や「誤爆犯」など分かりやすく呼んでいただけると出てきます。
おそらく自分から出てくるのは仕事もあるので4ヵ月〜半年後になると思います。
0415nobodyさん
2005/09/16(金) 11:06:01ID:???次の質問ドゾー
0416nobodyさん
2005/09/16(金) 11:44:27ID:???>>410
まあ初心者的には php のが楽かもね、と。
0417413
2005/09/16(金) 21:00:27ID:???>>416さん
レスありがとうございます。
PHPですか。HTMLと一緒に記述できる点が初心者向きということですか?
本屋でPerl関連の本を探してもあまり見つからない(一冊しか無かった…)のは何故でしょう?
素人調べで悪いのですがUNIXと記述方法が似ていると言う事なのでUNIXを学べば良いのでしょうか?
でもUNIXってかなりレベルが高いような…
0418nobodyさん
2005/09/16(金) 21:05:55ID:???>本屋でPerl関連の本を探してもあまり見つからない(一冊しか無かった…)のは何故でしょう?
これはありえないと思われます。事実ならその本屋・・・品揃え悪すぎだと・・・
0420nobodyさん
2005/09/16(金) 21:30:04ID:???0422nobodyさん
2005/09/17(土) 00:01:30ID:???>>417
php は関数が最初から腐るほど用意されてあるから、
perl みたいに自分で書いたりモジュール用意したりする手間が省けることが多いのだよ。
そこが perl の楽しいところでもあるんだけど、初心者には荷が重いかもとか。
結構Web上でも初心者から学べる解説サイトがいくつかいくらでもあるので、そういうの見てもいいかもね。
まあ、ここは perl コーティングの質問スレだから、これ以上はここではきかないでね。
0423nobodyさん
2005/09/17(土) 00:24:53ID:???そう?妄想なら日記に書いておいてよ。
0425nobodyさん
2005/09/17(土) 04:40:43ID:???$funcs = get_defined_functions();
print count($funcs["internal"]);
?>
このスクリプトで組み込み関数の数を調べられるわけだが
うちの環境(PHP4.4.0+mb_string)では
826という数字が出て来た。
0426nobodyさん
2005/09/17(土) 07:33:55ID:???php5.1.0b2
1084
腐るほどかどうかは不明だが妄想とはいえないだろ
0427nobodyさん
2005/09/17(土) 07:58:14ID:???数えるのマンドクセ('A`)
0428nobodyさん
2005/09/17(土) 08:32:46ID:???こんな関数がある時点ですでに腐っている。
0429nobodyさん
2005/09/17(土) 09:10:30ID:???0430nobodyさん
2005/09/17(土) 10:05:17ID:???0433nobodyさん
2005/09/17(土) 15:15:36ID:???また、組み込み関数とやらにバグがあった場合、root 等の権限を
持たないユーザでは何も出来なくなるけど、そういう場合どうするの?
0434nobodyさん
2005/09/17(土) 15:35:59ID:9NJ0Gho0キーを抜き出したいのですが、これは無理なんでしょうか?
%hoge = ('aaa', 3, 'ccc', 2, 'bbb', 1);
foreach(%hoge){
print "$_ ";
}
欲しい結果
aaa 3 ccc 2 bbb 1
0435nobodyさん
2005/09/17(土) 15:43:14ID:ceziuPlebiglobeでMIME::BASE64使うにはどうしたらいいの?
0436nobodyさん
2005/09/17(土) 16:07:42ID:Oc8EoCio無理じゃない?キーの頭に値を入れてソートするとか
0438nobodyさん
2005/09/17(土) 16:41:27ID:???それができるモジュールがあったと思う。
モジュール名は失念。
>>435
MIME::BASE64 を cpan あたりからダウンロードして biglobe の自分の
ディレクトリに置き、
use lib qw(path/to/MIME::BASE64);
でOK。
0439nobodyさん
2005/09/17(土) 16:44:02ID:???use Tie::Hash::Array;
tie my %hoge, 'Tie::Hash::Array';
%hoge = ('aaa', 3, 'ccc', 2, 'bbb', 1);
foreach(%hoge){
print "$_ ";
}
0440nobodyさん
2005/09/17(土) 16:44:52ID:???> MIME::BASE64 を cpan あたりからダウンロードして biglobe の自分の
http://search.cpan.org/src/GAAS/MIME-Base64-3.05/
xs とかあるけど、どーやってコンパイルするんだろう。
0441439
2005/09/17(土) 16:45:43ID:???0444nobodyさん
2005/09/17(土) 17:04:08ID:???>>434 がどうして >>434 なような意味不明なことを考えたかだ。
@unko = ('aaa', 3, 'ccc', 2, 'bbb', 1);
foreach (@hoge){
print "$_ ";
}
0445nobodyさん
2005/09/17(土) 17:08:38ID:???pure perl 版はどうでしょう?
http://search.cpan.org/~gaas/MIME-Base64-Perl-1.00/lib/MIME/Base64/Perl.pm
0447nobodyさん
2005/09/17(土) 17:14:41ID:???へー。pure perl なのあったんでつね。
>>446
がんばってコンパイラの使い方を説明してあげてくれ。w
0448439
2005/09/17(土) 17:15:38ID:???use Tie::Hash::Indexed;
tie my %hoge, 'Tie::Hash::Indexed';
%hoge = ('aaa', 3, 'ccc', 2, 'bbb', 1);
foreach(%hoge){
print "$_ ";
}
# 一応できたけど、このモジュールだったけか…。
0449nobodyさん
2005/09/17(土) 17:19:12ID:???0451nobodyさん
2005/09/17(土) 17:55:00ID:9NJ0Gho0どうもありがとうございます。
用途は、、確かに配列でも代用できそうなんですけど、
キー指定して、値を引っ張るて事をしたく、
たまに、決まった順番でまとめて出力したかったからです。
0453nobodyさん
2005/09/17(土) 18:09:57ID:???PHPは配列とハッシュ(連想配列)の区別がないから、そのはず。
(じゃないと、キュー/スタックとして使えなから。)
$hoge = array('aaa' => 3, 'ccc' => 2, 'bbb' => 1);
foreach($hoge as $key => $value){
echo "$key => $value ";
}
結果
aaa => 3 ccc => 2 bbb => 1
0455nobodyさん
2005/09/17(土) 18:18:20ID:???0456nobodyさん
2005/09/17(土) 18:29:36ID:???0457nobodyさん
2005/09/17(土) 18:45:39ID:???0458nobodyさん
2005/09/17(土) 18:47:37ID:???それだったら
@hoge = ('aaa', 3, 'ccc', 2, 'bbb', 1);
こうやっといてから
%hogehash = @hoge;
って2つつくれば済むような。
0461nobodyさん
2005/09/17(土) 19:00:26ID:???0462nobodyさん
2005/09/17(土) 20:19:55ID:???0463nobodyさん
2005/09/17(土) 20:25:16ID:???0464nobodyさん
2005/09/17(土) 21:02:52ID:EwuItVJ4疑似ハッシュって今ダメなんだっけ?
>>440
MIME::Base64ならローカルにコンパイルしてFTPでコピーしても動くよ。
0465nobodyさん
2005/09/17(土) 21:16:29ID:???put 先の環境がわからない場合は、手が出せないと思うのだけど。頭大丈夫?
0466nobodyさん
2005/09/18(日) 01:36:06ID:???やってるやつは1人か2人だと思うけど。
マジレスすると
>>452
そういうニーズがあって別に問題ないだろう。
>>465
もう少し知識をつけてから書き込みましょう。
0467nobodyさん
2005/09/18(日) 02:17:25ID:???> もう少し知識をつけてから書き込みましょう。
何の知識だろう?説明して欲しいなら正直に言えばいいのに。
pure perl 版でない MIME::Base64 を動かす場合、xs をコンパイルしないとけない。
biglobe で動くようにバイナリを作らないといけないので、
> put 先の環境がわからない場合は、手が出せないと思うのだけど。頭大丈夫?
0468nobodyさん
2005/09/18(日) 02:21:44ID:???> そういうニーズがあって別に問題ないだろう。
頭が大丈夫か否か確認しているだけで、問題であるとは言ってないのでは?
0470nobodyさん
2005/09/18(日) 02:40:02ID:???0471nobodyさん
2005/09/18(日) 02:40:28ID:???0472nobodyさん
2005/09/18(日) 02:42:27ID:???0473nobodyさん
2005/09/18(日) 02:44:47ID:???0474nobodyさん
2005/09/18(日) 02:49:56ID:???■ このスレッドは過去ログ倉庫に格納されています