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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
0233nobodyさん2006/06/06(火) 21:35:56ID:???
>>231
openのモードがNG
「>」「>>」「<」「+<」の違いはわかってる?
0234nobodyさん2006/06/06(火) 21:41:43ID:???
+< id.txt
seek
減る事もある場合、桁数に注意
0235nobodyさん2006/06/06(火) 23:19:31ID:???
ねえ、
$word が任意の入力できる文字列で、文字コードが EUC か UTF8 だとして、

$word = quotemeta $word;
$word =~ /$word/;

に、セキュリティホールってある? 普通に通るかすら。
0236nobodyさん2006/06/06(火) 23:22:01ID:???
なんで $word を $word で検索してんだw
$word = quotemeta $word;
$text =~ /$word/;
こうですた。
0237nobodyさんNGNG
何がしたいねん
0238nobodyさん2006/06/06(火) 23:43:29ID:???
おそらくは検索か
俺は\x00-\x19までを削除してるのと、正規表現で意味のもつものをエスケープする以外はなんもやってない
0239nobodyさん2006/06/07(水) 00:01:52ID:Z9iT2VzK
勉強中の身に、どなたか教えてください。

open(FILE, "<2get.txt") || print "file open error!";
while(<FILE>){
print;
}

とやって、2get.txtの内容を出力する、というのを応用して、
2get.txtの内容を途中まで読み込むCGIを作りたいのですが。

例えばこの2get.xtxの中の1行に、
<!-- ここまで -->
とか書いておきます。

で、CGIで読み込む時に、上から1行ずつ読んでいって
<!-- ここまで -->の行が出てきたら、読み込み終了。

実際に自分で作ってみて、while〜の1行を
while(<FILE> ne '<!-- ここまで -->') ||(以下略)
って書き換えたら、CGIが動かなくなりますた。
どっかで勘違いしてるんだろうと思うんだけど、
勘違いのポイントかヒントだけでも教えてください。
0240nobodyさん2006/06/07(水) 00:16:13ID:???
while(<FILE>)ってwhile($_ = shift <FILE>)と同じなんで、そこで抜ける判定をしなんでも
print; の前に抜ける条件を書いて lastしてみればいいんじゃないかと。
0241nobodyさん2006/06/07(水) 00:41:37ID:DSNCvTMF
勘違いじゃなくて勉強が足りんかったわけですね。
つーか500エラーが出ました。

while(<FILE>) {
if($_ eq '<!-- ここまで -->') { last; }
print;
}

これで合ってますか?
0242nobodyさん2006/06/07(水) 00:47:38ID:DSNCvTMF
あ、できた。

でも<!-- ここまで -->を読んでくれません。
''で囲むんじゃダメなんですかね?
それとも改行コードも考慮しないといけないとか?
0243nobodyさん2006/06/07(水) 00:47:47ID:???
>>240
shift はつかなくね? $_ = <FILE> じゃ?
0244nobodyさん2006/06/07(水) 00:49:12ID:???
>>242
$_ は最後の行じゃない限り、最後に改行がついてるよ
0245nobodyさん2006/06/07(水) 00:51:05ID:???
>>232>>233>>234
有難うございました。

0246nobodyさん2006/06/07(水) 00:59:40ID:???
>>243
defined($_ = <FILE>) じゃね?
0247nobodyさん2006/06/07(水) 01:03:44ID:???
でもさあ、1行ずつ読み込んで、その都度あるかないかわからない文字列をチェックして途中で終了させるより、
一気に全部読んで文字列に入れてから、その文字があるなら正規表現でずばっと削除したほうが早いよね。
0248nobodyさん2006/06/07(水) 01:09:16ID:???
>>247
んなこた環境とデータセットによる。
0249nobodyさん2006/06/07(水) 01:11:19ID:???
I/Oやメモリをそこまで気にする時代じゃないだろうに
02502482006/06/07(水) 01:18:21ID:???
>>249
「早いよね」ってことだったので、速いか遅いかは読込むデータの傾向や動作環境によるっつー話。
メモリやら I/O の話はどこから出てきた?
0251nobodyさん2006/06/07(水) 01:20:34ID:???
っていうか、いま気づいたんだけど、
>>239 の場合

local $/ = '<!--ここまで-->';
open (FILE, '2get.txt');
$_ = <FILE>;
close (FILE);
print $_;

ってやると解決しないか?
速度的にも一番早い。
0252nobodyさん2006/06/07(水) 01:23:04ID:???
>>240
>>244
ありがとうございました。なんとか動くものになりました。

>>247
正規表現もまだ理解しきっていないので…
今後のメンテナンスの時に考えることにします。
02532512006/06/07(水) 01:24:25ID:???
あ、 print 前に chomp; もか。
0254nobodyさん2006/06/07(水) 01:29:15ID:???
>>251
激しく意味不明のテキストが発生しますた…
0255nobodyさん2006/06/07(水) 01:38:27ID:???
>>254
まじでwww
うちではうまくいくけどなあ。
ちょっとこれだけ走らせてみt

[2get.txt]
1111111111111111111111111111111111111111111
222222222222222
3333333<!--ここまで-->333333333333

[hoge.pl]
use strict;
{
local $/ = '<!--ここまで-->';
open (FILE, '2get.txt');
local $_ = <FILE>;
close (FILE);
chomp $_;
print $_;
}
exit;

\r\n\r\n ずつデータとるときとかに使えるしwktkだと思ったんだがなあ。
0256nobodyさん2006/06/07(水) 01:43:22ID:???
$/ 自体に長さの制限とかあるのかな?
0257nobodyさん2006/06/07(水) 01:52:11ID:???
>>256
どうなんだろ?
とりあえず試しに 200kb くらいのテキスト用意して、

- - - - - - - - - - - - - - - - - - - - - - - - - - -
$/ = '『根掘り 葉掘り 聞き回る』の・・・『根掘り 葉掘り』・・・・・ってよォ〜〜〜
『根を掘る』ってのはわかる・・・・・スゲーよくわかる 根っこは土の中に埋っとるからな・・・
だが「葉掘り」って部分はどういう事だあああ〜〜〜〜〜っ!?
葉っぱが掘れるかっつーのよーーーーーーッ!
ナメやがってこの言葉ァ 超イラつくぜぇ〜〜〜ッ!!
葉っぱ掘ったら裏側へやぶれちまうじゃあねーか!
掘れるもんなら掘ってみやがれってんだ!チクショーーッ
どういう事だ!どういう事だよッ!クソッ!葉堀ってどういう事だッ!
ナメやがってクソッ!クソッ!';
- - - - - - - - - - - - - - - - - - - - - - - - - - -

・・・って入れてやってみたけど、こっちでは無事その前部分だけに切り取られたよw
0258nobodyさん2006/06/07(水) 01:52:17ID:???
>>255
ファイル作ってみましたが500エラーです…

おかすい。なぜだ。
0259nobodyさん2006/06/07(水) 01:59:10ID:???
>>258
え、どんなエラーでてる?

ブラウザでやってるなら
#!/usr/bin/perl
print "Content-type: text/html\n\n";
も入れてね?
0260nobodyさん2006/06/07(水) 02:03:21ID:???
>>257
その文章の方が気になりますがw

すんません、Content-typeを入れるの忘れてますた。
んで、今度こそ大丈夫だと思ったら空白ページ。

鯖環境かなんかですかね?
0261nobodyさん2006/06/07(水) 02:07:38ID:???
できたー!
0262nobodyさん2006/06/07(水) 02:11:01ID:???
ええw ('A`)

まあおめでとう!w 何が悪かったのやらw

てか自分のPCに perl 入れて、コマンドプロンプトとかから perl 実行すること覚えようぜ。エラーメッセージでて便利よ。
0263nobodyさん2006/06/07(水) 02:14:36ID:???
> てか自分のPCに perl 入れて、コマンドプロンプトとかから perl 実行すること覚えようぜ。エラーメッセージでて便利よ。

無限 fork するようなもの書いたときにおかしくなるから嫌。
0264nobodyさん2006/06/07(水) 02:14:53ID:???
>>262
うい。perlは入れた(はず)ですが、実行の仕方(設定の仕方?)が分からんとです。
これから覚えます。

ちなみに、もともと作ってた方のページも直しましたが、
読み込み元ファイルの内容が表示されんとです。

まだまだ道は長いとです。

ありがとうございました。
0265nobodyさん2006/06/07(水) 02:19:08ID:???
>>263
えぇw

>>264
そのフォルダからcmd開いて、 「perl hoge.cgi」 とか打つだけだす。
あと、$/ 変えて読み終わったあとは、変な挙動起こさないように、
$/ = "\n"; って設定しなおしていくといいかも。
0266nobodyさん2006/06/07(水) 02:23:00ID:???
>>265
> そのフォルダからcmd開いて

いきなり意味分かんないんで、このスレのログ保存しておきました。
もうちょっと頭が良くなってから読み返します。

こんな夜中までありがとうございます。
0267nobodyさん2006/06/07(水) 02:29:37ID:???
>>184 ありがトン
0268nobodyさん2006/06/07(水) 02:37:25ID:???
> そのフォルダからcmd開いて

確かに、意味不明ですね。
0269nobodyさん2006/06/07(水) 03:07:49ID:???
意味不明だけど言いたいことは分かる
0270nobodyさん2006/06/07(水) 03:08:00ID:???
まじかw

↓こういうのをやるとか、
http://arena.nikkeibp.co.jp/tec/winxp/20050309/111687/

どっかのフォルダの ツール → フォルダオプション → ファイルの種類 → CGI ファイル → 詳細設定 で、
新規 → アクション 「cmd」 → アクションを実行するアプリケーション 「cmd.exe "cd %l"」

ってやると、「そのフォルダからcmd開いて」 な感覚になるんだけど・・・普通そう言わないのかな・・・(´・ω・`)
0271nobodyさん2006/06/07(水) 04:27:27ID:???
アクセサリ -> コマンドプロンプト を実行して、
cd "c:\perlスクリプトがあるディレクトリ"
perl スクリプト名.pl

が親切では?
0272nobodyさん2006/06/07(水) 05:24:07ID:???
>>271
うん、そうなんだけど、
ファイルのディレクトリが D:ドライブだとまた違うし、
何度も使うなら、cd 〜フォルダ名 とか打つの省略できる方が楽だと思って。
0273nobodyさん2006/06/07(水) 05:51:48ID:???
>>272
今日から perl 勉強します yo! ってひとが、そんな設定やると思う?

コマンドプロンプト開いた時点で、その人のホームディレクトリにいるから
誘導するのはそれほど難しくないよね。
0274nobodyさん2006/06/07(水) 08:11:05ID:???
Microsooftが配布してるツールとか、窓の手とかのカスタマイズツールで、
エクスプローラのフォルダから DOS 窓を開けるようになる。
そうすれば一々 CD しなくてもいいし、perl への PATH が通ってれば perl ってだけで
起動できる。

ちなみに cmd とか commasnd とかから起動すると速攻で窓閉じるから駄目よw
0275nobodyさん2006/06/07(水) 10:29:37ID:???
あるソースを読んでいて分からないところがあるので質問させて下さい。

@{$a}{@$b}

これってどういう意味なんでしょう?
そんなに難しいことじゃないと思うんですが、
perlは慣れていないので苦労しています。
宜しくお願いします。
0276nobodyさん2006/06/07(水) 10:44:11ID:???
>>275
例えば、
$a = 'hash';
$b = ['a', 'b']; # 配列のリファレンス
とすると、
@{$a}{@$b} → @hash{'a', 'b'} → ($hash{'a'}, $hash{'b'})
のこと。
02772752006/06/07(水) 10:54:10ID:???
>>276さん
そういうことだったんですね。
助かりました。有難うございました。
0278nobodyさん2006/06/07(水) 13:05:38ID:???
配列とソートに関しての質問です
左は日付です

--20060101--aaaa----
--20060423--bbbb----
--20060514--cccc----

なんてのが書いてあるファイルを読み込み @dataとします
まず@dataを表示させてみると2行目からの頭に半角のスペースが入ります
これはなんでしょうか?

さらに

foreach(@data){
if( /(--(\d*)--\w*----)/){
$list {"$2"}=$_;
}}

foreach $key (sort keys %list){
push @htm ,$list{$key};}

とし、これをもう一度展開して表示させてみると、同じ日付がある場合に
誤動作して読み込まれません
改善するにはどうしたらいいでしょうか?
0279nobodyさん2006/06/07(水) 13:14:37ID:???
>>278
行と改行コードに関する質問です

読み込み
もう一度展開

なんてのが書かれている質問を読み込みます
これはなんでしょうか?

> 頭に半角のスペースが入ります
> これはなんでしょうか?
 自分で書いているとおり半角のスペースなのではないでしょうか。

さらに

誤動作して読み込まれません

と書いてあるので考えてみると、コードは動いているのに質問する場合なので
解釈がうまくできません
改善するにはどうしたらいいでしょうか?
02802782006/06/07(水) 13:20:29ID:???
質問の仕方が悪いのはご容赦ください
0281nobodyさん2006/06/07(水) 13:28:36ID:???
>>278
> 半角スペース
定番FAQ
print "@data";とやってるだろ。
配列を文字列内に入れようとすると$"(デフォルトで半角スペース)で連結されるからこうなる。
むやみにダブルクォーテーションで囲むのは止めましょう。
ちなみにprint @data;の場合は$,で連結される。これはデフォルトで空文字列。

> 同じ日付
%listの中に配列を作って複数の値を記録できるようにすれば良い。
foreach (@data) {
push @{$list{$1}}, $_ if /--(\d*)--\w*----/;
}

foreach my $key (sort keys %list){
push @htm, @{$list{$key}};
}
0282nobodyさん2006/06/07(水) 13:29:56ID:???
>>278
@dataはファイルから丸ごと読み込み
@data = <FH>;
で、@dataを表示する時に
print "@data";
とかやってるんじゃないの?
だったら頭にスペース入るだろうね。

2つめは当たり前でしょう。
同じ日付があれば、データが上書きされるので。
ハッシュの先を配列にするとかしないと。
0283nobodyさん2006/06/07(水) 14:35:06ID:CY60cgj5
wiki記法で書いたテキストをhtmlに反映したいのですけど
そういったモジュールってありますでしょうか?

CPANでwikiで検索したら数があまりに多すぎて。。。。。

02842782006/06/07(水) 14:55:55ID:???
>>281 >>282
有り難うございます

push @{$list{$1}}, $_ if /--(\d*)--\w*----/;
この部分がエラーを発生します

もうちょっと勉強してみます
02852782006/06/07(水) 14:57:52ID:???
失礼しました、大丈夫でした、m(_ _)m
0286nobodyさん2006/06/07(水) 16:04:17ID:???
それだと要素数が1の配列ができまくってモヤっする
0287nobodyさん2006/06/07(水) 16:08:10ID:???
文法的に正しいとか間違ってるとかは置いといて、スカラーとか配列とか、
最初に空のデータとして宣言しとかないと何か不具合起こすことってあるの?
0288nobodyさん2006/06/07(水) 16:22:34ID:???
>>287
Cみたいに初期化しないと変な値が書き込まれてるって事は無い。

ただし、配列かどうか分からない所にいきなりpushしたりするとエラーになる。

my %hash;
my %data = ('a' => 1, 'b' => 2, 'c' => 3);
while (my($key, $val) = each %data) {
 push($hash{$key}, $val); # Error(配列に初期化してないから)
}
0289nobodyさん2006/06/07(水) 16:25:30ID:4ldG4rWr
winxp
perl5.8.8

ウェブ上で使ってるプログラムをローカルに持ってきたらエラーがでました。
ウェブのperlは5.8.1です。
そこで質問です。

use strictしてるプログラムをperl -cに掛けてエラーが出ないのにapacheのログに
[Wed Jun 07 16:06:23 2006] [error] [client 127.0.0.1] Premature end of script headers: c:/program files/apache group/apache/htdocs/public_2/system/system.cgi
[Wed Jun 07 16:06:23 2006] [error] [client 127.0.0.1] Can't use an undefined value as a HASH reference at c:\\PROGRA~1\\APACHE~1\\apache\\htdocs\\public_2\\system\\system.cgi line 427.\n
と出て、strictを外すと
[Wed Jun 07 15:47:53 2006] [error] [client 127.0.0.1] Premature end of script headers: c:/program files/apache group/apache/htdocs/public_2/system/system.cgi
[Wed Jun 07 15:47:53 2006] [error] [client 127.0.0.1] substr outside of string at c:\\PROGRA~1\\APACHE~1\\apache\\htdocs\\public_2\\system\\system.cgi line 445.\n
とエラー内容が変わるのはなんですかね。

ウェブ上ではなんのエラーもなく動作してる時点でコードに問題はないと思うのですが。
0290nobodyさん2006/06/07(水) 16:28:46ID:???
>>288
ほぉ、なるほど、そういうケースがあったのね。
勉強になりました。ども。
0291nobodyさん2006/06/07(水) 16:28:50ID:???
>>289
apachのえらーろぐみたらえーやん。
0292nobodyさん2006/06/07(水) 16:30:26ID:???
>>289
use strict; してるかどうかによって警告が出る位置が違ってる。
それから、エラー読もうよ…。
substr が文字列境界超えてるって。

多分、見えないだけで、webサーバ側のログには延々とそれが書き込まれてる。
02932892006/06/07(水) 16:40:43ID:4ldG4rWr
>>291
すみません。先ほどのapacheのエラーログです。
>>292
文字列境界越えてるって使い方がおかしいってことですかね。<strong>${\substr($db_all_field_html{ordertime},0,4)}年${\substr($db_all_field_html{ordertime},4,2)}月${\substr($db_all_field_html{ordertime},6,2)}日
こういうことはしてます。でもウェブの方ではエラーログには何も残らず、ちゃんと表示される。
自宅では表示もできないし、ログにも
残る。

それにしても構文レベルのエラーならperl -cでひっかかると思ったのですが、
構文はあっているけど、実際に処理をしたら無理だった。とかあるんですかね?
それでウェブの方では実際にやっても大丈夫だったけど、自宅の法では実際に無理だったみたいな誤差ですかね。

strictを外すとエラーの行が変わるのは気づいてたのですが、どうも構文チェックがokでてる以上
何をすればいいかわからなくて。
0294nobodyさん2006/06/07(水) 16:41:02ID:???
>>288
僕の個人的かつ大胆な推測によると、
仮に $hash{$key} の値を配列リファレンスで初期化していたとしてもエラーが出ると思うのだ。

それ、デリファレンスしてねえからな。
02952942006/06/07(水) 16:48:28ID:???
補足:
未初期化なナニをデリファレンスすると、perl はその時点から「そのように」扱ってくれる。
だから >>288 のようなケースでは個別の初期化は不要。いや、してもいいけどさ。
0296nobodyさん2006/06/07(水) 17:09:37ID:???
>>294
その通りだw
0297nobodyさん2006/06/07(水) 17:10:08ID:???
>>293
何か値が入るとあなたが仮定している変数が、どこかで undef ってると思われます。
それぞれのタイミングで各変数の値が期待通りになっているかチェックしましょう。。

-c スイッチの syntax OK は 「perl によって曖昧さなくパースできますよ。一応ね」 という意味なので、セマンティクス上のバグは見つけてくれません。
代わりに -wc を使うようにすると警告も併せて示してくれます。
0298nobodyさん2006/06/07(水) 17:15:43ID:???
てかこれ、他人のサーバにエラーログを延々と残す迷惑な奴の典型例だな。
02992892006/06/07(水) 17:20:02ID:4ldG4rWr
>>297
ありがとうございます。
-wcやってみます。

とりあえずsubstrのあの記述を抜いて、strictを外すと表示ができるようになりました。
今はstrictでない部分を探してます。

ところでもしかして、5.8.1と5.8.8では何か違うんですかね。そう思えてならないです。
5.8.1が手に入ればわかりやすいですが。
0300nobodyさん2006/06/07(水) 17:48:23ID:???
末尾以外の改行(特定の文字列でも良いんですが)を取るにはどうすれば良いですか?
$text =~ s/\r\n\w//g;
とかだと、直後の1文字も消えてしまうし・・・ヒント下さい。
0301nobodyさん2006/06/07(水) 17:52:35ID:???
>>299
perl58[2-8]delta に変更点が書いてある。
http://search.cpan.org/~nwclark/perl-5.8.8/

>>300
s/\n(?!$)//g;
ついでに http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
03023002006/06/07(水) 18:01:42ID:???
>>301
ありがとうございます!
$が末尾、!$が末尾じゃない、ってことで?が条件文として働いてるってことですかね。

改行コードって実は結構複雑だったんですね。参考にします。
みなさんデータの読み込みのときに毎回コードの変換して・・・
って、書き込みの段階で変換してれば読み込みのときには必要ないのか・・・。
0303nobodyさん2006/06/07(水) 18:11:06ID:???
>>293
perldiagによると、左辺値コンテキストの時にエラーが出るとあるけど、
そこらへんは大丈夫?
0304nobodyさん2006/06/07(水) 18:26:26ID:???
>>302
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlretut.html#looking_ahead_and_looking_behind
0305nobodyさん2006/06/07(水) 18:30:05ID:???
配列の任意の位置の要素を削除したり追加したりする簡単な方法ってありますか?

[例]
@number = (1,2,3,4,5,6,7,8,9,10);

@number = (1,2,3,5,6,7,8,9,10);4番目の要素を削除
としたり、
@number = (1,2,A,3,4,5,6,7,8,9,10);3番目に要素を追加
としたり。
0306nobodyさん2006/06/07(水) 18:35:35ID:???
splice
ぐぐれって・・・
0307nobodyさん2006/06/07(水) 18:41:37ID:???
>>306
すみません。
超初歩的な質問だったようですね。
0308nobodyさん2006/06/07(水) 21:34:12ID:???
http://d.hatena.ne.jp/palmo/20060606/grep
ここの最後の疑問を読んで、確かにそうだなぁと思ったので、こちらで質問させてください。

grepやmapの第一引数にEXPRを指定すると、何度も評価されますよね?
でも、普通に考えたらgrepやmapが実行される前に評価されてしまうのではないでしょうか。
この遅延評価はgrepやmapだけ特別なんでしょうか。
BLOCKを渡すと遅延評価される、というのは納得できますが…。

同じような事がforやwhileなどにも言えますけど、あちらは構文ですよね。
0309nobodyさん2006/06/07(水) 22:43:06ID:???
ん? よくわからんけど

/e$/ は $_ =~ /e$/の略で、普通は

my @e_fruits = grep $_ =~ /e$/, @fruits;
ではなく
my @e_fruits = grep /e$/, @fruits;
って書くと思う。これ関係ない?

ちなみにgrepもmapもforのような書き方もできるぞ。
0310nobodyさん2006/06/07(水) 22:55:49ID:???
>>308
grep は最初の引数(あるいは間接オブジェクトスロット)にコードリファレンスを取る。
それは後続の引数をリスト展開して得られた最初の要素から順に $_ にセットして繰返し呼び出される。

ユーザサブルーチンのプロトタイプで言うと (&@) ね。完全に同一じゃないけれど。

>>309
grep や map を連結できるのは、それぞれが返した値を前の関数に引数として渡しているから。だから両者は全く別物。
for(each), while, if などの修飾子は引数として渡されているわけではなく、スコープを生じるブロックを持たないだけでそれぞれが元来の制御構造であることに変わりがないので。
03113082006/06/07(水) 23:03:22ID:???
>>309
わかりづらくてすいません。
例えば

$_ = 10;
my @r = map $_ * 2, (1..5);
print "@r";

と書いた時に、@r の中身は (10, 10, 10, 10, 10) じゃなくて (2, 4, 6, 8, 10) とできるのは
なぜなんでしょう?
03123082006/06/07(水) 23:06:03ID:???
リロードしてませんでした orz

>>310
ありがとうございます。スッキリしました。プロトタイプの仕業でしたか。
てことは、EXPRの場合もBLOCKの場合も、結局コードリファレンスとして渡されるわけですね。
0313nobodyさん2006/06/07(水) 23:42:47ID:???
ぐえー、難しすぎて意味がわからん。
使う分にはそこまでわからなくても問題ないけど。
0314nobodyさん2006/06/08(木) 00:11:28ID:???
>>313
思考停止はもったいないよ(´・ω・)
意味がわからなければ調べたり質問したりすればいいのに。
0315nobodyさん2006/06/08(木) 00:16:48ID:???
プロトタイプでブロックとるgrepは書けるけど式の方はできないから
やっぱり組み込み関数なのでズルしてると思ったほうがいいね。
03163082006/06/08(木) 00:33:23ID:???
>>315
そうみたいですね…。試しに map を (&@) で実装してみました。
やはり式やブロックだけでは渡せず、無名関数を作ってコードリファレンスを渡さなきゃダメみたいです。
先ほどのブログにコメント付けてきちゃいましたorz 訂正してこなきゃ・・・

sub mymap(&@) {
  my $code_ref = shift;
  my @new_list = ();
  for(@_) { push @new_list, $code_ref->(); }
  return @new_list;
}

$_ = 5;

# @r = mymap $_ * 2, (1..5);            # NG
# @r = mymap { $_ * 2 }, (1..5);        # NG
@r = mymap sub { $_ * 2 }, (1..5);      # OK

print "@r";
0317nobodyさん2006/06/08(木) 00:40:21ID:???
>>316
> やはり式やブロックだけでは渡せず、無名関数を作ってコードリファレンスを渡さなきゃダメみたいです。
おいおい。呼び出し方が間違ってるだけだよ。

× @r = mymap { $_ * 2 }, (1..5); # NG
○ @r = mymap { $_ * 2 } (1..5); # OK
03183082006/06/08(木) 00:44:04ID:???
うわ・・・orz お恥ずかしい。
という事は、式の場合だけは裏でトリックが使われてる、て事でいいのでしょうか…
0319nobodyさん2006/06/08(木) 01:04:38ID:???
>311
別に難しく考えなくても、変数のスコープが違うだけじゃん。
$_ = 10;
print map $_ * 2, (1..5);
print $_ * 2 for(1..5);
print $_;
03203082006/06/08(木) 01:20:55ID:???
>>319
「スコープが違う」というのはわかるのですが、
「なぜgrepやmapの引数に書いた時だけスコープが違うのか」がわかりませんでした。

特別な構文もなしに書いた「$_ * 2」が、mapを呼び出す時点でなぜ「20」と評価されずに
「$_ * 2」という式そのものとして渡せるのかが不思議でした。

紛らわしい書き方ですいません。質問するのは難しいですね……。
長くなってしまいました。皆様お答え頂きありがとうございました。
0321nobodyさん2006/06/08(木) 01:29:33ID:???
少なくとも初心者質問スレ向けの質問ではないなw
03222392006/06/08(木) 01:58:38ID:???
ども、昨晩お世話になった者です。

あの後も、動作確認ができたプログラムを自分の作ったページに組み込んでみるとやっぱり動かない。
試行錯誤の末、サブルーチン名に予約語を使っていたことが分かりました。
で、ようやくさっき、思い通りのページが作れました。

ということで、とことん勉強不足を痛感したわけですが、
ここでのアドバイスがあってなんとかなったもので、一言だけお礼を言いに。
特に>>251氏。ありがとうございました。
他の皆さんも参考になりました。ありがとうです。

またトラブったら泣きつきにくるかもしれませんが、その時はその時でまたよろしくです。
0323nobodyさんNGNG
$obj->func のfunc部分を変数$val='func' を使って実行できるようにしたいと
思っているのですが、eval使うぐらいしか方法はないでしょうか?
0324nobodyさん2006/06/08(木) 07:39:13ID:???
掲示板プログラムを作成しているのですが、
書き込んだり削除したりした後に、掲示板表示画面に戻ってきた際に
キャッシュされた以前の状態の画面が表示されてしまいます。
ブラウザに更新を知らせるにはどのようにするのがよいのでしょうか?
0325nobodyさん2006/06/08(木) 08:28:37ID:???
>>323
my $func = $obj->can($val) and $obj->$func();

いきなり$obj->$val()で動かなかったっけ?
0326nobodyさん2006/06/08(木) 15:06:05ID:iBH9Xn1C
新しくプログラムを作ってみるのに以下をインストールしました。
apache1.3.35 activeperl5.8.8 mysql4.0.26

DBIを使うのにppmでモジュールをインストールしました。
DBIとDBD-mysqlです。

そうしたらどうも
$sth->fetchrow_hashrefがstrict環境下ではエラーになってしまいます。
ハッシュリファレンスの値がありませんとのこと。

以前デスクトップで作ってた環境をノートパソコンに写したのですが、
モジュールのインストールが十分か不安ですが、思い出せません。

確かdata-dumperとdbiとmsql-mysql-moduluesという3つが欲しかったのですが、
ppmで見つからなかったので他のサイトで薦められてたDBD-mysqlとDBIにした覚えが
あります。というあやふやな記憶で今回もその二つを入れたのですが、
どうも動作がしませんので間違っていたかもしれません。

この二つの入れる順番などありましたでしょうか?
それとも前者の3つのモジュールを決められた順番でいれないとfetchrowが使えませんでしょうか。

アドバイス宜しくお願いします。
03273262006/06/08(木) 15:08:17ID:iBH9Xn1C
すみません。winXPにて上記をやっています。
失礼しました。
0328nobodyさん2006/06/08(木) 15:20:30ID:???
data-dumper は Data-Dumper-Simple じゃなくて?
0329nobodyさん2006/06/08(木) 15:21:25ID:???
その他のモジュールはWindowsへは対応が遅れてるとかかも
というのも、以前Encodeモジュールでエラーがあり調べてたらWinとLinux環境とでバージョンの違いが酷かったので・・・
03303262006/06/08(木) 15:33:20ID:iBH9Xn1C
>>328
http://www.rfs.jp/server/mysql/01/07.html
ここを見てperlを勉強していて、(結構前の話ですが)それでDBIもここで勉強しました。

Data-Dumper-Simpleというモジュールは過去に入れた覚えがないのですよね。
過去作っていた環境なら問題なく動いたコードなんです。

fetchrow_heshref以外は問題なく動作してるのでDBIのモジュールのインストール自体は
できてると思うんです。
さっき試しに一旦ppm unsitallしてから先にDBD-Mysqlを入れたら自動でDBIを
先にインストールされました。

モジュールのバージョンがかわってfetchrow_hashrefがダメになったのですかね。
なんでしょうか。とりあえずData-Dumper-Simpleも入れてみますね。

あ、それとstirctを外すと何故かfetchrow_hashrefは動作します。
なんですかねこの症状。
>>329
そうでしたか。
でも過去動作していたコードと考えると逆にバージョンがアップしたせいなのかもしれませんが。
0331nobodyさん2006/06/08(木) 15:41:28ID:???
formの要素に配列は使用出来るのでしょか?

たとえば
<input type="text" name="test[0]">
<input type="text" name="test[2]">
<input type="text" name="test[3]">
というフォームデータを以下のように受け取ろうと考えて
いますが上手く行きません。
use CGI;
$query = new CGI;
@test = $query->param('test');
どなたかご教授お願い致します。
03323262006/06/08(木) 15:43:30ID:iBH9Xn1C
Data-Dumper-Simpleいれてみました。
特にかわりありません。
やはりstrict環境下では$sth->fetchrow_hashrefが不正扱いされるようです。
■ このスレッドは過去ログ倉庫に格納されています