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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/11/26(日) 14:38:23ID:SlmGsFMB
Perlのコーディングで困ってる人のスレです。

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

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

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

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

前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0548nobodyさん2006/12/28(木) 00:55:31ID:???
>>547
今時のPCだとcryptで6文字とかそらもうあっさり解析される。
とりあえずお手軽なところではMD5あたりだと思うが、
そもそもパスワードのログだけ別ファイルにすれば良くね?
0549nobodyさん2006/12/28(木) 00:56:23ID:???
ログファイルを第三者に完全公開する「とある事情」って何だ
それによってアウローチが変わると思われ
0550nobodyさん2006/12/28(木) 01:08:04ID:???
saltを $1$........$ みたいな形で与えると、別の形式でcryptしてくれたりするみたいだね。
0551nobodyさん2006/12/28(木) 02:53:29ID:???
ハッシュ化したものを生でログに置くからすぐばれる。
XORなどのビット演算で数回かき回したものを置けば、元のパスワードは判別不能になる。
もちろん、かき回しロジックを公開しては意味がない。
0552nobodyさん2006/12/28(木) 09:03:40ID:???
アルゴリズムを隠すことによる秘密はよくないよ。
05535472006/12/28(木) 09:53:44ID:???
>>548-549
回答ありがとうございます。

操作性とスクリプトの簡略化のために、トリップキーと削除・編集パスワードを同じものにしたいので、
必然的にパスワードを一方向関数で変換した値は公開されちゃうんです。(トリップとして)

tripper のようなトリップ解析ツールでも6文字なら1日以内に解読できちゃうので、やはり危険ですよね。

>>550
なるほど
http://www.tohoho-web.com/wwwperl2.htm#crypt
そうすればMD5が使えるみたいですね

>>551-552
自分のサイトだけで使ってるならかき混ぜでもばれなさげですね。。。
まぁ基本的に隠蔽によるセキュリティはよくないですが。


よく考えてみると、トリップとして公開するデータをパスワードの一方向関数変換結果の一部にしちゃえば
解読が困難になりそうですね。

ありがとうございました。
0554nobodyさん2006/12/28(木) 13:58:02ID:hVZzWyfv
いろいろなソースを見て勉強しているんだけど、コンストラクタで

my $self = {};
my $self = [];

この2通りの記述を見ました。
{}と[]の違いってなにかあるんですか?

あと、それらに空要素を入れる場合、=0や=''ではなく={}や=[]とする理由も加えてご教示願います。。。m(_ _)m
0555nobodyさん2006/12/28(木) 14:02:16ID:???
$aaa={}; # ハッシュリファレンス
$aaa=[]; # 配列リファレンス
@aaa=(); # 配列
$aaa=''; # スカラー
0556nobodyさん2006/12/28(木) 14:04:14ID:???
>>538,554
オマイラとりあえずperlreftut嫁
ttp://www.kt.rim.or.jp/~kbk/perl-5.8/perlreftut.html
その質問の答えは全てリファレンスとは何かと言うことを理解することによって得られるから。
0557nobodyさん2006/12/28(木) 14:16:08ID:hVZzWyfv
>>555-556
ありがとうございます!
参考サイトは10回ブックマークに登録しました。
0558nobodyさん2006/12/28(木) 14:27:15ID:???
>>557
ちなみにそのサイト、テンプレ>>2にある
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
だからね。
今回は入門としてとりあえずチュートリアル(perlreftut=perl-reference-tutorial)を紹介したけれど、
ちゃんと理解するためにはperldata、perlref、perllolあたりも読んでおいてほしいところだ。
0559nobodyさん2006/12/28(木) 20:22:01ID:???
現在、Shift-JIS(CP932)しか読み込めない
windows上で動作するアプリケーションで使用するテキストを出力するCGIを作っています。
(スクリプトのエンコードはEUCJP)。
現時点では次のような処理をしています。

    投稿ページをEUCのHTMLで出力
           ↓
  投稿ページからPOSTされた文字列を加工して
  Shift-JIS(CP932)に変換してテキストファイルに保存
  (変換にはJcode::CP932モジュールを使用)
           ↓
テキストファイル(CP932)を読み込んでEUCに変換して整形してHTMLに出力
(変換にはJcode::CP932モジュールを使用)

自宅鯖で使う分には良いのですが、Jcode::CP932モジュールは殆どの鯖に入ってないので、
レンタルサーバで使うにはモジュールの追加を依頼する必要があります。

そこで質問です。
1、バージョン5.8のperlの標準的なモジュールのみでEUC-JPとCP932の相互変換は出来ますか。
  もし出来るなら方法を教えてください。
2、Encode.pmでCP932とEUCJPの相互変換は出来るのか、出来るなら方法を教えてください。
3、スクリプトをUTF-8で記述して、use utf8を使用してCP932とUTF-8を
  相互変換したほうが良いのでしょうか。
  その際、CP932とUTF-8を相互変換は標準的なモジュールのみで可能でしょうか。
0560nobodyさん2006/12/28(木) 20:34:13ID:???
Jcodeはパス通せば置くだけでしょ
0561nobodyさん2006/12/28(木) 20:41:34ID:???
>>559
Jcode-CP932っての探して見てみたが>>560の言うとおりインストールしてもらう必要は無い。
libディレクトリ以下適当にコピーしてuse libなりなんなりすれば動く。

1.
極端な話自分で変換テーブルを用意すれば変換できるわけだけれど、
CP932との変換機能が用意されているかと言えばNO。
2.
可能。非標準モジュールEncode-EUCJPMS。但し要コンパイル。
3.
私はそっちのほうが好きではあるが別にその必要は無い。
変換については1,2のとおり。
0562nobodyさん2006/12/28(木) 20:52:26ID:???
Windows Vistaのお陰でUnicode関係の変換がさらに面倒になるね
0563nobodyさん2006/12/28(木) 22:47:30ID:/nHSB5ow
かなり初歩的なことかもしれませんが・・

CGIでパラメータを受け取る時に、ハッシュテーブルに入る変数の数が
不定の場合に、ループ処理を使って、うまく値を取り出すにはどうしたら
良いでしょうか。
パラメータ↓
aaa=テキストa&bb1=テキストb1&bb2=テキストb2&..bbx=テキストbx&ccc=テキストc
bb1〜bbxまでの値を取得したい・・。

良い方法がありましたら、ご教授よろしくお願い致します。
05645632006/12/28(木) 22:54:40ID:???
え、っと自己レスです
>>563 わざわざハッシュにしなくても、bb1〜bbxだけ普通の配列に入れたらイイ?

良案お待ちしておりますー。
0565nobodyさん2006/12/28(木) 23:18:32ID:???
>>563
<form name="bb[]" value="テキストb1" />
<form name="bb[]" value="テキストb2" />
<form name="bb[]" value="テキストbx" />
みたいにしておいて、パラメータ解釈時に/(.*)\Q[]\E$/な要素を
push @{$params{$1}}, $value;
するのが常套手段ではないかと。
0566nobodyさん2006/12/28(木) 23:20:10ID:???
うわぁ、HTMLミスってるorz
s/form/input type="text or hidden"/g
0567 ◆TWARamEjuA 2006/12/29(金) 00:36:46ID:????BRZ(6677)
for my $bb_keys (grep /^bb./, keys %hash) {
:
:
}
とか?
0568nobodyさん2006/12/29(金) 01:12:17ID:???
>>561
おれ、

use Encode qw(from_to);
from_to($hoge, 'cp932', 'euc-jp');
from_to($hoge, 'euc-jp', 'cp932');

で変換して使ってるけど、非標準モジュール入れた記憶ないなあ。
05695612006/12/29(金) 01:31:54ID:???
>>568
あーごめんなさい。>>561は撤回…完全に記憶違いです…
CP932との変換テーブルはデフォルトで入ってるのか。

無いのはMicrosoft仕様のEUCJP-msね。
丸囲み文字とかローマ数字とかそういうやつがEUCJPに変換できないのか…

1. EUC-JPとの変換はできるが一部CP932が拡張している一部の文字について変換できない。
2. 可能。完全に変換するためには非標準モジュールEncode-EUCJPMS。但し要コンパイル。
3. 標準モジュールのみで可能。
で合ってるかな…まあなんにしろ一度派手に記憶違いしてた人の回答なんて
信用できませんので誰か詳しい人お願いしますillorz
0570nobodyさん2006/12/29(金) 01:40:21ID:???
>>560,561
パスを通せば動くんですか。。。
use libの使い方が良くわからなかったので、検索しました。
結構使えそうですね。ただ、コンパイルの必要なモジュールには使えないかも。
use utf8にも挑戦してみます。
use utf8を知る前に投稿を受け取る部分を作ったので
文中で正規表現で2バイト文字を使うために\nxx\nxxで文字を記しているので
面倒になるかもしれませんが。

>>568
Encodeでも可能なんですかね。ちょっとやってみます。

>>569
Jcode::CP932では上のほう(>>404)で話が出ていた���A�ケも�O���Uも上手に変換できていたので
もしかしたらいけるかもしれません。ちょっとやってみます。

#文字コード変換は鬼門ですね。
0571nobodyさん2006/12/29(金) 02:16:03ID:???
結果です。

まず、use Encode qw(from_to);での結果。
from_to($huga, 'cp932', 'eucjpms');
ダメでした。
���A�ケ�O���Uと続けて記入したデータが??????に化けました。

次にEncode::EUCJPMSを読み込ませた上で
↓のように記述してみました。
from_to($huga, 'cp932', 'eucjpms');
これもダメでした。���A�ケが全角空白に変換され   �O���Uと出力されてしまいました。

3、のuse utf8は時間が掛かるので明日にでも全改修してやってみます。
0572nobodyさん2006/12/29(金) 02:29:36ID:???
>>571
eucjpmsじゃなくてcp51932だとどうだろ
ttp://msyk.at.webry.info/200511/article_2.html
ttp://legacy-encoding.sourceforge.jp/wiki/index.php?cp51932

こちらで確認したところそれらの文字は全部通った。
0573nobodyさん2006/12/29(金) 02:35:41ID:???
失礼。全角空白ではなく FD FF FD FF FD FF という良くわからない文字列でした

>>572
from_to($ds, 'cp932', 'cp51932');
OKでした。でも、このcp51932ってエンコードって5系perlには標準で入ってましたっけ。
EUCJPMSはロードしなくても出来たので、最新版のEncodeでは標準のようですが。
0574nobodyさん2006/12/29(金) 02:43:29ID:???
>>573
ありゃ?
ttp://search.cpan.org/~naruse/Encode-EUCJPMS-0.07/EUCJPMS.pm
に書いてあるからEncode::EUCJPMSが提供しているものだと思ったんだけど。
そして当方ではロードしないとUnknown encodingとエラー起こしてる…
>perl -MEncode -e "print $Encode::VERSION"
2.18
0575nobodyさん2006/12/29(金) 03:05:50ID:???
>>574
私の使ったEncode::EUCJPMSをロードしないと言うのは
use Encode::EUCJPMS
と、記述しないと言うことですが。。。

って、use Jcode::CP932を書いたままでした。
Jcode::CP932内でEncode::EUCJPMSを呼んでるので動いたのでしょう。

となると、標準モジュールのみでやるにはやはりuse utf8プラグマをつけないとダメってことですかね。
それでも動くかどうかは判らないですが。
0576nobodyさん2006/12/29(金) 04:26:07ID:???
超低レベルな質問かもしれませんが、お願いします。

現時点でhtmlで簡単なサイトぐらいなら作れる、人並みの脳みそを持った人が、
仕事の合間を縫ってそれなりに勉強して、Perlを使ったCGI(初歩的な掲示板など)
をゼロから作れるようになるには何ヶ月ぐらいかかりますか?

個人的な感覚で構いませんので、どう思うか教えて下さい。
0577nobodyさん2006/12/29(金) 05:57:46ID:???
>>576
3日間
05785772006/12/29(金) 05:58:43ID:???
あ、プログラミングの経験が普通の高校で習った程度しかないなら、1ヶ月間ぐらいで。
0579nobodyさん2006/12/29(金) 10:17:46ID:???
条件が曖昧過ぎるからなんとも言えないけど
やっぱ1ヶ月ぐらいかなー
0580nobodyさん2006/12/29(金) 10:48:29ID:???
最初のプログラミング言語としてperlを選択するのは止めなさい。
一生perlしか使わないつもりなら止めないけど。
05815632006/12/29(金) 10:51:17ID:???
>>565,>>567
ありがとうございます。実はPerlは今週はじめたばかりで、
そんな風に出来るんだ〜・・などと感心してました。

で、この結局こんな感じで進めました。

if($key =~ /^bb\d$/){ push @bb_vals, $val; } #キーが"bb[0-9]"の処理
elsif($key =~ /^dd\d$/){ push @dd_vals, $val; } #キーが"dd[0-9]"の処理
else{ ハッシュテーブル作成 }

�@入力フォームに、ラジオボタンが数種類 × 数グループあったので、
nameを同じにすると ややこしい感じに
�Aフォームの順番も重要だったので、順不同なkeysは今回は使いにくそう
な感じでした。
これからまた、お世話になるかもしれません。よろしくお願いします。

>>576
プログラムかUNIX系の知識があれば、一週間もあれば。
それ以外であれば、やっぱりひと月でしょうねー。
0582nobodyさん2006/12/29(金) 12:44:22ID:???
何を習得するにも、>>580みたいな意見には惑わされないように。
0583nobodyさん2006/12/29(金) 13:41:38ID:???
俺も580と同意見だな。
やるならCから入った方がいい・・・と、Cから入った俺がry
0584nobodyさん2006/12/29(金) 14:10:55ID:???
580=583 スレ違いカエレ
0585nobodyさん2006/12/29(金) 19:17:04ID:???
>576
1ヶ月あれば形になると思う。あとHaskellやろう。
0586nobodyさん2006/12/29(金) 19:30:36ID:???
>>576
週末全部充てれば一ヶ月もあれば習得できるかもしれないが、
BBS一個作るとなると+2ヶ月はかかると思われ
0587nobodyさん2006/12/29(金) 19:32:26ID:???
というかググる力というか、検索力があればけっこう短期間で形にはなる
05885762006/12/29(金) 19:38:01ID:???
>>577-579,580-583,585
回答ありがとうございます。

現状私は、htmltとcssとJavascriptが
本当に「できる」と言っていいのかすらわからない程度にできます。
それ以外は一切できません。Perlを使ったフリーCGIのソースをいじくり回す程度です。
仕事でWebデザインぽいことをやってますが、デザインだけではどうにもこうにもアレなので、
CGIを習得しようと思い、CGIと言えばPerlだろという考えで書き込みました。
純粋にプログラミングというより、あくまでもCGIを作るための言語を学びたいので、
WebProg板に来た次第です。

仕事が忙しいので、自習は週4日、1時間程度で考えています。
みなさんを信じてまずは1ヶ月がんばります。
そこで、>>1-10あたりにあるサイト以外で、オススメのサイト、
書籍、「その前にまずこれをやれ」的なことなどありましたら教えて下さい。
0589nobodyさん2006/12/29(金) 19:41:15ID:???
>>584
図星を突かれた使えないperlerがなんかほざいてるな。
0590nobodyさん2006/12/29(金) 19:49:27ID:???
>>588
とりあえず、KENTは参考にしてはいけない。それだけは言える。
0591nobodyさん2006/12/29(金) 20:21:54ID:???
>>589は>>584で図星突かれたらしいw
0592nobodyさん2006/12/29(金) 20:23:21ID:???
>>590
追加で、結城浩も宗教色を強めてきてきもいので参考にしないほうがいい。
0593nobodyさん2006/12/29(金) 21:10:19ID:???
>>588
>「その前にまずこれをやれ」的なことなどありましたら教えて下さい。

こんなとこで回答期待してないでさっさと着手しろ。
そういうやつに限って始めるまでが長くて結局何も出来ない。
05945762006/12/29(金) 22:08:25ID:???
>>593
うるせーバーカ!!
0595nobodyさん2006/12/29(金) 22:38:09ID:???
>592
じゃあ逆にお勧めのPerlishって誰?
0596nobodyさん2006/12/29(金) 23:05:21ID:???
>>595
お勧めの人を作らないことがお勧め。
特にPerlの場合は、いろんな書き方があるから、いろんなコードを読んでおいたほうがいい。

このスレを見るのがためになると思う。
答える側になっても、ここではまだまだ新しい発見があるし。
0597nobodyさん2006/12/29(金) 23:43:55ID:???
        lヽ ノ l        l l l ヽ   ヽ
  )'ーーノ(  | |  | 、      / l| l ハヽ  |ー‐''"l
 /  P  | | |/| ハ  / / ,/ /|ノ /l / l l l| l P ヽ
 l   ・  i´ | ヽ、| |r|| | //--‐'"   `'メ、_lノ| / ・  /
 |  B  l  トー-トヽ| |ノ ''"´`   rー-/// |  B |
 |  ・   |/     | l ||、 ''"""  j ""''/ | |ヽl ・ |
 |  P   |       | l | ヽ,   ―   / | | l  P  |
 |   !!  |     / | | |   ` ー-‐ ' ´|| ,ノ| | |  !! |
ノー‐---、,|    / │l、l         |レ' ,ノノ ノハ、_ノヽ
 /        / ノ⌒ヾ、  ヽ    ノハ,      |
,/      ,イーf'´ /´  \ | ,/´ |ヽl      |
     /-ト、| ┼―- 、_ヽメr' , -=l''"ハ    |  l
   ,/   | ヽ  \  _,ノーf' ´  ノノ  ヽ   | |
、_    _ ‐''l  `ー‐―''" ⌒'ー--‐'´`ヽ、_   _,ノ ノ
   ̄ ̄   |           / 
0598nobodyさん2006/12/30(土) 00:06:42ID:???
PBPはDamian Conwayか。参考になるきれいなコードだった。
0599nobodyさん2006/12/30(土) 10:22:00ID:2X8njGUn
>特にPerlの場合は、いろんな書き方があるから、いろんなコードを読んでおいたほうがいい
kent(と、その属性のクローン)だけは外す事を明記するのを忘れている
俺は、それで散々な目にあったから
いゃ、俺だけではないが
0600nobodyさん2006/12/30(土) 11:24:16ID:???
Perlでコンソール上で動作するプログラムを構築したとき、
画面などのデザインを変更するプロパティみたいなのってありますか?
教えてください。
スレ違いなのは承知の上です。
0601nobodyさん2006/12/30(土) 11:37:08ID:???
>>600 無い。
0602nobodyさん2006/12/30(土) 12:32:16ID:???
rawモード用のモジュールみたいなのはCPANにあったと思う。
0603nobodyさん2006/12/30(土) 14:47:43ID:???
標準モジュールにTerm::Capがあるな
0604nobodyさん2006/12/30(土) 16:37:11ID:???
>>600
>スレ違いなのは承知の上です。

板違いだったりする。
http://pc10.2ch.net/test/read.cgi/tech/1166708139/
0605nobodyさん2006/12/31(日) 02:44:28ID:oF4MMStz
あるハッシュ%hashが、

%hash = (
a => 変数,
b => 配列のリファレンス,
c => 変数,
d => 配列のリファレンス,
e => 配列のリファレンス,
...
);

であるとき、ループで%hashのvalueだけを評価して、もし配列のリファレンスであればその配列を展開する・・・という処理はどうすれば良いでしょうか。
0606nobodyさん2006/12/31(日) 02:48:12ID:oF4MMStz
事故解決しました。。。

while (ref(values(%hash)) eq 'ARRAY') {
...
}

という処理を使うことにします。
・・・間違ってるのかな?
0607nobodyさん2006/12/31(日) 04:17:23ID:oF4MMStz
やはり上手く行きませんでしたonz

%hash = (
a => 'あああ',
b => [
  { c => 'いいい' },
  { d => [
    { e => 'ううう' }
  ] }
);

このようにハッシュのvalueに幾度(無限に)も配列のリファレンスがネストしてあるとき、どのようにすれば下層部のハッシュ(上記の場合e => 'ううう')が取り出せるのでしょうか?
0608nobodyさん2006/12/31(日) 10:20:33ID:???
>>607
再帰処理
0609nobodyさん2006/12/31(日) 10:33:33ID:oF4MMStz
>>608
試してはみたんですが、出来ませんでした。。。
端折ると↓のようにしてみたんですが

sub aaa {
  foreach () {
    if (ref()) {
      &aaa();
    } else {
      普通のしょり
    }
  }
}
0610nobodyさん2006/12/31(日) 14:29:56ID:???
引数
0611nobodyさん2006/12/31(日) 17:01:53ID:???
くだらない質問で申し訳ありません。

【書き方1】

function check() {
  if ($x == 2) {
    print "Xは2です。";
  } elsif ($x == 5) {
    print "Xは5です。";
  } else {
    print "Xは2でも5でもありません。";
  }
}

【書き方2】

function check()
{
  if ($x == 2)
  {
    print "Xは2です。";
  }
  elsif ($x == 5)
  {
    print "Xは5です。";
  }
  else
  {
    print "Xは2でも5でもありません。";
  }
}
06126112006/12/31(日) 17:05:01ID:???
みなさんは上記の 【書き方1】 と 【書き方2】 のどちらが好きですか?
自分は 【書き方2】 で理由は、

・開始括弧と終了括弧が揃っている。
・開始括弧の行が空く (括弧だけの行ができる) ので見やすい。【書き方1】 だと空行入れるべきか入れないべきかで毎回迷ってやりにくい。
・elsif の行がスマートになる。

です。

皆さんのお好み、または標準のコーディングルールがあれば教えて下さい。
あと、自分はインデントはタブで、タブは半角スペース4つ分にしていて、文のあとにコメントを入れる場合にはタブ1つあけることにしていますが、
こちらについても教えていただけたら幸いです。

0613nobodyさん2006/12/31(日) 17:51:26ID:???
>>611
ベストプラクティスでは、「重要なのは、首尾一貫したスタイルを1つ採用することである。」としたうえで
レイアウトガイドラインの「提案」として、K&Rスタイルを採用しているね。つまり

if ($x == 2) {
    print "Xは2です。";
}
elsif ($x == 5) {
    print "Xは5です。";
}
else {
    print "Xは2でも5でもありません。";
}

こう。んで、タブを使わず半角スペース4つを1インデントとしている。
個人的にも、特にこだわりはないので、このベストプラクティスを標準としてるなぁ。
ただ、チーム開発の時はチームのコーディングルールに合わせるけど。
でも、Perl は TMTOWTDI がモットーなんだし、好きな書き方で良いと思う。
06146112006/12/31(日) 17:55:49ID:???
>>613
なるほど
回答していただきありがとうございました

標準的なコーディングルールを使ったほうが他の人と共有する場合や配布する場合には便利ですね。

> タブを使わず半角スペース4つを1インデントとしている。

これに関しては、自分が使っている 「phpエディタ」 も 「TeraPad」 も Tabキーで半角スペースを4つ入れる機能がないので
不便でしょうがないです(´・ω・`)
0615nobodyさん2006/12/31(日) 17:58:21ID:???
半角4つにすると、インデント消す時バックスペース4回も押すのマンドクセ
0616nobodyさん2006/12/31(日) 18:00:26ID:???
最近のエディタならたいがいバックスペースでアンインデントできるようになるでしょう
0617nobodyさん2006/12/31(日) 18:08:53ID:???
こん↓な時タブを使われると、環境によってずれるから嫌な気分になる。

abcd = 1 + 2 + 3 +
     4 + 5;
0618nobodyさん2006/12/31(日) 18:40:04ID:???
こんな感じかな。
use strict;
use Data::Dumper;

my %hash = (
a => 'あああ',
b => [
{ c => 'いいい' },
{ d => [ { e => 'ううう' } ]}
]
);


parse(\%hash);

sub parse {
my $tmp = shift;
#print Dumper $tmp;
if (ref $tmp eq 'ARRAY') {
foreach (@$tmp) {
parse($_);
}
} elsif (ref $tmp eq 'HASH') {
foreach (keys %$tmp) {
parse($tmp->{$_});
}
} else {
print "$tmp\n";
}
}
0619nobodyさん2006/12/31(日) 21:54:59ID:???
@a = qw{ a b c d e };
@b = qw{ 1 2 3 4 5 6 };

@array = \(@a, @b);

こんな風になっている場合、@arrayから@aの要素数にアクセスするにはどう書けばよいでしょうか。
0620nobodyさん2006/12/31(日) 22:31:17ID:???
scalar @{$array[0]}
06216192006/12/31(日) 22:45:49ID:???
>>620
ありがとうございます。
今年終わる前におしえてもらえてよかった・・・(T_T)ノ
よいお年を。
0622nobodyさん2007/01/01(月) 20:57:03ID:QvA3S+in
あけましておめでとうございます。新年初の質問です。どうぞよろしくお願いします。
#####書き換え前#####
# メッセージ内で使用を禁止する言葉の処理
if (crypt($FORM{'spwd'},substr($password,$salt,2)) ne $password)
{@ngword = split(/\s+/,$ngw);
foreach $ngw (@ngword){
if ($FORM{'value'} =~ /\Q$ngw\E/i){
&error('メッセージ内に使用禁止ワードが含まれています。');}}}
#####ここまで#####
☆備考☆
$ngw = 'テスト test TEST';
これをファイルを読み込み形式にしたいと思い↓のようにしました。
#####書き換え後#####
if (crypt($FORM{'spwd'},substr($password,$salt,2)) ne $password)
{if ( !open(NGW, "$spamdata") ){
&error('0');}
@xx = <NGW>;
foreach $ngw (@xx){
@ngword = split(/,+/,$ngw);
foreach $ngw (@ngword){
if ($FORM{'value'} =~ /\Q$ngw\E/i){
&error('メッセージ内に使用禁止ワードが含まれています。');}}}close(NGW);}
#####ここまで#####
☆備考☆
$spamdata = 'spamdata.cgi';
※質問
そこで、foreach $ngw (@xx){}とforeach $ngw (@ngword){}が重複しているようで、
表記としておかしくないか疑問に思いました。
なにぶんPerlの知識も経験も乏しいもので、チェックをお願いします。
より適切な表記の仕方があったらご指摘も戴けるとうれしいです。
備考
spam対策のために禁止語句をCGIファイルから読み込みたいと思い書き換えました。
0623nobodyさん2007/01/01(月) 21:04:13ID:???
では新年初のスルーで
0624nobodyさん2007/01/01(月) 23:37:36ID:???
>>622
>そこで、foreach $ngw (@xx){}とforeach $ngw (@ngword){}が重複しているようで、
>表記としておかしくないか疑問に思いました。

そりゃどう考えてもおかしい。perlに限らずプログラミング一般論として。

>spam対策のために禁止語句をCGIファイルから読み込みたいと思い書き換えました。

CGIの意味知ってる?
そこは単にテキストファイルでしょ。なんで、そんなファイルの拡張子に".cgi"付けるの。
新年早々猪突突進か
0625nobodyさん2007/01/01(月) 23:59:59ID:???
ファイルの拡張子なんか何だって良い。
0626nobodyさん2007/01/02(火) 00:10:37ID:???
http server が拡張子に影響されないなら良いが、".cgi" だと影響受けるだろ。
0627nobodyさん2007/01/02(火) 00:17:55ID:???
拡張子cgiは、htaccessを使わず(使えない場合も)、ファイルの中身を見せない簡単な方法だね。
目くじら立てることでもない。
0628nobodyさん2007/01/02(火) 00:29:14ID:???
>>627にも一理あるが、>>622がそこらへん理解してれば良いが。
こぢんまりしたサイトでは目くじら立てなくてもいいかも知れないが、
職業プログラマが製品レベルではやらないことだな。
0629nobodyさん2007/01/02(火) 00:46:17ID:???
俺は他人のデータを扱うときはHTTPから見えないところに置くけど、
自分だけのデータならランダムで32文字でつけたディレクトリにデータファイル入れたりしてる
0630nobodyさん2007/01/02(火) 01:29:17ID:???
>>622
とりあえず、2つのforeach文をそれぞれ同じ変数$ngwに入れてるみたいだから、それを別々にしてみよう。
一つ目を$ngw1、二つ目を$ngw2とか。
で、
if ($FORM{'value'} =~ /\Q$ngw\E/i){
を
if ($FORM{'value'} =~ /\Q$ngw2\E/i){
にしてみると大丈夫だと思うよ。
0631nobodyさん2007/01/02(火) 02:15:39ID:???
ライブラリファイルを読み込もうとしたのですが
『次のファイルを開こうとしています。』となって表示されません。
ライブラリファイルの拡張子は.plなのですが、保存したファイルは普通にダブルクリックで開けてしまいます。
.pl拡張子は何か特別な設定が必要なのでしょうか?
0632nobodyさん2007/01/02(火) 02:24:31ID:???
> ライブラリファイルを読み込もうとしたのですが
どう読み込もうとしたのか。requireとかopenとか…ダブルクリックとか。

> 『次のファイルを開こうとしています。』となって表示されません。
これは自作メッセージ?STDOUTかSTDERRに出てるのか、UAの画面に表示されるのか。
CLIのお手軽アプリを作ったときに、こういうメッセージをprintしてファイルの中身をSTDOUTに吐く前に
無限ループにはめて先に進まなくなったことは何度もある。

# open(FH, '<', "hoge.dat"); flock(FH, 2); @buffer = <FH>; close(FH);
# while (@buffer) { print 'while でなく foreach と書いたつもりの酔っ払い', "\n"; }

質問がWebProg関係なのかどうかも含めて、ちょっとよくわかんない。
.plだからとくにどうこう、ってのはないです。
06336312007/01/02(火) 02:43:47ID:???
>>632
すいません自己解決しました
0634622@解決済み2007/01/02(火) 09:03:38ID:5ekfui+1
>>624
>>630
ありがとうござます。↓昨日また少し考えてこんな感じになりました。

if (crypt($FORM{'spwd'},substr($password,$salt,2)) ne $password)
{if ( !open(NGW, "<$spamdata") )
{
&error('0');
}
flock(NGW, 1);
@xx = <NGW>;
close(NGW);
foreach $ngw (@xx){
@ngword = split(/,+/,$ngw);
foreach $ngwbb (@ngword)
{
if ($FORM{'value'} =~ /\Q$ngwbb\E/i)
{
&error('メッセージ内に使用禁止ワードが含まれています。');
}
}
}
}

ご協力ありがとうございました。
0635nobodyさん2007/01/02(火) 17:42:57ID:???
WINDOWSの鯖でファイルが書き込み可能かどうかを判断するにはどうしたらいいんですか?
WINDOWS鯖の場合だと
if (-w $write_file_path) { print "書き込み可能\n"; }というプログラムがが使えないんです
0636nobodyさん2007/01/02(火) 19:27:19ID:???
おいコラはやく答えろや 人間電卓どもが!!!
0637nobodyさん2007/01/02(火) 19:31:28ID:???
電卓すらも使えない人間がここに一人ry
0638nobodyさん2007/01/02(火) 20:42:50ID:???
パソコンよりレジや電卓のほうが難しいと思う
0639nobodyさん2007/01/02(火) 21:13:35ID:???
いや、計算尺の方が…
0640nobodyさん2007/01/03(水) 11:08:33ID:???
>>635 = http://pc10.2ch.net/test/read.cgi/tech/1166708139/139

マルチ放置推奨
0641nobodyさん2007/01/03(水) 22:13:23ID:???
ふと疑問に思ったのですが、perlの最大計算桁数って何桁
なのでしょうか?

そういえば1年前に5000兆まで計算させるシステムを作った
のを思い出したのですが、その頃は最大計算桁数のことを
考えていなかったような気がするので質問させていただいた
次第です。

ご教示いただけますと幸いです。
0642nobodyさん2007/01/03(水) 22:24:17ID:???
use bigint すれば(PCのリソース内で)無限桁ですよ。
0643nobodyさん2007/01/04(木) 00:30:50ID:???
>>642
ご教示有難うございます。
ちょっと昔のソースを改変するのにもある程度理由を
つけなければいけないので、デフォルトで何桁まで
問題ないかもしご存知でしたら教えていただけますと
幸いです。

質問続きですみません。
0644nobodyさん2007/01/04(木) 12:00:06ID:???
C言語のlong相当、たぶん
0645nobodyさん2007/01/04(木) 16:29:54ID:???
Perlが組み込み型で扱う数値にはIV、UV、NVの3つがある。
IVはポインタが格納できることが保証される符号あり整数型、
UVはIVと同様の符号なし整数型。
そしてNVは倍精度浮動小数点型となっている。

えーとだからその処理系における不動小数点型の表現がIEEE 754だと仮定すれば、
倍精度浮動小数点型の仮数部は52bitで、
32bitマシンの場合は(恐らく)UVのほうが表現できる範囲が大きい(52bit - 15~16桁)。
64bitマシンの場合はIV/NVのほうが表現できる範囲が大きい(64bit - 18~20桁)。

かな。前に齧り読んだことと、ドキュメントの関連してそうな部分を
掻い摘んで読んだのを組み合わせただけなのであってるかどうかはわからん。
See also: perlguts
0646nobodyさん2007/01/04(木) 16:40:19ID:???
>>645
訂正
> 32bitマシンの場合は(恐らく)UVのほうが表現できる範囲が大きい(52bit - 15~16桁)。
> 64bitマシンの場合はIV/NVのほうが表現できる範囲が大きい(64bit - 18~20桁)。
ここ思いっきりUVとNVが逆になってる( ´д`;) 読み替え宜しく
0647nobodyさん2007/01/04(木) 18:37:22ID:???
1ずつ足して確かめるのオススメ
■ このスレッドは過去ログ倉庫に格納されています