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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/11/27 11:35:03ID:DJwiGeFM
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0653nobodyさん05/01/08 07:34:20ID:???
変数を宣言すると、名前と実体が確保される。
実体は参照カウンタ型ガーベッジコレクション付きのメモリに確保される。
実体は参照されている数がカウントされていて、カウントが0に(誰も参照していなく)なると破棄される。

変数がサブルーチンから抜けるなどでスコープから外れると、
変数の名前が破棄されて、参照カウント値が一つ減らされる。
しかし、リファレンスによって参照されている限りカウントは0にならないから実体は破棄されない。
(ここでのリファレンスはシンボリックではない、ハードリファレンスのこと)

C,C++の(一般的な実装の)ローカル変数のようにスタック上にメモリを確保する訳じゃないから、
こんな芸当ができる。
0654nobodyさん05/01/08 07:35:17ID:???
Perlの変数には注目度というものがあります。
誰かに注目されている限り神様が生かしてくれます。
友達のお婆ちゃんはこれが原因で亡くなりました。
0655nobodyさん05/01/08 09:37:13ID:???
いつの間にかリファレンスの話になってるけど、
この辺は「初めてのPerl」読めばすっきりすると思う。

クロージャとかも混乱しやすいね。
0656nobodyさん05/01/08 13:05:23ID:???
下記の2パターンのような文字列から値だけを取得したい場合どうすればいいのでしょうか?
split(/\s/);を使ってスペースで区切ると"と"の間のスペースでも、区切られてしまいます。。。
,で区切る場合は、realmで,が現れるとそこでくぎられてしまいます。
また、スペースがない場合はrealmは"と"で区切られないこともあるかもです。

誰か助けてください。。。

パターン
Basic realm="Secret Zone"
Digest realm="Secret Zone", nonce="RMH1usDrAwA=6dc290ea3304de42a7347e0a94089ff5912ce0de",
algorithm=MD5, qop="auth"

取り出したい値
$type = Basic 又は Digest;
$realm = Secret Zone;
以下$type=Digestの場合のみ。BasicのときはNull。
$nonce = RMH1usDrAwA=6dc290ea3304de42a7347e0a94089ff5912ce0de;
$algorithm=MD5;
$qop=auth;
0657nobodyさん05/01/08 13:25:08ID:???
要点を絞れよ
言ってることがよく分からん
0658nobodyさん05/01/08 14:09:43ID:???
1つ質問させて下さい。Perl初心者です。
ファイルの中身が「abcCLEてすと」である文章をopenして、

$text = "abcCLEてすと" 

とし、これから「abc」を削除しようと思って

$text =~ s/a|b|c//g;
print "結果:$text\n";

として、結果を表示すると

「結果:bkEてすと」
と表示されます。
abcは削除されているようですが、他の文字が文字化けしています。
文字化けさせない為には、どうすればいいでしょうか?
065965605/01/08 14:21:24ID:???
ttp://www.studyinghttp.net/rfc_ja/rfc2617.ja#sec2
ttp://www.studyinghttp.net/rfc_ja/rfc2617.ja#sec3.2.1
2種類のWeb認証ヘッダを取得して変数に代入したいということです。

ヘッダから取り出したいのは、
Basic又はDigestなどの第一要素。
認証名を収納しているrealm。
Digestで必要なnonceとalgorithmとqop。
以上の5つです。
0660nobodyさん05/01/08 16:41:21ID:???
>>659
だからよ、そのパターンってのが何に入っているんだ?
配列か?変数か?ハッシュか?
splitとか言ってるってことはもう格納してあるんだろ?
0661nobodyさん05/01/08 16:54:51ID:???
>>656
フォーマットが固定されてるなら、正規表現のパターンマッチで切り出すのが楽だと思う
066265605/01/08 18:35:50ID:???
>>660
splitでやって失敗したので困ってます
,で区切った場合、""で囲まれたところで,が出てきたら大変なことに・・・

>>661
正規表現はちょっと苦手なので、なるべく避けたいと思ってたり・・・
それに、それがすべてではなく、順番なども異なっている鯖もあるかもです
0663nobodyさん05/01/08 18:40:17ID:???
>>662
ハッシュと正規表現使え。
0664656=66205/01/08 18:41:53ID:???
>>663
やっぱり正規表現使うしかないですか・・・
少しだけ正規表現を調べてきます
0665nobodyさん05/01/08 19:56:37ID:???
>>658
$text = "abcCLEてすと";
$text =~ s/a|b|c//g;
print "結果:$text\n";

結果:CLEてすと
化けないよ。
0666nobodyさん05/01/08 20:50:34ID:???
>>664
なんか良く分からんが、絶対使われない(っぽい)<>とかで区切っちゃダメなの?
0667nobodyさん05/01/08 20:53:20ID:???
>>666
君は何を言ってるんだね?
0668nobodyさん05/01/08 20:58:27ID:???
Windowsで、"abcCLEてすと"だと化けるな。(CLEは全角)
0669nobodyさん05/01/08 22:26:26ID:???
なんかよくわからんがひょっとして、SJISでパターンマッチした→化けたよ助けてどらえもーん、
という話か?

それなら「それはきみがわるい」でまとめちゃうぞ
0670nobodyさん05/01/09 01:39:48ID:???
http://www.rescue.ne.jp/study/pack/
画像を文字に変換するというスクリプト(バイナリデータを16進ダンプし、
それをスクリプトに埋め込んで復号)を試してます。
上記のサイトの変換、復号cgiをレンタル鯖(Linux+Apache1.3+Perl 5.008003)に
設置してやると正常に動くのですが、ローカル(Win2k+Apache2+Perl 5.008004)
だと画像が壊れてビットマップがぐちゃぐちゃになってしまいます。
$data = pack('C*',hex($_));
ここらへんに原因があるとしか思えないのですが、、、
Windows+Perlでファイル出力の場合ならbinmodeにしたりするところですが、
こういう場合はどうしたらいいでしょうか。
0671nobodyさん05/01/09 05:52:13ID:???
>>670

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0672nobodyさん 05/01/09 07:33:40ID:???
なにが悪いか解ったけど、質問の方法を考えてもらってからにしよう
0673nobodyさん05/01/09 07:49:51ID:???
binmode(STDIN);
全体像が見えないので勘で答えてみた。
0674nobodyさん 05/01/09 08:04:25ID:???
>>673
当たり。
だけど、質問者に考えてほしかったなぁ
0675nobodyさん 05/01/09 08:13:53ID:???
>>674
でも、当たりじゃないな
0676nobodyさん05/01/09 08:24:21ID:???
驕
0677nobodyさん05/01/09 12:43:15ID:???
つか、CGIレスキューなんだろ?
0678nobodyさん05/01/09 13:11:09ID:???
>>659
> 2種類のWeb認証ヘッダを取得して変数に代入したいということです。
ここで言ってる「Web認証ヘッダ」とはクライアントからサーバに送られるAuthorizationヘッダの事か?
このヘッダはセキュリティ上の理由でCGIには渡されないと言う事を知っているか?
067967005/01/09 14:17:11ID:???
>>672-677
レスありがとうございます。わかりにくくてすみませんでした。
1: 16進ダンプされた数値を画像に変換したい。
2: ttp://www.rescue.ne.jp/study/pack/ 変換 復号cgiをそのまま実行。
  レンタルサーバーでは全く問題がなかった。
3: 自宅サーバーで画像が化けた。
binmode(STDIN);入れてもダメでした。
ttp://para-site.net/up/data/1032.zip
↑正常な画像,壊れた画像,使用したソースです。
068067005/01/09 14:32:59ID:???
すみません。解決しました。
やはりbinmode(STDOUT);でした。
IEのキャッシュを消してリロードしたら表示されました。(^-^;)
0681nobodyさん05/01/09 14:35:38ID:???
>>680
自力解決乙。

ちなみにその二つの画像ファイルをバイナリエディタで見比べてみると
0xBC の 0A F6 F4 の部分が壊れた画像では 0D 0A F6 F4 となっている。
これくらい自力で調べられるようにしておくといいかも。
0682nobodyさん05/01/09 15:13:59ID:???
>>658
Perlバージョンが分からないから、とりあえず。

use encoding "shiftjis";

$text = "abcCLEてすと";
$text =~ s/a|b|c//g;
print "結果:$text\n";
068365905/01/11 22:55:58ID:???
>>678
> ここで言ってる「Web認証ヘッダ」とはクライアントからサーバに送られるAuthorizationヘッダの事か?
サーバーからの要求のほうです。

> このヘッダはセキュリティ上の理由でCGIには渡されないと言う事を知っているか?
もちろん知っています。モジュールを使えば取得できることも知っています。
今回は、CGIにブラウザから渡って来るのではなく、Socketで取得してますのでこの点は関係ありません。
0684nobodyさん05/01/12 00:36:54ID:???
配列の中で重複する要素の番号を返すプログラムを考えているのですが、
どうやるとスマートに出来ますか?

一応自分で考えてみたのは

my @number = ();
my $dummy_count = 0;
foreach my $dummy (@array){
my $dummy2_count = 0;
foreach my $dummy2 (@array){
if($dummmy1_count != $dummy2_count){
if($dummy1 eq $dummy2){

ここでさらに$dummy1_count と$dummy2_count が@numberにあるかどうか
    をみて、ない場合にそれぞれ追加

}
}
$dummy2_count++;
}
$dummy1_count++;
}

ってな感じの初心者丸出しコードなんですが(汗 見難いですね・・・。
結果としては上手く出来たのですが、もっと良いコードの書き方があるかと。。。
いかがなもんでしょうか?
068568405/01/12 00:38:26ID:???
Σ(゚Д゚;エーッ!  
半角スペース使ったせいで死。。すいません
0686nobodyさん05/01/12 00:44:21ID:???
Σ(゚Д゚;エーッ!
0687nobodyさん05/01/12 01:23:28ID:???
>>684
my @list = qw/test1 test2 test3 test4 test5 test2 test6 test7/;

my %count;
@_list = grep $count{$list[$_]}++, 0 .. $#list;

print @_list;
0688nobodyさん05/01/12 01:33:22ID:???
>>687
それだと5しかでないけど、欲しい結果は1,5なんじゃない?

私ならこうする。

my %count;

foreach (0..$#array) {
push @{$count{$array[$_]}}, $_;
}

my @number = map @$_, grep @$_ >= 2, values %count;
0689nobodyさん05/01/12 02:00:22ID:???
すみません初心者の質問なんですけど、ご教授ください

連想配列の要素の数はどうやってもとめればいいんですか?
0690nobodyさん05/01/12 02:04:48ID:???
>>689
そういう関数があるので調べてください
0691nobodyさん05/01/12 02:04:54ID:???
>>688
そうだったんか。俺ならこう。

my @list = qw/test1 test2 test3 test4 test5 test2 test6 test7/;

my %count;
$count{$_}++ for @list;
my @_list = grep $count{$list[$_]} >= 2, 0 .. $#list;

print @_list;
069268405/01/12 02:23:19ID:???
>>687さん >>688さん
レス有難うございます。

>>688さんの仰るように、例でいくと1, 5が欲しかったです。
それで、今>>688さんのコードを試して見たのですが・・・・・。
あっさりすぎるほどに求めていた答えがでました。私が書いた50行がたったのコレだけで
出来てしまうんですね(汗 悲しい部分もありますが、すごく感動ですね。
本当にありがとうございますm(_ _)m

ですが・・・・コードがまだ理解出来ないのがイタイです(笑
もし>>688さんに少しお時間ありましたら、ほんとにさわりだけでもいいのでコード解説とか
お願いできませんか? 解説頂いても理解出来ないかもしれませんが、人のコード使っておいて
まったく何やってるか分からないってのも困りますし、自分のためにならないぽいので。。。。
こちらはお聞きすることしか出来ませんが、もし余裕があればお願いします。

>>677さんのコードも試してみました。
こちらも重複する項目の番号が返ってきました。
こちらの説明が足らなかったので申し訳なかったです。けどパッと書けてしまうみなさんは
すごいですね。私もまだまだ頑張らないと。

>>687さん >>688さん、本当にありがとうございました
0693nobodyさん05/01/12 09:12:09ID:SoBMVf5u
携帯用の非会員制ネットショップをPerlで構築してる途中です。(最後にmysqlに突っ込む形式)
携帯はキャリアごとに画像形式などが違うので完全にCGIで作っています。

PCサイトは既に作ってあり運営中なので、簡単だろうなと思ってとりあえず
見た目はある程度できました。

が、携帯はcookieが使えないとこのことorz
PCサイトではcookieに注文内容を詰め込んでいたので、ちょっと困っています。

今はURIの?以降にページIDを使ってページの移動をしてます。
今考えているのは
http://www.2ch.net/?page=index&商品番号=数量&商品番号2=数量2
等の形式で常にリンクURLの後ろに注文内容を保持していく方法です。
getの制限である255byteはそうそう超えないんで大丈夫だと思いますが・・・・

?page=index&ユニークID のようにIDを発行して注文内容はサーバ側で
管理してIDマッチングでセッションするならばバイト数なんて気になりませんが、
現状の私のスキルでは少し時間がかかりそうです^^;

もっと賢いやり方があるなら教えてくださいm(_ _)m
0694nobodyさん05/01/12 10:00:34ID:???
>>693
相手のIPで照合するとセキュリティ的にも最高品質ですよ。
なのでサーバー側にファイルを作るか、MySQLでやるかだけですね。
0695nobodyさん05/01/12 10:32:15ID:???
>>694
post形式でやってれば通常のセッションIDを保持していく方法でもセキュリティに
差はないだろ。
0696nobodyさん05/01/12 10:52:46ID:190vuMua
>693
>http://www.2ch.net/?page=index&商品番号=数量&商品番号2=数量2
>等の形式で常にリンクURLの後ろに注文内容を保持していく方法です。
>getの制限である255byteはそうそう超えないんで大丈夫だと思いますが・・・・
どう考えても、やめた方がいいだろう。
おれは、携帯の場合、ファイルベースの簡易的なセッションを自作して使ってるけどね。

>PCサイトではcookieに注文内容を詰め込んでいたので
さらにこれも危険。

>694
携帯ってリクエスト毎にIP変わらなかったっけ?
0697nobodyさん05/01/12 11:15:58ID:???
>>690
すみません、調べたのですがわからず質問したんですけど
教えていただけないでしょうか?
0698nobodyさん05/01/12 11:37:34ID:???
>>697

ttp://www.rfs.jp/sitebuilder/perl/02/05.html

配列やハッシュの要素数てのは、その配列やらハッシュやらを扱う上でも基本的な
ことだから、テキストとかにも各分野の最初の方に載ってるのではないかな?
調べ方がちと足りないかも。適当にググれば出てくるヨ☆

偉そうなこと書いてしまったが、こちらも初心者故、共に頑張ろうではありませんか。
069969305/01/12 11:53:12ID:SoBMVf5u
>>694-696
>どう考えても、やめた方がいいだろう。
え;どうしてでしょうか?
漏れるからですか?アクセショップなので注文内容は漏れていいですが・・・
っていうか注文内容が漏れてまずかったらお店で買物なんてできませんよね。

もしかして住所などの個人情報を懸念してるのですか?
それでしたらSSL+POSTでやっていますが。
もう少し自分で調べてみますm(_ _)m

0700nobodyさん05/01/12 12:06:48ID:???
a,b,c
d,e,f
g,h,i

↑のようなテキストファイルがあります。実際は数百行です。これから以下のような配列を作りたいです。

@1行目の配列※名前はaとする2行目からはb,c,d,eとする
$a[0] .. a
$a[1] .. b
$a[2] .. c
$b[0] .. d
のように。
これをループ処理でやりたいんですが、数百の配列に名前を動的に与える方法で悩んでます。
open FH,"text.txt";
@array = /a b c d e f g h i j k ........数百まで/;
$i = 0;
while (<FH>){@$array[$i]??? = split /,/;}
なんかおかしなことに。
0701nobodyさん05/01/12 12:08:44ID:???
↑誤爆ですハッシュで一発でした
0702nobodyさん05/01/12 12:21:20ID:???
>>701
せっかく問題を提起したのだから、解決コードも書いて置くと後学の為になるし、
コードに改善点があれば誰かが指摘してくれるよ。
070369305/01/12 14:07:08ID:SoBMVf5u
問題に気付きましたorz
URLに注文内容を圧縮して持たせる場合常にURl自体に注文内容が含まれてるので
購入中にトップページにブックマークした場合、いつ来てもブクマしたときの
注文内容が残ってしまいますね・・・

しかしURLにセッションIDを持たせたとしても同じことがおきますよね。
もちろんサーバ側のファイルを最終アクセスから2時間たったものは消していけば
いいですけど、古いセッションID付でブクマされると何か嫌ですよね。

みなさんはどうやって古いID付でブクマークされるのを防いでるのですか?
0704nobodyさん05/01/12 14:49:15ID:???
>>693
スレ違い

△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
0705nobodyさん05/01/12 17:26:29ID:???
>>703
全部のリンクをPOSTにして、hiddenフィールドでデータの受け渡ししたら?

俺だったらセッション管理するけど。
0706nobodyさん05/01/12 19:39:08ID:iuHcyFLg
URLエンコードについてお願いします。
持っているPerlの本のURLエンコードについての説明のところには、
「-」「@」「*」「.」「_」はエンコードされないと書いてあって、
エンコードのサブルーチンは

sub UrlEncode {
local($str) = @_;
$str =~ s/([^ 0-9a-zA-Z\-@\*\._])/sprintf("%%%02X", ord($1))/eg;
$str =~ s/ /+/g;
return $str;
}

…と書いてあります。

ところが別のページや他サイトでは、上のコードの3行目のところが

$str = ~s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;

となっているようです。
どちらのコードにすればいいんでしょうか?
後者の方では、\W=[^_0-9a-zA-Z]だから記号もエンコードしてしまうのではと
思うんですが…。
よく分かってなくてすいません。よろしくお願いします。
0707nobodyさん05/01/12 20:12:34ID:???
>693
最初にアクセスしたtimeでも引っ張って一時保存ファイルでも作れば?
そっちに注文内容とか入れ込んで、一時保存ファイルの作成時間が一時間以上前のものなら消すとか

>696
>携帯ってリクエスト毎にIP変わらなかったっけ?
DoCoMoは変わる、auは変わらない、Vodaはシラネ
0708nobodyさん05/01/12 20:25:41ID:???
>>706
前者が正しいが、区別せずにデコードする事が多い(例外は見たことない)ので問題無い。
0709nobodyさん05/01/12 20:28:34ID:???
>>706
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
これはエスケープする。

unreserved = alphanum | mark
mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
これはエスケープしなくてもいい。しても構わない。

http://www.ietf.org/rfc/rfc2396.txt
071070605/01/12 20:57:40ID:???
>>708>>709
分かりました。ありがとうございました。
0711だめだめ君05/01/13 02:40:25ID:???
Perl使ってDBから読み込んだものを表示するプログラムを作っているのですが、「弊社」が「弊ミ」と文字化けしてしまいます。
日本語文字コードらへんで何か変わった問題とかあるんでしょうか・・・。どう対処すればいいのか分かりません…
宜しくお願いします。
0712nobodyさん05/01/13 06:44:36ID:???
>>711
DBへ格納している文字の文字コードは?
そのプログラムソースの文字コードは?

恐らく、その両者の文字コードが一致していないと思います。
071369305/01/13 09:14:06ID:mOXqnzCM
>>704
スレ違いなのですか?
Perl特有の解決方法などがあると思いましたが、全言語共通なんですか?
とりあえず誘導ありがとうございますm(_ _)m

>>705
postでやるのは考えましたが、テキストリンクぽく見せるのが不可能ですよね。
ボタンやセレクトボックスになってしまうと違和感があるので・・・
0714nobodyさん05/01/13 09:41:39ID:???
cookieもCGIセッション管理も、perlに限った話ではない。
よってスレ違い。
0715nobodyさん05/01/13 09:44:55ID:???
そもそもここコーディングスレだし
0716だめだめ君05/01/13 12:18:38ID:???
>>712さん
ありがとうございます。表示以外は全部EUCです。
ただ、文字コードの違いだったらもっと激しく全部文字化けすると思うんですが、一部の文字なんです。
他の件でPHP使ってるときにも¥が入るとかそういうのがバックスラッシュのエスケープとかであったので、
それと似たものなのかなぁと色々検索したんですが、、、、それっぽいのも見つからず…。
どうしたもんでしょうか…
0717nobodyさん05/01/13 12:36:37ID:???
>>716

わたしとしては「弊社」より「弊ミ」のほうが面白いからOKかと。。
0718nobodyさん05/01/13 13:55:13ID:???
>>716
Shift_JIS の「社」は \x8E\xD0 。
EUC-JP の「ミ」も \x8E\xD0 。
0719nobodyさん05/01/13 14:25:30ID:F0U77FE9
Encode::from_to
でcp932からutf8へ変換を行っているのですが、そのあと、
文字化けを起こしている(マッピングに失敗した)文字を?とか★とかに変換
したいのですが、どのように行えばいいのでしょうか?

ごくごくまれに外字と思われるものがあるのです。
一旦dbに入れてcsvとかで出す時にそのたった1文字のためにそれ以降全部バケちゃうことがあるのです(泣)
0720nobodyさん05/01/13 15:45:13ID:???
ヒアドキュメント内でモジュールのメソッドを呼ぶ時はどうやればいいですか?
メソッドが返す値はただの数字です。
0721nobodyさん05/01/13 15:55:36ID:???
ヒアドキュメント内じゃないといけないのか
0722nobodyさん05/01/13 15:57:40ID:???
先に計算すればいいだろ.
0723nobodyさん05/01/13 15:58:29ID:???
Winの環境でタイムアウト処理はできますか?
0724nobodyさん05/01/13 15:59:37ID:???
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0725nobodyさん05/01/13 16:05:37ID:???
#use strictはしています。
コマンドプロンプトからPerl -cでぷろぐらむのチェックをしたら
syntax okが出るにも関わらずlocalhostからブラウザでやってみると
500エラーが出るのは何故でしょうか?

こういうときはどうやってデバッグすればいんでしょうか?
何が悪いのか検討がつかずに困っています。
072672005/01/13 16:06:32ID:???
>>721-722
たしかできたはずですが久しぶりなので思い出せないのです。
一旦リファレンスにするような感じだったと思うのですが^^;
0727nobodyさん05/01/13 16:11:17ID:???
>>726
できねえよボケ
072872505/01/13 16:16:56ID:???
できましたm(_ _)m
cgi::sessionのコンスラクタ呼び出しの際に3つ目の引数にカーリーブレス?を付けておくのを
忘れてました。

しかし今回は運良く早期発見できましたが、こういうときにいいデバッグ方法あrましたら
教えてください。
0729nobodyさん05/01/13 16:19:39ID:???
エラーログを見る
0730nobodyさん05/01/13 16:29:04ID:???
>>726
print <<EOF;
1 + 2 = @{[ 1 + 2 ]}
EOF
0731nobodyさん05/01/13 16:34:24ID:???
>>730
( ゚д゚)
0732nobodyさん05/01/13 20:18:35ID:???
>>728
http://pc5.2ch.net/test/read.cgi/php/1104624784/2
0733nobodyさん05/01/13 20:24:29ID:???
>>716
Shift_JISなら分からなくも無いけど…。
Shift_JISの「ミ」も\xD0。
# またはDBの最新バージョンで人柱状態?

>>719
0xF040から0xF9FCの外字なら、予めチェックするしかないかも。

>>731
?
0734nobodyさん05/01/13 21:16:56ID:???
全文検索のスクリプトに、5件毎や10件毎表示させる機能をつけたいのですが
うまくいきません

sub search1 {
local($dir) = $_[0];
local(@filelist, $file, $filename);
opendir(DIR, $dir);
@filelist = readdir(DIR);
closedir(DIR);
$begin = $FORM{'page'} * $hyouji;
$end = $bigin + $hyouji;
if($end > @filelist) {
$end = @filelist;
}
(続く)
073573405/01/13 21:17:55ID:???
(続き)

#foreach $file (@filelist) {
for ($a = $bigin; $a < $end; ++$a) {
if ($file eq ".") { next; }
if ($file eq "..") { next; }
$filename = "$dir/$file";
if (-d $filename) {
if ($recursive_flag) {
&search1($filename);
}
} else {
&search2($filename, $dir);
}
}
if ($end < @filelist) {
$nextpage = $FORM{'page'} + 1;
print "<a href=\"$ENV{'SCRIPT_NAME'}?page=$nextpage\">次へ</a>\n";
}

#}
}
073673405/01/13 21:19:50ID:???
実行結果は1件もHITしなくなりました
動作も正常に動いてはいないようです
どなたか知恵を貸してください
よろしくお願いします
0737nobodyさん05/01/13 21:27:49ID:RpTwbNys
単純なスペルミスじゃねーのかい?
$begin
$bigin

use strict
を使う癖をつけましょう。
073873405/01/13 21:57:15ID:???
>737
ご指摘ありがとうございます
うっかりミスです

しかし直しても動作は変わりありません
構文自体が悪いのでしょうか?
頭がテンパってきました
助けてください…
0739nobodyさん05/01/13 22:01:32ID:RpTwbNys
>>738
もうちっと、ソースを整理して晒しておくれ。
search2というのが何なのかも分からないし・・・。
074073405/01/13 22:21:11ID:???
>739
すみません、インデントつけます
sub search1 {
  local($dir) = $_[0];
  local(@filelist, $file, $filename);
  opendir(DIR, $dir);
  @filelist = readdir(DIR);
  closedir(DIR);
  $begin = $FORM{'page'} * $hyouji;
  $end = $bigin + $hyouji;
  if($end > @filelist) {
    $end = @filelist;
  }

(続く)
074173405/01/13 22:23:11ID:???
    #foreach $file (@filelist) {
    for ($a = $bigin; $a < $end; ++$a) {
    if ($file eq ".") { next; }
    if ($file eq "..") { next; }
    $filename = "$dir/$file";
    if (-d $filename) {
      if ($recursive_flag) {
        &search1($filename);
      }
    } else {
    &search2($filename, $dir);
    }
  }
  if ($end < @filelist) {
  $nextpage = $FORM{'page'} + 1;
  print "<a href=\"$ENV{'SCRIPT_NAME'}?page=$nextpage\">次へ</a>\n";
  }

# }
}
074273405/01/13 22:29:34ID:???
と○ほさんのWwwsearchをもとにしています
#foreachは最初からあったやつで、コメントアウトしています
&search2はソース長いので説明すると
ループさせてファイルの中身を一文字ずつ検索させてるようです

>740の
  $begin = $FORM{'page'} * $hyouji;
  $end = $bigin + $hyouji;
  if($end > @filelist) {
    $end = @filelist;
  }
この部分と
>741の
  if ($end < @filelist) {
  $nextpage = $FORM{'page'} + 1;
  print "<a href=\"$ENV{'SCRIPT_NAME'}?page=$nextpage\">次へ</a>\n";
  }
が自分で付け足した所です
0743nobodyさん05/01/14 01:17:04ID:???
もうコーディングをいうより改造の相談だろ。
別スレでやってくれ。

★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc5.2ch.net/test/read.cgi/php/1077525387/ 79にテンプレあり
0744nobodyさん05/01/14 07:32:45ID:3YybYM3/
$hoge=1.4*325;
とやると$hogeは455になるのに、
$hoge=int(1.4*325);
とやると$hogeは454になってしまいます。
他の数字でも起こるようです。何故ですか?
というか、意図した通りにさせる方法はありますでしょうか。
074572005/01/14 08:13:20ID:???
>>730
ありがとうございます。
全然誰も答えないからこのスレ、レベルが下がったのかとおもいました;
数スレ前では自分で誰かに回答してあげた覚えもあるんですが、最近の過去ログは
普通の人は見れないようで。

>>all
お前らもっと精進しろよ、な。
0746nobodyさん05/01/14 09:27:13ID:AgX5dpSc
my $a = "a*b*c*d";

異なる意味をもつ字を*で連結した上の文字列の中から1字を消して連結用のアスタリスクの数も
正常にする。

ということがしたい場合どういうみんなコーディングする?aとdでは処理が変わるんだよね。
しかしそれをなるべく簡潔にしたい。
0747nobodyさん05/01/14 09:31:58ID:???
>>744
慣れていないと面食らうがほとんどのプログラミング言語ではそれが標準仕様。
詳しい説明は「浮動小数点数」「精度」などで検索すれ。

防ぐ方法は幾つかある。まぁこのケースなら1が無難かな。

1. 整数同士の演算にする: 1.4*10*325 (1.4*325*10ではうまくいかないことに注意)
2. sprintfで処理する:sprintf '%f', 1.4*325
3. bignumプラグマ: use bignum;print int(1.4*325) (ただし破滅的なほど遅い)
0748nobodyさん05/01/14 09:32:37ID:???
>>746
何がしたいのかさっぱりわからん。
0749nobodyさん05/01/14 09:35:33ID:az2EqpkZ
$hoge1と$hoge2の2つの変数があるとします。
この2つの変数内の文字列を比較していって、先頭から同じ文字が続くところまで$hoge2から削除するにはどうすればいいでしょうか。
たとえば、$hoge1=a/b/c/d/,$hoge2=a/b/c/d/e/f/だったら、$hoge2=e/f/としたいのです。
075074605/01/14 09:37:35ID:AgX5dpSc
一応自分のコーディング(aの場合)
$a =~ s/a[*]?//;
$a =~ s/[*]*$//;
0751nobodyさん05/01/14 10:31:14ID:???
$a =~ s/^$hoge1//;
?
0752nobodyさん05/01/14 10:56:17ID:???
>>750

$a .= '*';
$a =~ s/a\*//;
chop $a;

$aを使うのはお勧めできないがそれは置いておこう。
■ このスレッドは過去ログ倉庫に格納されています