Perl コーディング初心者質問コーナー Part37
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/08/22 01:41ID:???誰もが最初は初心者。
だからって、初心者に甘んじた質問の仕方は意味がないよ。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0685683
04/09/24 19:55:58ID:???そうだったorzごめん。
それで何かいい書き方ないかな?一番いいのは冗長な条件文にしないことだけど、
たまにどうしようもないときってあるでしょ?
時間がないから妥協とかするときにでも、とっさにできる最低限のこととして
読みやすさだけは確保したいよね。
0687683
04/09/24 20:07:59ID:???そういう話ではないんだ^^;
条件文を冗長でないものにする方法じゃなくて、
冗長な条件文の読みやすくするための書き方みたいな感じ;
0688nobodyさん
04/09/24 20:08:48ID:???else BLOCK が不要なら
{
EXPR && EXPR || last;
EXPR || last;
...
}
とか。
Perl に限った話じゃないから、この辺ででも聞けば?
http://pc5.2ch.net/test/read.cgi/tech/1068752664/
0689nobodyさん
04/09/24 21:16:00ID:???↓Perl
ttp://bcmnhp1.hp.infoseek.co.jp/content2.txt
↓DATファイル
ttp://bcmnhp1.hp.infoseek.co.jp/ctdata2.txt
DATファイルの一行目は上手く動作していますが,二行目の同一IPをチェックする方に何故か初めと終わりに:が付いてしまいます。
↓処理後DATファイル
ttp://bcmnhp1.hp.infoseek.co.jp/ctdata2_b.txt
一体なにが起きているんでしょうか?
0691nobodyさん
04/09/24 21:55:07ID:???ここで改行削除されてないから。
こうするとよくわかるんじゃない?
foreach $_ ( @count ) {
print COUNT "[$_:]";
}
foreach $_ ( @ip ) {
print COUNT "[$_:]";
}
0692689
04/09/25 08:34:52ID:???おぉ!出来ました!ありがとうございました!
0694nobodyさん
04/09/25 13:47:46ID:???test
というキーがあるかないかを調べるにはどう書くのが一番ですか?
if ( map/^test$/,keys %hash ) {
print "ありました";
}
もっと簡単な方法はありますか?
0696nobodyさん
04/09/25 14:13:17ID:???お前・・・・
最適化する時間も、才能も、素質も、スキルも・・・・・・・ないorz
そんなとき、そんな俺でも読みやすいソースにしたいっていってんだよボケ!
出直してこいや
0697nobodyさん
04/09/25 14:41:12ID:???0698nobodyさん
04/09/25 16:48:19ID:???if ($a == 1 and $b == 1 or $c == 1) {print 'ok'}
if ($a == 1 && $b == 1 || $c == 1) {print 'ok'}
if (($a == 1) * ($b == 1) + ($c == 1)) {print 'ok'}
if ($a == 1 and $b == 1) {print 'ok'} elsif ($c == 1) {print 'ok'}
視認性は、全体のアルゴリズムとコメントで解決するのが一番で、
if文をどう記述するかは二の次だと思うんだけど?
0699nobodyさん
04/09/25 17:03:11ID:???見易さ(=見た目スッキリ)と読みやすさ(=処理内容のつかみやすさ)は別でしょう。
話の流れを追っても、あなたがどっちを優先したいのかがもひとつ見えないよ。
ここの人に最適化してもらうよりも、自分がわかりやすいと思うコード・記述に
しとけばいいと思うんだけどな。適度に冗長性を確保するのも大事だろうし。
>>698も書いてるけど、コメントのほうで整理しとけば条件文が長いことぐらいは
気にならないと思う。
と、>>686が一瞬「三浦理恵子」に見えた人が書いてみる。
0700683 696
04/09/25 18:11:58ID:f8iWY7is>見易さ(=見た目スッキリ)と読みやすさ(=処理内容のつかみやすさ)は別でしょう。
>話の流れを追っても、あなたがどっちを優先したいのかがもひとつ見えないよ。
別なの?同じだと思ってた。
一番いいのはスキルアップして、最適なコーディングを瞬時にできるようになることなんだけど、
実際Perlばかりに時間を割けないので、とりあえず見やすさ&&読みやすさ%%把握しやすさだけ
なんとかならないかなと思って。
もちろん最適なコーディングに勝るものは無理だけど、少しはいい書き方ってあるのかなと。
いわゆる改行の入れ方、スペースの明けかた、揃え方。
まああいまいすぎだよね。絶対的な回答ではなく、みんなの習慣的な書き方の解答とかが
ほしかったけど・・・しつれいしますた。
0701nobodyさん
04/09/25 19:43:11ID:???0702nobodyさん
04/09/25 20:26:15ID:???0703nobodyさん
04/09/25 21:16:28ID:???少なくて意味がわからんかったときは時間かぐっとかるが、
多めなのは読み手が消せばいいだけだから問題ないし。
アルゴリズムの問題は書法の範囲の記法とは別次元だわな。
それは非常に大きな課題だし。
0704nobodyさん
04/09/26 18:13:38ID:tuEyJcFU・テキストの中から<div align="left">という文字列が含まれる行を探す
・みつかった<div align="left"> の行から、その次の </div> までのテキストを
抜き出してprintする
-<div align="left"> はテキスト中に1つのみです。
-</div> は何度も出てきます。
現状 @stringlist に突っ込んで、行数固定で抜き出していますが、
これだと(動的に生成されるページである為)内容が変わってしまうと
対応できません(当たり前)^-^;
よい方法があればお教えくださいm(_ _;)m
0706704
04/09/26 18:31:00ID:tuEyJcFUいま、こんなかんじです^-^;
--------------------------------------------------
#!c:\perl\bin\perl.exe
open(IN, "bin.html") || die "cannnot open!\n";
@stringlist = <IN>;
#読み出す行数
$end = 10;
for ($begin=1;$begin<$end;$begin++){
print @stringlist[$begin];
}
close(IN);
--------------------------------------------------
0707704
04/09/26 18:31:31ID:???0708なちじょあ ◆yEbBEcuFOU
04/09/26 18:51:12ID:???$text =~ s|.*<div align="left">(.*?)</div>.*|$1|s;
0709704
04/09/26 18:53:56ID:???2.$end = 1の行数から検索を開始して</div>が見つかった行数を返す
で、実現できそうな気がするのですが、
・配列から任意の文字列を含む行を探す
・別の文字列を含む行を、特定の行(1で見つけた行)以降で探す
方法はないでしょうか。
0711704
04/09/26 19:01:06ID:???2行ーッ!!!??
バチーリですた。
なちじょあ ◆yEbBEcuFOU マスター。
でも何やってるかびっくりするぐらいさっぱりです。
…<div align..> と、</div> 行を含んだものを出すには、どこを
どういじればよいのでしょうか。
現状--------------------------------------------
open(IN, "bin.html") || die "cannnot open!\n";
@text = <IN>;
$text = join('', @text);
$text =~ s|.*<div align="left">(.*?)</div>.*|$1|s;
print $text;
---------------------------------------------------
0712704
04/09/26 19:19:13ID:???$text = join('', @text); #''という文字列で区切って挿入。1行に纏めたんスねマスター。
$text =~ s|.*<div align="left">(.*?)</div>.*|$1|s; # ~ <^-^;???
0713nobodyさん
04/09/26 19:24:45ID:???「出力されてるのは <div 〜>(かっこの中身ですか)</div> ?」と思いながら
ぐりぐりしてみましょう。
というか、正規表現って何なのさと思いながら激しく調べてみてください。
0714704
04/09/26 20:35:15ID:???↑この行がさぱりです。
$text =~ s :$textの中身を置換する
| :or
.* :拡張子は問わない??
まず、なぜ 置換とそれ以降がorで分けられるのでしょうか??
0715704
04/09/26 20:51:59ID:???.*<div align="left">(.*?)</div>.*
これの意味がなんとなくわかりますた!
拡張子全然関係ないですねm(_ _;)m
-----------------------------------------------------------------
任意の文字列の後に<div align="left">がきて(?不明)<div>がきて、
その後にまた任意の文字列
-----------------------------------------------------------------
で、あっていますか?
0716nobodyさん
04/09/26 21:02:51ID:???0717nobodyさん
04/09/26 23:16:27ID:???外部ファイルの、改行の3つ目まで読み込む
にはどんな手順を踏めば出来ますか?
0719717
04/09/27 00:18:45ID:???0721nobodyさん
04/09/27 01:15:18ID:???http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k08.htm
これを読みながら逆上がり10回出来ればわかると思うよ
0722nobodyさん
04/09/27 01:23:16ID:???0724nobodyさん
04/09/27 01:31:14ID:???サリー・セイント・フォードか。
これは偶然なんですか!
0725nobodyさん
04/09/27 01:31:37ID:???0726nobodyさん
04/09/27 01:36:46ID:???1000行なんかなにも気にする必要ないぞ?
ファイルサイズ 50k とかでしょ?
10万行とかいかない限り、気にしてもしょうがない。
0727nobodyさん
04/09/27 04:34:02ID:77N/SlLLPerlのデータ受け取りに関しての質問です。
<input type="hidden" name="com" value="$in{com}">
の$in{com}部分に、改行を入れても、一般的に問題はないでしょうか?
htmlに
<input type="hidden" name="com" value="あ
い
う
え
お
">
のように記述しています。
あ\nい\nう\nえ\nお\n
のようにデータを受け取ってくれますでしょうか?
0728nobodyさん
04/09/27 04:42:38ID:???0731nobodyさん
04/09/27 10:56:24ID:???0732nobodyさん
04/09/27 11:16:10ID:???とりあえずこんなとこだろう
opendir(DIR, $some_dir) || die "can't opendir $some_dir: $!";
@filenames = readdir(DIR);
closedir DIR;
0734nobodyさん
04/09/27 15:47:48ID:???(Googleの次のX件とかみたいの)どういう風に組めばいいのかさっぱりわかりません。
参考になりそうなソースとかないでしょうか?
0735722
04/09/27 16:50:03ID:???出てきた出てきた^^;ググルって要らないサイトばっかマッチする糞検索鯖だと思ってました(ショボーン
>729>730
ものすごく簡潔で驚きました^^;;;
0736nobodyさん
04/09/27 17:01:46ID:???0737nobodyさん
04/09/27 17:30:22ID:???0738nobodyさん
04/09/27 18:11:02ID:???帰れ^^;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;;;;;;;;;;;;;;;;;;;;;;
0739nobodyさん
04/09/27 18:48:57ID:???サブルーチンからハッシュを返す方法がどうにもわかりません。
いろんなサイトをググってみたのですが、実際に試しても上手くいませんでした。
---------------------------------------------
%hashA = ("aaa","0","bbb","1","ccc","2") ;
%hashB = &hash_return() ;
print %hashA ;
print "\n";
print %hashB ; #←渡ってないので何も表示されない・・・(´・ω・`) ショボーン
sub hash_return{
%hoge = ("aaa","0","bbb","1","ccc","2") ;
return \%hoge;
}
---------------------------------------------
0740nobodyさん
04/09/27 19:02:52ID:???%hoge = ("aaa","0","bbb","1","ccc","2") ;
return \%hoge; #★★★ この \ を取れクズ野郎 ★★★
}
0741nobodyさん
04/09/27 19:06:26ID:???0742nobodyさん
04/09/27 19:06:40ID:???うざい氏ね^^;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;;;;;;;;;;;;;;;;;;;;;;
:イラネ(・△・)
0744nobodyさん
04/09/27 19:11:13ID:???教えて!偉い人!
0745nobodyさん
04/09/27 19:32:56ID:j0XZIPtZ$#hoge だとエラーになります
0747nobodyさん
04/09/27 20:34:39ID:???100の1
1000の2
100の3
500の1
1000の1
500の2
100の2
みたいに数字と日本語が混ざったデータを
100の1
100の2
100の3
500の1
500の2
1000の1
1000の2
にしたいのですが、<=> cmp どちらでやってもこのようになりません(当たり前なんですが…)。
どうやったらこんなソートが出来ますか?
0748nobodyさん
04/09/27 20:44:35ID:kQMIC0Dwmy $seieki;
$seieki++;
print "$seieki";
}
とやると毎回、$seiekiが1になります。
my $seieki;
の部分、一般的には、$seieki=0;とするのが普通でしょうか?
my〜は数値をリセットするためにも使用するものなのでしょうか?
詳しい方がいたら教えて下さい。
0749747
04/09/27 21:01:06ID:???100の1
1000の2
を
100.1
1000.2
のように日本語の部分を小数点にしてソートしてあとで小数点を日本語に戻しました。
もっといい解決策がありましたら教えてちょ。
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してあって
動いてたなら
世界はもっと平和だったのに
■ このスレッドは過去ログ倉庫に格納されています