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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2007/02/10(土) 19:21:23ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >>2-10

前スレ http://pc10.2ch.net/test/read.cgi/php/1164519503/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0153nobodyさん2007/02/24(土) 21:51:38ID:Iwese7yM
                    朝鮮中央TV
                                 ∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧
                    ______    < 踏んだら孕んだ!抱いたら揉んだ!
                   /:::::::::::::::::::::::::::::ヽ   < 孕んだ振る降る般若だ!
                  /::::::::::::::::::::::::::::::::::::ヽ  < ティムポ擦る無駄、フン出る春巻きはむ無理!
                  |::"´ ̄ ̄ ̄ ̄ ̄ヽ:::|  <  チン毛ちぎり、看板塗る飛騨!
                  |:::|           |:::|  <  陰毛臭いんだ!モッコリ膨らんだ!
                 ヽ/ -=.、   _,=-  ゾ  <  安打!?半田ゴテ適時打!!
                  | |  -ェゝ ";ュ-   |ヽ  <  原チャリ盗んだ!あんだとこら!?
                  ヽト、  ´i `   ,.イ/  < よくちょん切れるハサミだ!
                  〈  i  /L_、  i 〉   _ノ∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨
               __,. -‐ヘ  -=三=-  /──、
          _ -‐ ''"   /  \     /\    ̄゛ー- 、
         ハ       /   |ヽ ̄ ̄//  ヽ、      ∧
         |  ヽ      く     ! .>ーく /     >      / !
           |   |     _>  ∨-、r‐/   <_     /  !
        ∧   !    ヽ     | 厂L/   ■/      i  .∧
       / \  |     \   ∨  !    /      | / ハ


01541302007/02/24(土) 23:31:04ID:WjAlsxOj
プログラムでutf-8の文字列を読み込みcp932変換する場合、cp932にない文字
は「?」に変換したいと考えてます。
この場合どのようになコーディングをしたらよいでしょうか?


せっかく131の方が答えてくれたんですが、
よくわかりませんでした。。すみません。。。
0155nobodyさん2007/02/25(日) 00:25:19ID:???
ファイルアップロードの際に
$CGI::POST_MAX = 1024*1024;とせずに
ファイルサイズを調べて1MBより大きい場合にはじくのとでは
サーバへの負担が違いますか?
あと、POST_MAXを指定してサイズがオーバーしていた場合に
処理が取り消されたという情報はどこかに入るのでしょうか?
01561552007/02/25(日) 00:29:49ID:???
ごめんなさい。ぐぐったら出てきました。
最初にやってみるべきでした。
スレよごし、すいません。
0157nobodyさん2007/02/25(日) 05:58:13ID:???
ム板ってどのスレにも必ず>>151みたいな奴がいる
0158nobodyさん2007/02/25(日) 06:47:46ID:???
>>157
つ【同一人物】
0159nobodyさん2007/02/25(日) 07:00:21ID:???
初心者スレなのに「剰余演算子」くらいのヒントも書いてやらないのか…
$hoge = 11 ;
$foo = 3 ;
if ( $hoge % $foo == 0 ){
}
0160nobodyさん2007/02/25(日) 07:31:31ID:???
別にいいじゃん。
結局質問には一応だけど答えてるツンデレなんだし。
0161nobodyさん2007/02/25(日) 08:41:45ID:???
そんな低級な話はしてないだろ
>>148をもう一回よく読んでみ
45 % 20 は0じゃないが割り切れると判断するんだぞ
0162nobodyさん2007/02/25(日) 09:25:01ID:???
割り切れないたびに10倍して割り切れるか確認するのか?
0163nobodyさん2007/02/25(日) 09:26:01ID:???
分母を1億倍位にして剰余を見る
0164nobodyさん2007/02/25(日) 09:38:58ID:???
算数大丈夫ですか?
01651482007/02/25(日) 10:16:04ID:k71AVSTb
いろいろ有難うございます。
>>149,159,160
% で解決できるなら助かるのですが(>_<)
質問は理解し易く『 45 / 20 = 2.25 』と書いたつもりだったのですが、
難しかったようで、失礼しました。

>>152
有難うございます。
難しい・・・。もうちょっと勉強します。

>>162,163
有難うございます。10倍しても、1億倍してもどこで諦める瞬間を作らないと
いけないですよね。もしかしたら1億1倍のところで割り切れるかもしれない。

>>161 thank you...
0166nobodyさん2007/02/25(日) 12:45:49ID:???
>>165
> もしかしたら1億1倍のところで割り切れるかもしれない。
( ゚д゚)ポカーン
0167nobodyさん2007/02/25(日) 13:02:07ID:???
割り切れる事と分数で表せる事は違うような。循環小数とか。
0168nobodyさん2007/02/25(日) 13:02:55ID:???
数IIIまで履修していない奴のプログラミングは全面禁止にすべきだな。
0169nobodyさん2007/02/25(日) 13:04:45ID:???
素因数分解とGCD用のモジュールをCPANで拾ってくれば1行で書けそうだ
0170nobodyさん2007/02/25(日) 13:13:05ID:???
危ねw
数IIIは履修してるけど数ABCを履修してねぇww
0171nobodyさん2007/02/25(日) 13:41:55ID:???
有理数で無限小数の場合、必ず循環小数になる事を利用して

use bignum (a => 50);

sub is_terminating($) {
    (my $n = shift) =~ s/0*$//;
    return not ($n =~ /\.\d*(\d+)\1/);
}

for my $i (1..25) {
    my $n = 45 / $i;
    my $s = is_terminating($n) ? "terminating" : "non-terminating";
    print "45/$i is $s.\n";
}

というのはどーお?
01721482007/02/25(日) 14:24:42ID:k71AVSTb
>>171
有難うございます。
なんか出来そうですけど、2323 / 1000 なんて場合にちょっと無理ですね。
でもそうしたら今度は元の数字が循環してるかを調べればいいのかな?

ん?でも2つの値が関連するし...。どうだろ、無理かな?
もうちょっと試してみます。有難うございます。
0173nobodyさん2007/02/25(日) 18:42:00ID:???
理系どころか文系でさえも無い俺は数学はろくにやってないw
やってた頃の成績はやたら良かったけど。
0174nobodyさん2007/02/25(日) 22:31:59ID:???
センター数2B 33点だった\(^o^)/
0175nobodyさん2007/02/26(月) 05:06:09ID:1VnrxNPd
質問です。
レンタル鯖に、欲しいモジュールが入っていないときには
どうすればいいでしょうか。

鯖管理者に要望を投げても無視されて、
「欲しいモジュール」を自力でコーディングするのもカッタルイというときです。

「hogehoge モジュールを CPAN からダウンロードしてインストールするなんて技はアリですか?」

(管理者権限の関係からムリっぽい気が・・・)
0176nobodyさん2007/02/26(月) 05:54:19ID:???
perlまるごと自分が自由になるスペースに入れてそいつを使ってみる
0177nobodyさん2007/02/26(月) 06:41:20ID:???
前世紀のノリで申し訳ないが、requireでなんとかなる方法もあるかもしれない。
Jcode.pm/jcode.plみたいに。
0178nobodyさん2007/02/26(月) 06:52:35ID:???
バイナリが必要でないモジュールならコピーするだけで動くのでは?
0179nobodyさん2007/02/26(月) 08:24:24ID:???
バイナリが必要でもコンパイルさえできれば動くしな。
0180nobodyさん2007/02/26(月) 13:35:52ID:QboTsacU
「a.cgi」内のサブルーチン「first」の処理中に
「b.cgi」内のサブルーチン「second」を実行するにはどうすれば良いでしょうか?
0181nobodyさん2007/02/26(月) 13:44:05ID:???
>>180
悪いことは言わないのでsecondはb.cgiから外に出して別ファイルにして、
a.cgiとb.cgiからuseかrequireするようにしとけ。
0182nobodyさん2007/02/26(月) 14:02:02ID:???
>>181
ありがとうございます。その言に従います。
0183nobodyさん2007/02/26(月) 14:48:32ID:aE2N5fUY
@hoge = ('a','b','c','d','e');
という配列があったとして、例えば3番目の要素を削除して
@hoge = ('a','b','d','e');
とする方法が分かりません。

foreachで特定の要素を「空」にすることはできるんですが
その要素自体を削除するような方法はないでしょうか?
0184nobodyさん2007/02/26(月) 14:59:24ID:???
>>183
つ splice(@hoge,2,1);
01851832007/02/26(月) 15:06:54ID:???
>>184
ズバリな関数があったんですね…勉強不足です。
foreachで「空以外なら」という条件式でゴリ押ししてた現状から抜け出せます。
ありがとうございました。
0186nobodyさん2007/02/26(月) 15:38:34ID:04bnguup
ヘッダを次のように指定してもダウンロードダイアログが出てくれず、
ファイル内容が垂れ流されてきてしまいます。


print "Content-type: application/x-gzip; name=archive.gz";
print "Content-Transfer-Encoding: base64";
print "Content-Disposition: attachment; filename=archive.gz";

ヘッダーの設定が間違ってるようですが、どう直せばいいでしょうか?
よろしくお願いいたします。
0187nobodyさん2007/02/26(月) 15:45:12ID:???
まずヘッダーはいちいち末尾改行が必要
で、ヘッダーの終了部分には連続改行が必要
これ常識ね
0188nobodyさん2007/02/26(月) 15:46:32ID:???
>>187
あ、抜け落ちてるみたいですが
\\n これででるかな(改行)
をつけ、最後のprint には 連続改行をいれております
もうしわけありません
0189nobodyさん2007/02/26(月) 15:47:39ID:???
あやしい・・・
0190nobodyさん2007/02/26(月) 15:51:58ID:???
print "\n";
0191nobodyさん2007/02/26(月) 15:53:52ID:???
普通に出るじゃん・・・
0192nobodyさん2007/02/26(月) 15:54:29ID:04bnguup
ついでに
#mine.type
application/x-gzip gz

#httpd.conf(apache)

AddEncoding x-gzip .gz .tgz ← これいらない?
AddType application/x-gzip .gz .tgz

の設定をしてあります

しかし、 >>186 のヘッダがあるものを呼び出すと

Content-type: application/x-gzip; name=archive.gz
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=archive.gz

・ ハ・Eワスロrc9懲{ュシ姨ヒ`J、ホ�賜籌Rー%Eeeオオオ1(F・畑ヲ、ャP=~,8 ・・・・

というような出力になってしまいます。

0193nobodyさん2007/02/26(月) 15:58:00ID:???
・・・申し訳ありませんorz

ソースを見返したら、先頭に
print "Content-type: text/html\n\n";

の一行が入っていました
大変お騒がせいたしました。
申し訳ありませんでした・・・・
0194nobodyさん2007/02/26(月) 17:18:08ID:???
あるあるww
0195nobodyさん2007/02/27(火) 22:15:55ID:LieiSn0N
すいません、ちょっと質問です。
perl から Windows アプリケーションを制御したいんですが、
そういうモジュールはありませんか?

たとえば、アプリケーションを起動したのち、
Alt-F でファイルメニューを開いて・・・とか、
アプリケーションを perl スクリプトで操作したいのです。

いや、コマンドラインで制御できるとよいのですが、
コマンドラインの引数を解釈してくれないアプリなのです。
0196nobodyさん2007/02/28(水) 01:50:24ID:???
何の引数なら解釈してくれるんだよ・・・
0197nobodyさん2007/02/28(水) 02:21:12ID:???
hoge.exe foo.txt
とかで自動的にfoo.txtを読み込んでくれないよーなアプリってことかな。
0198nobodyさん2007/02/28(水) 06:08:06ID:???
perlスクリプト(*.pls)とwshを使えばできるんじゃね?

そんなことをするなら最初からJScriptやVBScriptでやったほうが楽だけど。
0199nobodyさん2007/02/28(水) 06:32:17ID:wbAOzWAx
$commment 中の(英)単語の出現回数を数えたいです。

中身は aaaaa bbbb ccc ddd adwg
なら、5となります.重複は考えなくもいいです。半角英文字です

どのようにすればよいでしょうか? (*- -)(*_ _)ペコリ
0200nobodyさん2007/02/28(水) 08:41:36ID:???
>>199
\sでスプリット
0201nobodyさん2007/02/28(水) 08:41:36ID:???
$count = 0;
while($comment =~ /([a-z0-9']+)/gi) #英単語数のカウント
{
$count++;
if($count > 10000){last;} #無限ループ対策
}
02021992007/02/28(水) 09:06:30ID:???
(*- -)(*_ _)ペコリ

 最近、乱打無な栄単語を打ち込むスパマーやろうがいまして。。
ありがとうございます
0203nobodyさん2007/02/28(水) 12:37:25ID:???
>>1ぐらい読もうな
0204nobodyさん2007/02/28(水) 12:51:40ID:???
>>202
>>201を使うな。
>>200を使え。
02052002007/02/28(水) 14:36:28ID:???
>>202
日本語、英文字混在ですか
そういうことなら使えないな
0206nobodyさん2007/02/28(水) 15:34:08ID:BEaWUL0P
javascriptを読める(じっこうできる)クローラーをつくりたいです。
今はwgetをひたすら呼んでました。javascriptのページはよめないです。
CPAN探したのですが、LWPってので、できるのかはっきりしませんでした。
0207nobodyさん2007/02/28(水) 15:40:23ID:???
実行できないんじゃなくて、外部jsファイルを読み込めてないのでは?
0208nobodyさん2007/02/28(水) 19:43:20ID:Oefi/gxX
>>196 さん
とりあえず試したところでは、第一引数を「ファイルー開く」の入力としては解釈するようです。
その他のコマンドラインオプションは皆無。
アプリは「英和翻訳ソフト」です。
特殊辞書を使う翻訳なのと、翻訳内容が極秘なんで excite.co.jp 等は使いたくないのです。

>>198
WSH でぐぐった所、これですよ! ありがとうございました。
0209nobodyさん2007/03/01(木) 12:17:01ID:???
リファラの解析などをPerlの勉強でしているのですが、
一部のURLの場合は変換をして表示 という処理を考えてます。

# リファラをindexで調べ含まれる場合は該当サイト名に変換
if (0 <= index($referer,'http://search.yahoo.co.jp/')) { $search = 'Yahoo'; }
elsif (0 <= index($referer,'http://www.google.co.jp/')) { $search = "Google"; }
# 上記以外にもelsifが続く

と上記のような冗長なコードになったのですが、
もっといい方法などありましたら御教示お願いします。
0210nobodyさん2007/03/01(木) 13:02:53ID:???
>>209
あんまり変わらないかもしれないけど・・

my @SEARCH = ('http://search.yahoo.co.jp/<;>Yahoo','http://www.google.co.jp/<;>Google');
map{my($u,$n)=split/<>/;$search = $n if 0 <= index $referer,$u;}@SEARCH;


もっとスマートな方法あるんだろうけど漏れにはこれが限界..
0211nobodyさん2007/03/01(木) 13:13:18ID:???
携帯サイト用に簡易データベースを作成しているんですが、
auで動作不良があるんです。
まずは簡単に状況説明します。

◎検索ページ(フォーム入力後動作)
 →検索条件をフォームで入力後、サブミット
 →検索結果のページが表示されずエラーメッセージが出る
◎表示データを一定数で区切って次ページに行く(フォーム入力後動作)
 →プルダウンで飛ぶ先のページ数を選択後、サブミット
 →ページが表示されずエラーメッセージが出る

エラーメッセージは共通で以下の通りです。
---------------------------------------------
cgi-lib.pl:Unknown Content-type:application/
x-www-form-urlencorded; charset=shift_jis
---------------------------------------------

なんだろう。docomoは何ともないんだけれど。
02122092007/03/01(木) 13:23:34ID:???
>>210
すんませんw 一行プログラミングのように単に短くしたいって意味ではなかったです。

解析部分を関数で別ファイルにする予定なので、
elsif行が続くのは別にいい(しょうがない)と思ってるのですが、
Perl歴が少ないので処理方法自体には問題ないか不安です
0213nobodyさん2007/03/01(木) 13:52:05ID:???
>>211
ttp://sb.xrea.com/archive/index.php/t-10224.html
ぐぐってみるとココでも話題になってるね

cgi-lib.plのソースを見てみたけど、AUの場合環境変数のCONTENT_TYPEが
ちょっと変わっててエラーになるようだから
cgi-lib.plの81行目の

$type eq 'application/x-www-form-urlencoded') {

を、以下に変えるといけるかも・・

$type eq 'application/x-www-form-urlencoded' || $type =~ /application\/x-www-form-urlencorded/) {

もしくは以下

$type eq 'application/x-www-form-urlencoded' || $type =~ /x-www-form-urlencorded/) {


cgi-lib.plはform-urlencodedで処理してるけど、
AUはx-www-form-urlencordedだから一致しなくてエラーになってるんだと思う・・たぶん..
02142112007/03/01(木) 15:30:30ID:???
>>213
ありがとうです! 自分もぐぐってみて、
”cgi-lib.plがエージェントのうちCHARSETに対応していない”とかなんとか、
81行目までは見当を付けられたんですが、具体的な書き換え記述が見あたらなくて参ってました。
まず213さんの書き換えで試してみます。
AU手元にないんで、確認後結果報告に参ります。
0215 ◆TWARamEjuA 2007/03/01(木) 21:29:21ID:????2BP(6811)
>>209
ようするに、HTTP_REFERERに含まれる文字列によって、変数$searchに特定の文字列を代入するって事かしら?

my $search;
my %Exchange_Strings = (
 'yahoo', 'http://search.yahoo.co.jp/',
 'Google', 'http://www.google.co.jp/',
);

for my $hash_key (keys %Exchange_Strings){
 next if index($referer, $Exchange_Strings{$hash_key}) != $[ - 1;
 $search = $hash_key and last;
}
0216nobodyさん2007/03/02(金) 00:28:43ID:???
質問です。
Net::telnetモジュールを利用し、サーバーへTelnet接続し
取得したデータをhtmlで返すCGIをコーディングしています。
telnetログインする側のサーバのレスポンスが遅い為、一度に
複数のコネクションを確立し、接続した全てのサーバへリクエストを
投げて応答を待つシステムを構築したいのですが方法がわかりません。
現在は単一のサーバに対してアクセスを実施し(timeout->120程度)
forループで順次接続しなおす構成になっています。
なにか良い方法があれば是非ご教示下さい。
0217nobodyさん2007/03/02(金) 02:51:40ID:???
fork or thread
0218nobodyさん2007/03/02(金) 11:40:00ID:???
> ◆TWARamEjuA

とりあえず糞トリ目障り
0219nobodyさん2007/03/02(金) 13:00:32ID:???
>>218
目障りなら NG ネームに指定すればいいでしょ
トリップ無しだと NG 指定することができないから、余計目障りだよ?
0220nobodyさん2007/03/02(金) 13:19:36ID:???
もうずっと前から居るから諦めてる
0221nobodyさん2007/03/02(金) 16:33:38ID:ShHoFtwt
半角数字で挟まれた「x(半角エックス)」を「×(かける)」に
変換したいのでですがうまくいきません。
例えば「12x20」を「12×20」にする、といった感じです。
当然ですが、
s/\d+x+\d/\d+×+\d/
では無理でした・・・。
どなたかアドバイスお願いします。
0222nobodyさん2007/03/02(金) 16:36:16ID:???
>>221
カッコ使え。
0223nobodyさん2007/03/02(金) 16:50:46ID:ShHoFtwt
>>222
即レスありがとうございます。
カッコでグループ化したものを呼び出せるんですね。
s/(\d)+x+(\d)/\1×\2/
ということでしょうか。
ただ、これだと
「12x20」が「2×20」になってしまいました。
\dは数字1文字のはずなのになぜ??
0224nobodyさん2007/03/02(金) 17:18:44ID:???
s/(¥d)x(¥d)/$1×$2/
としてないのはなぜ?
0225nobodyさん2007/03/02(金) 17:19:51ID:???
>>223
+の意味を勘違いしてるんじゃない
0226nobodyさん2007/03/02(金) 17:22:59ID:???
(¥d)+はたぶん(¥d+)を意図してるんだろうけど、
前後の数字だけ保存すればいいんだから(¥d)x(¥d)で十分。

xにも+が付いてるあたり、理解が怪しくはある。
02272212007/03/02(金) 17:36:02ID:???
みなさんありがとうございます。
225さん、226さんがご指摘の通り、
「+」の意味を間違えて捉えていました・・・。
自分がやりたかったkとは(\d)x(\d)でした。
224さんの方法でもできました。
正規表現の外で呼び出すことはないので、
s/(\d)x(\d)/\1×\2/
を使おうと思います。

レスを下さった方、親切に教えて下さり本当にありがとうございました。
とても勉強になりました。
0228nobodyさん2007/03/02(金) 18:32:23ID:5GKaYECY
cgiを独学でスタートした初心者ですが、if else の処理方法でつまずいています。
トップページからindex.cgi?lang=ja と index.cgi?lang=en で下記のsub ja と sub enのそれぞれへ移動するようにしたいのですが、どのように処理したらよろしいのでしょうか?

#!/usr/bin/perl
$script = "index.cgi";
################################
#↓の処理の仕方を教えてください。
################################
if ($lang eq "ja") { &ja; }
elsif ($lang eq "en") { &en; }
################################
print "Content-type: text/html; charset=EUC-JP;\n\n";
print <<EOM;
<a href="$script?lang=ja">日本語</a> <a href="$script?lang=en">英語</a>
EOM

#日本語訳
sub ja {
print <<EOM;
日本語訳ページ
EOM
exit; }

#英語訳
sub en {
print <<EOM;
英語訳ページ
EOM
exit; }
0229nobodyさん2007/03/02(金) 18:52:39ID:???
>>228
>>1を読んでちょ

print "Content-type: text/html; charset=EUC-JP;\n\n";
を条件文の前にしてみたらどうかな
0230nobodyさん2007/03/02(金) 19:50:22ID:5GKaYECY
>>228
index.cgiで表示されているリンクをクリックしても、URLがindex.cgi?lang=jaと
なるだけで、下記の
if ($lang eq "ja") { &ja; }
elsif ($lang eq "en") { &en; }
条件式では、sub jaやsub enには移動しない状態です。

index.cgi?lang=enでsub enの内容を表示させるためには、
何が足らないのか、間違っているのかわからない状況です。
0231nobodyさん2007/03/02(金) 19:55:29ID:???
えーっと
フォームの内容はどこかで取得してるのかな?
0232nobodyさん2007/03/02(金) 20:31:35ID:???
$lang eq "ja" ⇒ $ENV{QUERY_STRING}=~/\bja\b/
0233nobodyさん2007/03/02(金) 22:29:38ID:???
「Perlについての質問箱 29箱目」からの移動です。
http://pc11.2ch.net/test/read.cgi/tech/1166708139/

PATH_INFOをHTMLに出力する場合、以下のエスケープ方法で大丈夫でしょうか。
2バイト文字の処理行っていない点が気になるのですが。
$path = $ENV{'PATH_INFO'};
$path =~ tr/+/ /;
$path =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
$print_path = $path;
$print_path =~ s/&/&amp;/g;
$print_path =~ s/>/&gt;/g;
$print_path =~ s/</&lt;/g;
$print_path =~ s/"/&quot;/g;
$print_path =~ s/'/&#39;/g;
print $print_path;
0234nobodyさん2007/03/02(金) 23:07:02ID:???
そもそも $lang に値が入っていない
#!/usr/bin/perl
use strict; use CGI;
my $script = "a.cgi";
my $in = new CGI; my $lang = $in->param('lang'); $lang = 'none' if (($lang ne 'ja') && ($lang ne 'en'));
my %pagetitle = ('ja' => '日本語のページ', 'en' => '英語のページ', 'none' => 'いんでっくす');
print "Content-type: text/html; charset=euc-jp;\n\n";
print "<html><head><title>$pagetitle{$lang}</title></head><body>";
if($lang eq "ja"){ &page_ja; }
elsif($lang eq "en"){ &page_en; }
else{ &none; }
print "</body></html>";
exit;
#########################
sub none{ print "<a href=\"$script?lang=ja\">日本語</a> / <a href=\"$script?lang=en\">英語</a><br>"; }
sub page_ja{ print "日本語訳ページ"; }
sub page_en{ print "英語訳ページ"; }
0235nobodyさん2007/03/02(金) 23:44:30ID:???
($n, $v) = split(/,/, $line);
$hash{$n} = $v;

のようなことをよくやるのですが、
もっとスマートィな書き方はないでしょうか?
0236nobodyさん2007/03/02(金) 23:57:38ID:???
ハッシュにリストを代入するとキーと値が交互に並ぶと解釈される
リストは1次元に展開されてしまう
の2つを利用して、
%hash = (%hash, split(/,/, $line))
でいいのかな。
0237nobodyさん2007/03/03(土) 00:20:36ID:???
>>236
全く思いもよりませんでした。素晴らしいです!
ありがとうございます。
0238nobodyさん2007/03/03(土) 00:24:52ID:???
>>236-237
ループの中で繰り返しやってる場合、ハッシュを作っては捨て
作っては捨てになるから、splitの結果だけテンポラリなリスト
にpushしていって、最後にハッシュ化したほうがいいかも。
02392352007/03/03(土) 00:32:13ID:???
>>238
図星ですね・・・ギンギンのループですw
ハッシュ生成ってヘビーなんですね。
thanks
0240nobodyさん2007/03/03(土) 11:39:50ID:???
>>215
ありがとうございます。遅くなって申し訳ないです。

色々読んで、myでローカル変数化する
ハッシュに対応するkeyとvalueを代入して、forでループさせてlastで終了
とかは理解できたのですが、
next ifの行で比較している $[ - 1 は数値でしょうか?

あとは他にもこういうループで
foreach $key ( keys %hash ) や while ( ($key, $value) = each(%hash) )
などの方法がありますが、どれが適してますでしょうか?
0241nobodyさん2007/03/03(土) 11:51:27ID:???
$[ - 1の $[ は配列の最初の要素の添え字。
indexは見つからなかった場合に $[ より1小さい値を返す。

普通は $[ = 0; した状態だが、世の中には $[ = 1; としている人もいる。
$[ - 1 と書いてあれば両対応できる。

eachで返される値は制御が出来ないけど、keysでキーを取ってくるなら
sortするなどの制御が可能。
それ以外はここではfor keysでもwhile eachでもあんまり変わらん。
0242nobodyさん2007/03/03(土) 12:30:09ID:???
>>233
CGI::escapeHTMLを使わないのは何故?
02432402007/03/03(土) 12:33:09ID:???
>>241
ありがとうございます。
$[ は検索できず困ってたのですが、おかげさまで何となく分かりました。

ttp://www.rfs.jp/sb/perl/02/05.html
ハッシュのループ方法に関しては↑などを見たのですが、
DBでORDER BYを使い、順序も正確に欲しい場合はどうすればよいでしょうか?

今回の場合は、訪問が多いリファラを最初に比較したほうがループを少なくできるのですが
02442402007/03/03(土) 13:31:13ID:???
ハッシュだと順序が分からないのと、同じキーの時に困るような気がするので、
下記のような感じにしてみましたが、これは変だという箇所ありますでしょうか?

my $referer = $ENV{'HTTP_REFERER'};
my $search;
my @url = (
'Yahoo', 'http://search.yahoo.co.jp/',
'Google', 'http://www.google.co.jp/',
'Google', 'http://www.google.com/'
);

for ( $i=0; $i<=$#url; $i++ ) {
my $tmp = $url[$i];
next if ( index($referer, $url[++$i]) < 0 );
$search = $tmp and last;
}
02452332007/03/03(土) 14:28:59ID:???
>>242
こんな便利なものがあったとは知りませんでした(勉強不足)。
ありがとうございました。
0246 ◆TWARamEjuA 2007/03/03(土) 14:53:59ID:????2BP(6811)
>>243
→今回の場合は、訪問が多いリファラを最初に比較したほうがループを少なくできるのですが
多い少ないが判っているようでしたら優先順位を付与してあげると良いかもですね♪

my %url = (
 'Yahoo' => {
  'priority' => 1
  'referer' => 'http://search.yahoo.co.jp/'
 },
 'Google1' => {
  'priority' => 2
  'referer' => 'http://www.google.co.jp/'
 },
 'Google2' => {
  'priority' => 3
  'referer' => 'http://www.google.com/'
 }
);

for my $temp (sort $url{$a}->{priority} <=> $url{$b}->{priority} keys %url) {
 next if index($referer, $url{$temp}->{referer}) != $[ - 1;
 $search = $temp and last;
}

そろそろ頭の中がこんがらがってきました(哀)
0247nobodyさん2007/03/03(土) 14:59:57ID:???
$[がいまいち判らないので誰か教えてくり。
1) $[は@hogeの時の$hoge[0]?
2) それとも0?別の例だと$hoge[9]だった場合の9?
3) もしくは配列が@mage = (undef,undef,222,undef,444,);の場合の$mage[2]になる?
  (こんな風に配列にundef入れた事無いから、そもそもやっていいのかさえわからないけどw)

調べてみたけど、ろくに検索に引っかからないから厳しいわ。
0248nobodyさん2007/03/03(土) 15:30:11ID:???
>>246
それだとGoogleが分かれてしまうのと、後でパターンを増やすのが面倒なので×
処理速度も遅そうかな

( index() != $[ - 1 )  と  ( index() < 0 ) は等価じゃないの?
0249nobodyさん2007/03/03(土) 16:21:57ID:???
>>247
$[は、リストの先頭の要素を指すために使う「添え字の値」。

$[ = 0; (デフォルトはこれ)
と代入すると、要素数5の@fugaの各要素は
$fuga[0], $fuga[1], $fuga[2], $fuga[3], $fuga[4]
で参照される。
先頭の要素である$fuga[0] は $fuga[$[]でも参照できる。

$[ = 1;
と代入すると、要素数5の@fugaの各要素は
$fuga[1], $fuga[2], $fuga[3], $fuga[4], $fuga[5]
で参照される。
先頭の要素である$fuga[1] は $fuga[$[]でも参照できる。

>>248
indexが、要素が見つからなかったときに返すのは、-1ではなく
そのときの $[ より1小さい値。
$[ = 1;していると、見つかれば1以上の値、見つからなければ0を返す。

以上のことは
$ perldoc perlvar
$ perldoc perlfunc
で調べました。
0250nobodyさん2007/03/03(土) 16:35:41ID:???
なるほど。
$[ は配列の先頭の添え字を何にするか決めているってことですね?
デフォルトは通常 0 と。
0251nobodyさん2007/03/03(土) 16:46:46ID:???
こういう検索できない単語を調べたい時、手元に本があると便利だよ。
perldoc perlvar でもいいけど。
0252 ◆TWARamEjuA 2007/03/03(土) 17:12:05ID:????2BP(6811)
>>248
重複させないようにとなると、DB_FileあたりのR_DUPが必要になるかなぁと。
あと、頻度が多い順っていう優先順位を付けることで処理速度の低下を余計なループを減らす方向で防いでみようと思ったものでして。
このあたりは実際に回してみてベンチなりを取ってみなきゃですね。

ってことでこの辺りの手法はRock54回路でも悩んでいたりしました。
■ このスレッドは過去ログ倉庫に格納されています