Perlコーディング初心者質問スレ Part 53
ふと疑問に思ったのですが、perlの最大計算桁数って何桁
なのでしょうか?
そういえば1年前に5000兆まで計算させるシステムを作った
のを思い出したのですが、その頃は最大計算桁数のことを
考えていなかったような気がするので質問させていただいた
次第です。
ご教示いただけますと幸いです。
use bigint すれば(PCのリソース内で)無限桁ですよ。
>>642 ご教示有難うございます。
ちょっと昔のソースを改変するのにもある程度理由を
つけなければいけないので、デフォルトで何桁まで
問題ないかもしご存知でしたら教えていただけますと
幸いです。
質問続きですみません。
C言語のlong相当、たぶん
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
>>645 訂正
> 32bitマシンの場合は(恐らく)UVのほうが表現できる範囲が大きい(52bit - 15~16桁)。
> 64bitマシンの場合はIV/NVのほうが表現できる範囲が大きい(64bit - 18~20桁)。
ここ思いっきりUVとNVが逆になってる( ´д`;) 読み替え宜しく
1ずつ足して確かめるのオススメ
648 :
nobodyさん:2007/01/05(金) 04:06:51 ID:CAClPvdI
XML::Parserモジュールがどうしてもインストールできません。
最新のexpatもいれたのですが。。
that's too bad.
まったくの初心者ですみません。
ブラウザーからの入力に応じてcgiファイルを書き換えるcgiを作ってみたいのですが。
書き換える側のCGIのソースと書きこまれる側のソースが混ざってしまって
バグがおきてしまいました。
書き込まれる側のソースにシングルクオーテーション、ダブルクオーテーション
が含まれていて書き換える側のダブルクオーテーションで囲まれた間の部分に、
書き込まれる側のダブルクオーテーションが存在してしまうようです。
他にも変数を文字列として書き出せず変数の中身、つまり何も無いスカが書き出されます。
どうすれば良いでしょうか?
>>650 煽りではなく今の君には無理ってことかと。
そんなことする意味もないし。
>648
それだけじゃ何もわからん。OSは?Perlのバージョンは?Cコンパイラは持ってる?
653 :
650:2007/01/05(金) 13:24:38 ID:???
perlを入門サイトなどで勉強中でして、ファイルを制御するのを今習っています。
とりあえずCGIからいろんなファイルに書き込むプログラムを色々と書いてみているのですが。
テキストやHTMLは上手く書き込めたのですがCGIのファイルは上手くいきませんでした。
CGIファイルへの書き込みは習っても意味が無いのでしょうか?
>>653 勉強するだけならいいけど実際に共有鯖等では実行しないで欲しいね。
リスクが高いです。他のユーザーに迷惑かける可能性大。
ヒント:パーミッション
他のユーザに迷惑かけないようにする仕組みはサーバー提供者が負うべき。
ユーザは許可されている事はなんでもやってよい。
他人に迷惑をかける行為は許可なんてされてませんよ?
実行可能=やってよいとか考えているわけではありませんよね^^;
人を殺してはいけないなんていう法律は無いから、人を殺してもよい
659 :
nobodyさん:2007/01/05(金) 20:31:05 ID:5w1bms+v
>> >648
>> それだけじゃ何もわからん。OSは?Perlのバージョンは?Cコンパイラは持ってる?
OSはFedoraCore6
PerlVersionは v5.8.8 built for i386-linux-thread-multi
Cコンパイラはあります。gcc -v で確認しました。
どうもexpat関係でエラーになっています。最新のexpatはいれたのですが。
>>653 の問題はパーミッションではなくて、クォートの問題じゃないのか?
'$' の前に¥でescapeしたり、ということで解決するんじゃないか。
それ以前にcgiがcgi を書き換えるという発想はどうなのよ。
動的にプログラムを生成する必要性はそうないんじゃないか。
>書き込まれる側のソースにシングルクオーテーション、ダブルクオーテーション
>が含まれていて書き換える側のダブルクオーテーションで囲まれた間の部分に、
>書き込まれる側のダブルクオーテーションが存在してしまうようです。
>他にも変数を文字列として書き出せず・・・
自分でわかってんじゃん
コンパイルの必要なモジュールをuse libで使うにはどうすればよいのでしょうか。
自己解決しました。
そのままで良いんですね。。。
CGI動的生成プログラムを"作る必要がある"プロジェクトに関わる者なら質問しないレベルだろう
つまり
>>650は何か間違った設計をしてるんだろうと思う。
てか掲示板のログファイルの拡張子を .cgi にしたいだけとかでは
超低レベルな質問お許し下さい。
PerlによるCGIの参考書を買ってゼロから勉強中ですが、
下記のプログラム(参考書を丸写し)が動作しません。エラーコードは500です。
原因は何でしょうか?
・Perlのパスはレンタルサバのサイトで確認
・ファイル名はindex.cgi
・OSはWinで、メモ帳で編集しFFFTPでUL
・パーミッションは755
#!/usr/bin/perl
print <<_EOF;
Content-type: text/html
<html>
<head><title>test</titel></head>
<body>
test
</body>
</html>
_EOF
>>665 500エラーじゃ何も判らんし、そもそもレン鯖使って勉強するなといいたいが。
・FTPの時にASCIIモードで送って無い
・パーミッションがレン鯖指定のものと違う
・そもそもindex.cgiが使えないようになっている(別名でテストしてみ)
とかそんなあたりか。ソースそのものは問題ない。
タグでtitleの打ち間違いがあるくらいか。
メモ帳だと最終行末改行がないとか
もう出てるけど、
・バイナリモードで転送した
・ヒアドキュメント終端文字列でファイルが終わってる(改行がない)
辺りが有力っぽい。
669 :
nobodyさん:2007/01/06(土) 20:23:33 ID:lBOtCkKI
掲示板の改造で、半角カタカナが本文に含まれる場合
エラーメッセージを出すようにしたいと思っています。
投稿されたメッセージ$messageに
半角カタカナが含まれているかどうかを判定する、というのは
どう書けばよいでしょうか?
全角文字があるかどうかを判定ならググって出てきましたが・・・。
>>666 回答ありがとうございます。
>・FTPの時にASCIIモードで送って無い
FFFTPの環境設定に転送設定という箇所があったので、
「常にアスキー」に設定し、ULしなおしました。
>・パーミッションがレン鯖指定のものと違う
確認したところ、実行ファイルは700が推奨されていたのでそうしました。
705も試しました。
>・そもそもindex.cgiが使えないようになっている(別名でテストしてみ)
確認したところindexで問題ないようですが、test.cgiに変更しました。
ですが、動作しませんでした。
671 :
665:2007/01/06(土) 20:31:56 ID:???
>>666-668 最後に一回改行を入れてからULしたら動作確認できました!
回答ありがとうございました!
672 :
669:2007/01/06(土) 21:04:52 ID:???
もっと探したらみつかりました。ごめんでした。
・・・が、さらに質問です。
名前とタイトルに含まれる半角カタカナは全角に変換でいい。
そこでログに書き込むサブルーチンregistに、
&jcode'h2z_sjis(*name);#$nameの半角を全角に
&jcode'h2z_sjis(*subject);#$subjectの半角を全角に
と書いたのですが、名前のほうが変換されません。
それだけで全てをわかってくれるエスパーさんが来るといいね
30字くらいのパスワードを暗号化したいのですが、
モジュールのインストールなしに出来る方法はどんな方法があるのでしょう。
今はuse libとuse Crypt::CBCとBlowfish_PPでやっているのですが、どうしても遅いので
もう少し早くできると良いのですが。
>>662でlinux上で単純にコンパイルしてそのままautoディレクトリをコピーしてやれば良いのかと思って
コピーしてみましたが
Blowfish.so: undefined symbol: Perl_Gthr_key_ptr
こんな感じのエラーが出てしまいました。
Blowfish_PPとBlowfishでは速度が違いすぎるので、出来ればBlowfishの方を使いたいのですが、
どうすれば使えるのでしょうか。
ちょ、パスワードをなんのために暗号化するのさ
xor暗号最強
>>672 同じ文字列入れてnameの方だけ変換ないってんなら
おまいが間違ってるとしか言えん。
>>674 モジュール無しで、ということだけならopensslに投げるという手もある。
モジュールのほうが速いと思うけど。
>>674 手順はそれで間違ってないと思うのだけれど
・make testは通ったのか
・perlのバージョン
を
>>675 拡張子をcgiにすればファイルの中身を見られることもないのですが、まあ気休め程度に。
>>677 すみません。解決しました。
サーバーとローカルのperlのバージョンが違ったためにモジュールのバイナリを使用できていなかったようです。
サーバーとローカルのperlのバージョンをそろえてコンパイルしなおしたらそのままコピーでuse libしたら
出来ました。
>>645 レス遅れましたが、本当に有難うございました。
検証もしてみましたので検証報告も兼ねさせていただきます。
結論から申し上げますと、16桁目の4以上、つまりは4000兆
くらいから計算が狂ってきました。
これは645さんのおっしゃる32ビットマシンの性能ということ
に当てはまったのではないかと思いました。
ご丁寧に有難うございました。