Perl コーディング初心者質問コーナー Part37
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/08/22 01:41ID:???誰もが最初は初心者。
だからって、初心者に甘んじた質問の仕方は意味がないよ。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0751nobodyさん
04/09/27 21:40:41ID:???map "$_->[2]\n",
sort { $a->[0] <=> $b->[0] || $a->[1] <=> $b->[1] }
map [ /(\d+)/g, $_ ],
qw(100の1 1000の2 100の3 500の1 1000の1 500の2 100の2);
>>748
my $count;
foreach (@data) { $count++; print $count }
print 1..@data;
0753nobodyさん
04/09/28 05:45:24ID:pXXg1bBk0754nobodyさん
04/09/28 05:54:35ID:???0755nobodyさん
04/09/28 06:00:08ID:???真中のは時計のスイッチだぞ。間違えんな
0756nobodyさん
04/09/28 06:09:05ID:B5P8Vfsa現在win2kにてActivePerl-5.8.4.810-MSWin32-x86.msi
を入れて使っています。
9桁以上の10進数正数(例えば36089479532304)を
16進数変換したいのですが
$a = sprintf "%X", $a;
のようにすると8桁までしか変換できず、オーバーフローした場合はFFFFFFFFとなってしまいます。
どうにか9桁以上を変換できないものかと色々検索したのですが
みつからず・・お力を貸していただけないでしょうか。
アドバイスいただければ幸いです。
0757756
04/09/28 08:06:42ID:???sub Hex {
my $val = shift @_;
my @hx = (0..9,'A'..'F');
my $hex;
while ($val > 15) {
$hex = $hx[$val % 16].$hex;
$val = ($val - ($val % 16)) / 16;
}
$hex = $hx[$val]. $hex;
return $hex;
}
先ほどの9桁以上の10進数→16進数変換はこのような形でなんとか
いけました。
そしてもう一つの問題が・・
巨大整数計算なのですが
3164311364の二乗 3164311364**
みたいなことをやると
1.00128664083395e+019
のような形になってしまいます。
use bigint;
や
use Math::BigInt;
も宣言してみたのですが結果は同じです。
きちんとした整数を出してやるにはどうしたらよいのでしょうか。
1.00128664083395e+019に関してはオーバーフローしている部分が
019にはみ出しているのかと思い、
19100128664083395としてみたのですが
これでは二乗の答えになっていません。
0758あぼーん
NGNG0759あぼーん
NGNG0761nobodyさん
04/09/28 13:20:00ID:???0763nobodyさん
04/09/28 17:00:49ID:???「1.00128664083395e+019」とは、「1.00128664083395×10^19」の意味だ。
BigIntは使い方が間違っているのでは?
次のようにすると、「+10012866408339540496」と出力される。
use Math::BigInt;
my $x = Math::BigInt->new('3164311364');
print $x->bpow(2);
0764nobodyさん
04/09/28 17:02:40ID:???(該当件数 / 合計件数)をパーセントで表示しようと思っています。
例えば、合計3件の該当1件ならば33.33333%となります。
# 小数点第二位での四捨五入処理
$percent = ($count / $total * 100);
$percent = $percent * 10;
$percent = (int ($percent + 0.5) / 10);
こうすると、33.3%となりますが、これを3回繰り返しても合計100%にはなりません。
割り切れない数(無限小数でしたっけ?)を含むパーセンテージが存在する場合、
合計を100%にするということは不可能なのでしょうか。
0766nobodyさん
04/09/28 20:15:27ID:???ってなにが有ったんだ?(w
0767nobodyさん
04/09/28 20:52:52ID:???perl4とunicode.plとjcode.plを利用しています
(jcode.pmの利用許可が下りませんでした)
#!/usr/local/bin/perl
require './unicode.pl';
require './jcode.pl';
$googleurl = "%E5%AE%9F%E9%A8%93";
$teststr = "実験";
$googleurl =~ s/%[0-9A-F][0-9A-F]/pack("C",hex($1))/eg;
@googleuni = &unicode::UTF8toUTF16($googleurl);
$googleurl = &unicode::u2e(@googleuni);
print "$googleurl\n";
としているのですが何も出力されません
0768nobodyさん
04/09/28 21:32:44ID:???unicode.pl というのがコレの事なら
http://www.onicos.com/staff/iz/release/#unicodepl
Perl4 では動かない。
0769nobodyさん
04/09/28 21:52:17ID:???電話番号の数字をある規則で文字に置き換えるプログラムとかいう
お題だったんだけど、サンプルに電話番号のような文字列が含まれ
ていたのであぼーんされたようです。
0770767
04/09/28 22:22:13ID:???/usr/binが先にパス通っててそっちでperl -vしてました・・・
0771nobodyさん
04/09/28 22:25:55ID:YPzWwkuAを書こうと思ってます。
フォームから簡単なスクリプトを送るとその結果をブラウザに
返すようなプログラムです。
で、perlのスクリプト上でperlのスクリプトを評価するような
処理をしなければいけないのですが、どのように実現すればいいでしょうか?
0772nobodyさん
04/09/28 22:48:54ID:???0773nobodyさん
04/09/28 23:06:43ID:???× $googleurl =~ s/%[0-9A-F][0-9A-F]/pack("C",hex($1))/eg;
○ $googleurl =~ s/%([0-9A-F][0-9A-F])/pack("C",hex($1))/eg;
0774nobodyさん
04/09/28 23:13:04ID:???一定時間に�@5人に1人が書くとき�A100人に1人が書くとき(チャット) で教えてください
0775機種依存文字を使う奴は氏のう
04/09/28 23:18:25ID:???2. 読むときCGIによる記録ファイル読み込みではなくHTML出力にして、書き込む時だけCGIを使う
0776nobodyさん
04/09/29 00:22:34ID:???だがしかし、ファイルが壊れるリスクを考慮すると、書き込み時の処理はシンプルにしたいところ。
よって掲示板には有効だが、ほいほい書き込みが発生するチャットには向かない。
0777774名無し
04/09/29 00:39:19ID:???すみません
>776
ありがとうございました
0778nobodyさん
04/09/29 03:57:33ID:6EqyI/FO(2)print "〜";文をなるべく1つにまとめる
みなさんはどちらを優先しますか?
またどちらの方が負荷は減るでしょうか?
詳しい方、意見お聞かせ下さい。
0779nobodyさん
04/09/29 04:50:59ID:???アルゴリズムの改善を汁
0780nobodyさん
04/09/29 09:15:35ID:???CGIで一番負荷がかかるのはperl自身のプロセス起動
次はファイルの入出力
代入だのprintだのは誤差の範囲
0782nobodyさん
04/09/29 09:51:57ID:???と言うか、ファイル入出力を見直して軽く出来たら書いた人間が糞。
と言うわけで>>781 mod_perl使えw
0783nobodyさん
04/09/29 10:24:02ID:???掲示板程度のスクリプトでも長いこと動かしていると、プロセスの
メモリ占有量が馬鹿みたいに膨れ上がる。
グローバル変数はほとんど使わないように組んでるし、
my で宣言したものはスコープを外れた時点で解放して欲しいんだけど、
ちゃんと領域を回収してくれてないのかな。
そういえばPerlのGCって意識したことなかった。
0784nobodyさん
04/09/29 10:24:05ID:???全てのPerlで書かれたCGIが
use strictしてあって
動いてたなら
世界はもっと平和だったのに
0785nobodyさん
04/09/29 10:26:47ID:???肥え太った 5.6.x 以降を使わず 5.005_0x を使うと少しは
軽くなるかも知れない。Perl4 スタイルな小規模スクリプト
がメインなら、無闇に Apache::PerlRun で走らせるよりも
CGI にした方が軽い場合もある。
まぁ全てはケースバイケースだから、Apache Bench で
計るなりして最適な選択を。
0786nobodyさん
04/09/29 10:30:04ID:???0789nobodyさん
04/09/29 11:09:44ID:???while(<TAKESI>){
($a,$b,$c,$d,$e,$f,$g,$h,$i,$k)=split(〜);
いろいろ表示
}
こういう処理がありますが
my($a,$b,$c,$d,$e,$f,$g,$h,$i,$k)=split(〜);
このようにmyを付けた方が処理は早くなるのですか?
みなさんは付けてますか?
0790771
04/09/29 11:11:05ID:2geLnUuHありがとうございます。
evalで検索かけたら
http://oshiete1.goo.ne.jp/kotaeru.php3?q=908814
というページも見つかりました。
0791nobodyさん
04/09/29 11:18:50ID:???http://www5a.biglobe.ne.jp/~n_rieko/perl/9.htm#9-3
0792nobodyさん
04/09/29 11:22:47ID:???こういうのってperl4でも使えるのかな
使ったら出来ちゃってるけど
0794nobodyさん
04/09/29 13:11:59ID:???は?myはlocalより早いってとこ?
シンボルテーブルに登録されないから、グローバル変数や
local変数より早いって理解でいいでつか?
0795nobodyさん
04/09/29 13:45:38ID:???処理が入るのでさらに遅いのです。
0796nobodyさん
04/09/29 14:05:03ID:???ひょっとしてここの人達って、ループ中のサブルーチン呼び出しを
インライン展開しなくちゃいけないくらい激しくチューニングしてるわけ?
>>793
mod_perl の問題じゃないんだとしたら、Apache::Registryモジュールのせい?
0797nobodyさん
04/09/29 14:15:59ID:???0799nobodyさん
04/09/29 14:51:18ID:???0800nobodyさん
04/09/29 16:30:57ID:???Perlのコンパイラって何言語で書かれてるの?おまら知ってる?
そもそもどうやってプログラムがうごくのかよくわかあんよな。
CGIいくら組んでも根本的な部分をしらないとだめだな。
ところでCSV形式って区切り子がカンマでしょ?まあ名前の通りだけど。
でも改行も区切り子になるの?
a,s,d
s,d,f
↑これとかってdとsがくっついたりしないの?まあPerlでは
open CSV "hoge.csv";
while ( <CSV> ){
chomp;
printf "大地%s 空%s 海%s <br>\n" ,split/,/;
}
ってchomp意味内やン家!なんか久しぶりにperlのコーディングでもしよ尾も運だすので
カメハネml?
0802nobodyさん
04/09/29 23:53:39ID:???C
http://www.google.co.jp/search?q=perlembed&sourceid=firefox&hl=ja-JP&start=0&start=0&ie=utf-8&oe=utf-8
http://rcl.hp.infoseek.co.jp/perl.html
0803nobodyさん
04/09/30 10:21:11ID:???0804nobodyさん
04/09/30 10:30:29ID:???0805nobodyさん
04/09/30 12:12:21ID:???テキストフィールドに書かれた文字をファイルに保存しようと思っているのですが、
作成されたファイルを開くと、ファイルの先頭部分にNULL文字がセットされてしまいます。
$text = $FORM{"text"};
$text =~ s/\r\n|\r|\n/\n/g;
open (DATA, ">>$filename");
flock (DATA, 2);
seek (DATA, 0, 0);
print DATA $text;
truncate (DATA, tell (DATA));
close (DATA);
chmod (0666, $filename);
環境は ActivePerl5.6.1 IE6.0SP1 AN HTTP Daemon 1.42k でテストしていて、
ローカルですと正常にファイル保存がされるのですが、鯖に上げるとファイル先頭部分にNULL文字がセットされてしまいます。
どなたか考えられる原因をご存知の方はいないでしょうか。
0806nobodyさん
04/09/30 12:40:43ID:???ご存知ではないので一般論で。
まず$textにNULL文字が入っていないか切り分けよう。
printする前に、$text =~ s/\0/<null>/g; とかしとけば
もしはじめからNULLが入っていれば見えるようになるはず。
あともう1つあやしいのは >> で開くとO_APPENDになるので、
OSによるかもしれないがどこにシークしていても必ず書き込み
はファイルの末尾からになってしまう。その辺の問題かも
しれない。
はじめから'>'で開けばその問題はないが、省略してるが実は
読み出しもやってるとするとその手は使えないので、長さ0に
truncateしてからprintするか、sysopen使って
sysopen(DATA, $filename, O_RDWR|O_CREAT) or die;
みたいにすれば回避できると思う。
0807nobodyさん
04/09/30 12:54:35ID:???0808805
04/09/30 13:12:09ID:???補足になりますが、テキストフィールドの内容をファイルに新規保存するだけのものでして、読み出しは行いません。
また、ローカルでテストする際のOSはWin2000Proです。
$text =~ s/\0/<null>/g;を試してみたところ、<null>という文字列は入りませんでしたので、入力内容にNULL文字はないようです。
>>でopenしてseekは無意味と言うことで、seekを外してみましたが、結果は変わりませんでした。
また、>でopenしてみたところ、正常に動作しました。
>>806,807氏、ヒントをありがとうございました。
0809なちじょあ ◆yEbBEcuFOU
04/09/30 14:34:52ID:???0810なちじょあ ◆yEbBEcuFOU
04/09/30 14:35:18ID:???0811803
04/09/30 14:56:10ID:???そうですか、友達に負担がかかるからやめろと言われましたが、騙されたようですね_no
もう一つ質問ですが、kent-webのCGIはダメポと聞きますが、Perlとしてどこがダメポなんですか?
0812nobodyさん
04/09/30 15:05:59ID:???出力されるHTMLのインデントとかはもう見てらんないな。
Perlについては詳しく無いから↓の人詳細よろ
0815811
04/09/30 15:58:51ID:???トンクス!なるほど、たしかにすごいHTML…
>813
スマソ
>814
そうでつか
0816nobodyさん
04/09/30 16:01:47ID:???お前向けのスレはここだ。
KENT WEB 総合スレ Part2
http://pc5.2ch.net/test/read.cgi/php/1078991985/
0817nobodyさん
04/09/30 18:09:03ID:???ただしソースは見るなよ
0818nobodyさん
04/09/30 20:00:11ID:???0819nobodyさん
04/09/30 20:00:36ID:???久しぶりにyybbs見たけど相変わらずザルだね
スパゲッティー度上がってるし
0820nobodyさん
04/09/30 22:21:44ID:ByT9cFMWそのモジュールの中でしか使わない関数っていうことでよかったですよね?
0823nobodyさん
04/09/30 22:59:24ID:???まあ820-821の理解で十分じゃね。
もともと印程度のいいかげんなものだし、
なんやかんやで読んじゃったりするし。
0825nobodyさん
04/10/01 02:57:04ID:???というのをform要素内の最後尾につけて、IDに対してののアンカーにしたいんですが、
〜foo=bar#hoge
とならず、
〜foo=bar%23hoge
とバケてしまいます。
どう記述したらバケずにできますか?
0826nobodyさん
04/10/01 03:14:42ID:???0828nobodyさん
04/10/01 10:26:24ID:???以下のようにしても結果が表示されません。表示する変数には実行結果の最後の行だけが入っている模様です。
他の方の質問と比べて低LVで申し訳ありませんが、お助けください_no
<html><head><title>TraceRoute</title></head>
<script language = "PerlScript">
sub button1_click{
$form = $window->document->form;
$host = $form->host->{'value'};
@traceroute = `tracert $host`;
$window->document->write("@traceroute");}
</script>
<body>
<h2>TraceRoute</h2><hr>
<form name="form"><table>
<tr><td>IPアドレス or ドメインネーム:</td>
<td><input type="text" name="host" size=50 value=""></td></tr>
</table><p>
<input type="button" name="button1" value=" 実行 " onclick="button1_click()">
</p></form></body></html>
0829nobodyさん
04/10/01 11:09:56ID:???アンカーくっつけるためのもんじゃないから無理
0830nobodyさん
04/10/01 11:49:58ID:???クライアントプログラミングはム板に逝ったほうがいい
0831nobodyさん
04/10/01 11:57:33ID:???JS使わんと無理ですか?
0833825
04/10/01 12:56:20ID:???0834nobodyさん
04/10/01 13:35:55ID:???それは化けているのではないし、Perl の問題でもないのでスレ違い。
http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/interact/forms.html#h-17.13.4.1
http://e-words.jp/p/r-ascii.html
http://www.din.or.jp/~ohzaki/perl.htm#JP_Escape
http://pc5.2ch.net/test/read.cgi/php/1095633323/
0835nobodyさん
04/10/01 13:46:06ID:???選択されたファイルがバイナリファイルであればエラーを返す処理をしようと思っています。
しかしながら、テキストファイルにもかかわらずバイナリファイルと判定されてしまい、
ファイルを展開できないことがあります。
opendir (DIR, "."); # カレントディレクトリ
while ($filename = readdir (DIR)) {
if (-d $filename) { # ディレクトリ
next;
}
if (-B $filename) { # バイナリ
next;
}
push (@files, $filename); # ファイルの一覧
}
全てが半角英数字のテキストの場合は、テキストファイルであると正常に判定されるようです。
選択したファイル内に2バイト文字があると-Bでは正確に判定できないのでしょうか。
0837nobodyさん
04/10/01 14:42:32ID:???わかんねぇカスはすっこんでろよ(pgr
>>835
JPerlが使えるのならば、そちらだと確か正常に動いたと思う。
ファイルを展開するんなら、ファイルを読みこんだ後、
表示させる前にNULL文字のチェックをしてみるのはどうだろうか。
拡張子を制限するとか、対策は色々あると思うぞ
0838nobodyさん
04/10/01 15:00:34ID:???http://perldoc.com/perl5.8.4/pod/func/-X.html
シングルバイト文字圏の人が言う「plain text」は、マルチバイト文字は考慮
していない。use encodings 環境下とかでどうなってるかは知らないけど。
0839nobodyさん
04/10/01 18:40:00ID:???0840nobodyさん
04/10/01 19:45:04ID:???http://www5a.biglobe.ne.jp/~n_rieko/perl/4.htm
0842nobodyさん
04/10/02 04:12:13ID:???配列を後ろから読む、というような。
0845nobodyさん
04/10/02 06:14:55ID:???ということをしたいのですが…。出力したときにjavascriptを埋め込むとかでしょうか。うーん。
0846nobodyさん
04/10/02 06:31:48ID:iwLkYg8HCGIはInetpub/cgi-bin/に置いています。
Prelのバージョンは多分5.6だと思います。
Perlへのパスは#!/user/local/bin/perlにしてます。
どうすればよいでしょうか?
ちなみにPerlインストール後は設定を何もいじってません。
よろしくお願いします。
0847nobodyさん
04/10/02 06:56:22ID:???IISの設定は知らないがとりあえずPerlのパスは
#!C:/Perl/bin/perlだろ
#!/Perl/bin/perlでもいいかも
0849nobodyさん
04/10/02 08:03:38ID:iwLkYg8Hhttpdってどこをどのように変更するのでしょうか?
よろしくお願いします。
0850849
04/10/02 08:45:47ID:iwLkYg8H0851nobodyさん
04/10/02 08:55:46ID:xWycr4I2ttp://www.din.or.jp/~bigstone/cgilab/cgitips/iis.html
関係ないけどミケネコさんてお亡くなりになったのね。超ショック。
ご冥福をお祈りします。
■ このスレッドは過去ログ倉庫に格納されています