Perlコーディング初心者質問スレ Part 49
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/05/31(水) 04:32:28ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0437nobodyさん
2006/06/11(日) 16:07:20ID:???0438434
2006/06/11(日) 16:16:01ID:aFjDPMnZ@logs=<FP>;
close(PF);
foreach $line(@logs) {
chop($line);
($atai1,$atai2,$atai3,$atai4,$atai5,$dat,$value,) = split(/\,/,$line);
if (!$line){last;}
"<TABLE border=\"1\" align=\"center\"><TR><TD>\n".
"$atai1/$atai2/$atai3/$atai4/$atai5/$dat<br><br>\n".
"$value\n".
"</TD></TR></TABLE><br>\n\n";
}
一応、ここまでは何とか分かっているのですが、この「$atai1〜$atai5」の値を全て足すには。。。。
foreachの間に「$tasu = $atai1+$atai2+$atai3+$atai4+$atai5;」と書いてみましたが、全然駄目でした・・・
正直、自分の頭では・・・・・
0439nobodyさん
NGNG0440nobodyさん
2006/06/11(日) 16:46:10ID:???教えていただいて申し訳ないのですが、このようにログが一番古いものしか、ちゃんと表示されません。。。。
http://ranobe.sakuratan.com/up/src/up113712.jpg
0441nobodyさん
2006/06/11(日) 17:23:33ID:???つまりあれか、その全てに同じ値、全体の合計を表示したいわけか。
それなら二段階に分ける必要がある。
事前に合計を調べた上で、その後に表示。
>>436
reduceの処理でmapを使うのはスマートに思えないな…
$sum += $_ foreach @list[0..4];
reduce処理にはmapを使ってもそう大差無い様に思うのだけれども
0442nobodyさん
2006/06/11(日) 17:28:59ID:???>一応自分で調べようと努力はしたのですが、検索しきれなくて・・・・・
ていうか、なんで考えないで検索しようとするんだろうね。
自分と全く同じ状況にあるコードの書き方なんて
検索してもなかなか出てくるもんじゃないのに。
0443nobodyさん
2006/06/11(日) 18:00:25ID:l/QD+3uq0444434
2006/06/11(日) 18:51:48ID:aFjDPMnZログファイルを2つに分けるってことでしょうか?・・・・ orz
ありがとうございます。やってみます。
>>442
「ファイル perl」、「open perl」等、とりあえずファイル関係で調べていました・・・ orz
0445nobodyさん
2006/06/11(日) 18:59:18ID:???> ログファイルを2つに分けるってことでしょうか?
そうじゃなくて、1つのログファイルから内容を読み込んだ後
1. 合計を求める foreach
2. 結果を表示する foreach
の2つのforeachを書く必要がある、という事だと思うよ。
0446nobodyさん
2006/06/11(日) 19:01:16ID:???>442は
>なんで考えないで検索しようとするんだろうね。
と書いているんだが・・・お前は日本語が読めないのか?
まず日本語がちゃんと理解できるように勉強し直せ。
0447nobodyさん
2006/06/11(日) 19:34:32ID:???0448nobodyさん
2006/06/11(日) 20:44:56ID:???my($total) = 0;
open(INFH, "test.txt");
while(<INFH>){
chomp;
my($tmpsum, $tmpstr);
my(@data) = split(/,/, $_);
my(@nums) = splice(@data, 0, 5);
map { $tmpsum += $_ } @nums;
$total += $tmpsum;
$tmpstr = join("/", @nums);
print <<"EOM";
------------------------------
$data[0]
$tmpstr = $tmpsum Points.
$data[1]
EOM
}
close(INFH);
print "------------------------------\n";
print "TOTAL : " . $total . "\n";
print "------------------------------\n";
0449nobodyさん
2006/06/11(日) 21:42:55ID:???sub test {
$a = 5
}
sub test2 {
print "値は$aだお\n";
}
みたいなノリで、”test”サブルーチン内の変数を”test2”のサブルーチン内で使うことってできる?
上のだとうまく行かなくて…
0450nobodyさん
2006/06/11(日) 21:57:42ID:???パッケージ変数(グローバル変数)を使う時はなるべく our で宣言しておいた方がわかりやすい。
後々「use strict;」を覚えた時にこの事は役に立つはず。
our $a = 0;
sub test { $a = 5; }
sub test2 { print "値は$aだお\n"; }
test();
test2();
実行結果:値は5だお
ところで、 $a と $b はソートに使う特殊な変数なので、なるべく使わない方がいいよ。$c 以降は問題ない。
0452nobodyさん
2006/06/11(日) 23:50:12ID:???0453nobodyさん
2006/06/12(月) 00:00:13ID:???ただしドメインの例示だけはexample.com
0454nobodyさん
2006/06/12(月) 01:00:03ID:???0455nobodyさん
2006/06/12(月) 01:01:25ID:???foo bar だと baz, qux, quux, corge, grault, garply, waldo, fred, plugh, xyzzy, thud とかあるんだけど
0456nobodyさん
2006/06/12(月) 01:02:57ID:???初めて知った
0457nobodyさん
2006/06/12(月) 01:12:21ID:???それともただ"ほげほげふがふが"?(ダレてるときの擬音??)
そういえば変数名でよくみかける$lnがピンとこない。
$imgとか$cntだったらパッとみて内容を想像できるんだけど
lnは何を略してるんですか!!
入ってる内容から察するにlineですかね?(´・ω・`)
0458nobodyさん
2006/06/12(月) 01:29:00ID:???もう一つだけならpiyoかmogeか、かな。しかしあわせて検索すると恐ろしく件数が減る罠
>>456
RFC3092読んどけw
0459nobodyさん
2006/06/12(月) 01:33:49ID:???っていうやりとりに繋がっちゃうか恐れてたけど無駄に終わってよかったですw
0461nobodyさん
2006/06/12(月) 03:44:18ID:???そうか、piyo か。
メタ構文変数 http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BF%E6%A7%8B%E6%96%87%E5%A4%89%E6%95%B0 とか言うんだなw
hoge fuga piyo で、hogehoge fugafuga piyopiyo とか重なってくのが通例みたいね。
hogera とか mogeta とか使ってみたす。
0464nobodyさん
2006/06/12(月) 17:44:14ID:m4uvfRE1配列@sclArrayには
@sclArray = (●●大学,△△大学,●●大学,□□大学,●●大学,XX高校・・・);
というような形で200種、1,000件くらいの学校名が入っています。
これを
%schHash = (
●●大学=>'15',
△△大学=>'8',
□□大学=>'7',
XX高校=>'14',
・・・
);
という形にしたいのですが、根本的にやりかたがわかりません。
調べ方が悪いのかgoogle様にお伺い立てても出てきません・・・
よろしくお願い致します。
0465nobodyさん
NGNG0467nobodyさん
2006/06/12(月) 18:11:03ID:???自分で考えろってこった。
どうも考える事を放棄して、ぐぐってる人が多いよね。
0468278
2006/06/12(月) 19:04:02ID:???前回、配列にするということでご指導頂き、ソートはできました
それでなんですが、実はもう一個keyがあって揃えたいのです
最初は日付でソートし、同じくキャラクターのものを並びにし、
20060612 a
20060520 a
20060610 b
20060423 c という感じにしたいのです
二回繰り返すと最初のソートがリセットされてしまいます
何か方法はあるのでしょうか?
foreach(@data){
push @{$list{$1}},$_ if/^<>inf<>--.*<>(\d*)<>----/ ;}
foreach $key (sort keys %list){
push @htm, @{$list{$key}};
}
foreach(@htm){
push @{$list2{$1}},$_ if/^<>inf<>--(.*).*<>----/ ;}
foreach $key (sort keys %list2){
push @htm2, @{$list2{$key}};
}
0469nobodyさん
2006/06/13(火) 00:52:20ID:???大学ごとに固有の識別番号が決まっているのでしょうか?
それとも入試合格ラインの偏差値のようなデータ?
大学名と番号の対応が、名称から番号を導けるような規則性を持っていないのなら、
元となるデータなしに自動的に番号の入ったハッシュを作るのは不可能なんじゃないですか。
その対応はExcelの表かコンマ区切りテキストか何かの形で手元にあるのですか?
0470457
2006/06/13(火) 01:17:24ID:???なるほど。コード読むとき少し楽になりそうです。アリトゥース!!
>>464の数字は配列内での同じ学校名の登場回数と推測。
けどおれのスキルでパッと思いつくのはパターンマッチごにょごにょ・・・
ハッシュのキーごとにインクリメントごにょごにょ・・・が精一杯orz
↑まったく当たっていないかも
0471nobodyさん
2006/06/13(火) 05:43:37ID:???同時に比較すればいいんでね?
my @arr = qw(
foo-1 bar-2 baz-3 qux-4
quux-1 corge-2 grault-3 garply-4
waldo-1 fred-2 plugh-3 xyzzy-4 thud-5
);
my @new_arr =
map { $_->[0] .'-'. $_->[1] }
sort { ($a->[1] == $b->[1]) ? $a->[0] cmp $b->[0] : $a->[1] <=> $b->[1] }
map { my ($k, $i) = split (/-/); [$k, $i] } @arr;
$, = "\n";
print @new_arr;
exit;
誰かもっといい方法あったらおせーて orz
0472nobodyさん
2006/06/13(火) 06:10:34ID:???とりあえずこれ。
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#how_do_i_sort_an_array_by__anything_
ググればもっといいドキュメントが出てくる。
0474468
2006/06/13(火) 12:07:21ID:???これは難しい・・・
0475468
2006/06/13(火) 12:34:52ID:???1行のラインが
<>a<>b<>c<>d<>e
という風に、要素が<>で区切られ、それが格納された@dataがあるとします
この中の2つの要素でソートしたいのです、要素には同じ値もあります
2つのkeyをどういう風に考えハッシュを作ったらいいのでしょう?
大変初歩的で申し訳ありませんが、リンク先をプリントしていくら
読んでも簡単に理解できません。
0476nobodyさん
2006/06/13(火) 12:55:07ID:???無理を承知でお願いします。
どうかうちのバカ息子に因数分解を教えてやってくれませんか?
何度教科書を読んでも理解できないって言うんです。
そのくせ、友達が「こうじゃない?」って親切にヒント出してくれてるのに
無視したりするような非常識な子で…でも、根は優しい良いコなんです。
ちなみに、息子は足し算と引き算はできるらしいんですが
掛け算と割り算はよく分かってないようです。
だから、まず掛け算から教えて欲しいそうです。
おそらく相当な時間が掛かると思いますが、
どうかタダで息子が納得できるまでお付き合い下さいますようお願い申し上げます。
0477nobodyさん
2006/06/13(火) 13:15:40ID:???> リンク先をプリントしていくら
> 読んでも簡単に理解できません。
理解できるまで何百回でも読んでください。
0478nobodyさん
2006/06/13(火) 13:21:15ID:???結果としては >>471 で既にできてるじゃんな。それすら理解してないのかね?
0479468
2006/06/13(火) 14:10:46ID:???0480464
2006/06/13(火) 18:12:16ID:???その大学名の出現回数をハッシュにしたい」でした。
質問が悪くてごめんね。
>>466であっさりできました。
ありがとう。
0481nobodyさん
2006/06/13(火) 22:03:14ID:???少しはググった?
「perl sort 複数 項目」でぐぐれば、コピペプログラミングできる程度の情報が出てくる。
0482nobodyさん
2006/06/14(水) 00:39:55ID:???他人が見ても何をやってるか分かるプログラムを書きたいのですが、汚い書き方が身についてしまい困ってます。
簡単なBBS程度のものだと助かります。
0484nobodyさん
2006/06/14(水) 01:20:32ID:???use strict; しつつCPANモジュールを駆使したCGI。
Tropy のソースはタイ変数が使われてて面白い。
http://www.hyuki.com/tropy/
YukiWikiMini は200行ぐらいでWiki書いてる。こちらもなかなか。
http://www.hyuki.com/yukiwiki/mini/index.html
コメントが少ないから、ちょっと難しいかも。
0486nobodyさん
2006/06/15(木) 12:01:24ID:???#!/usr/bin/perl
require './lib.pl';
&test;
[ lib.pl ]
sub test{
print "Content-type: text/html\n\n";
print "test";
}
↑500エラーになる。
[ main.cgi ]
#!/usr/bin/perl
sub test{
print "Content-type: text/html\n\n";
print "test";
}
&test;
↑エラーにならない
requireで読み込むと必ずエラーになってしまうのですが、どうしてでしょうか?
0487nobodyさん
2006/06/15(木) 12:08:41ID:???1;か。
0488sage
2006/06/15(木) 21:58:51ID:gFTNSvnGPerlで
print $cgi -> header(-charset=>"EUC-JP");
と記述したのですが、作ってブラウザーでみると
文字化けしてます。。。
ブラウザーの「表示」→「エンコード」を見ると
西ヨーロッパ言語が設定されてます。。。
これをEUC−JPに直すと文字化けしないのですが、
どうやれば、最初から文字化けしないようにできるのでしょうか?
0489nobodyさん
2006/06/15(木) 22:14:33ID:???多分、HTMLの出力もCGIモジュールを使ってると思うんだけど、出てきたHTML見て見れ。
start_htmlのほうで何も指定しないとlang=en-USのcharset=iso-8859-1になる。
ということで
start_html(-encoding => "EUC-JP", lang => "ja")
0490nobodyさん
2006/06/15(木) 22:18:23ID:???0491489
2006/06/15(木) 22:27:19ID:???ところでふと気づいたけれど、CGIモジュールって
Content-Typeのmetaタグよりtitleのほうが先に来ちゃうのね。
エンコーディングの指定を一番最初に書くことが推奨されてたと思ったけれど・・・
0492nobodyさん
2006/06/15(木) 22:27:38ID:???別にそれでいいじゃん
それぐらい手前で出力しろとか思うわけよ
0493nobodyさん
2006/06/15(木) 23:08:38ID:???なんか文字化けしたままなんですが。。。
レスついたことに(^人^)感謝♪
いわれた辺りをいじってみます。
ありがとうございました。
-------
print $cgi -> header(-cahrset=>"EUC-JP");
print $cgi -> start_html(-title=>$title,
-BGCOLOR => $bg,
-TEXT => $fg,
-encoding => "EUC-JP",
-lang => "ja",
);
-----------
といいつつ
ソース載せてみた。。。orz
0495nobodyさん
2006/06/16(金) 00:24:31ID:???$check = 'デイレクトリ名/ファイル名';
if (-e $check){
&sonzai
}
上記のようにしてやってみましたがどうもifをスルーしてelseのルーチンばかり実行してしまいます。
0496nobodyさん
2006/06/16(金) 01:15:09ID:???0498nobodyさん
2006/06/16(金) 05:13:12ID:???0499nobodyさん
2006/06/16(金) 08:01:47ID:???0500nobodyさん
2006/06/16(金) 08:42:03ID:???0501nobodyさん
NGNG0502nobodyさん
2006/06/16(金) 08:53:11ID:???マルチバイトのファイル名をつける超絶バカは居ないでしょ…
0503nobodyさん
2006/06/16(金) 09:06:03ID:???マルチバイトのファイル名を扱う業務も普通にあるぞ。
もちろんフリーソフトを使って英数字にリネームしてから作業しても構わないわけだが、
全部Perl一本で済ませたいタイプの俺としては非常に面倒いのだ。
0504nobodyさん
2006/06/16(金) 09:07:12ID:???皆さんって最初の大まかな処理分岐ってどうやってますか?
今、テストで1関数で1ファイルで作って
eval{
require '$in{exec};'.'.pl';
&$in{exec};
}
の様に呼ぼうかと思ってるのですが(エラー処理とかばっさり切って略記しました)、
この考え方よらもスマートなやり方があったら教えて頂ければ幸いです
0505nobodyさん
2006/06/16(金) 09:23:19ID:???0506nobodyさん
2006/06/16(金) 09:31:11ID:???まぁperlsynでも読めみたいな。
0508nobodyさん
2006/06/16(金) 10:18:29ID:???0509nobodyさん
2006/06/16(金) 10:20:03ID:???長くなってもわかりやすければそれに越したことはないし、
作成したスクリプトを他人が触る可能性があれば
その方が管理委託しやすいしね
0510nobodyさん
2006/06/16(金) 10:25:22ID:???まあKENTがアレなのは認めるし笑えるんだが、
if 文や local 自体は全然悪くないぞ >>504!
うちには関数 (サブルーチンのことだと解釈したが) ひとつひとつを1ファイルにするとかのが面倒でありえないw
0511nobodyさん
2006/06/16(金) 10:34:11ID:???0512nobodyさん
2006/06/16(金) 12:51:25ID:???サブルーチンを使い回しまくっていると、結局条件分岐
を入れ込む回数が増えて大変だから
HTMLの構文エラー等はなくして欲しいけど
0513nobodyさん
2006/06/16(金) 13:21:21ID:???0514nobodyさん
2006/06/16(金) 13:25:39ID:???0515nobodyさん
2006/06/16(金) 13:57:10ID:???thx 見たことなかったので見てきた。
すごいなこれw
KENTは perl4 とか過去のでも動くように、とかでしょうがないのかなとも思っていたけど、
ここは1年前作った 5.6 以上推奨のでもまったく同じ書き方でしたw
まあわかりやすいっちゃわかりやすい・・・のかな。
0516nobodyさん
2006/06/16(金) 14:18:31ID:???妙にレスポンスだけは良かったりするから困るw
0517nobodyさん
2006/06/16(金) 14:48:05ID:???簡単なものならフルスクラッチしたほうが早い場合もあるし。
0518nobodyさん
2006/06/16(金) 15:16:01ID:???$timp =~ m/^\s*(.*)\s*$/g;
$timp = $1;
というふうにやると $timp が空になってしまいます。
どうしたらよいでしょうか。
0519nobodyさん
NGNG0520nobodyさん
2006/06/16(金) 15:22:19ID:???0522nobodyさん
2006/06/16(金) 16:29:57ID:???今は 出力する前に
if( $flag==1 ){ open(NKFOUT, "| nkf"); }
とやっておいて、出力時に
if( $flag==1 ){ print NKFOUT "ちんこ"; }
else { print "ちんこ"; }
とやろうと思うのですが、ちょっと
0523nobodyさん
2006/06/16(金) 16:34:42ID:???$timp =~ m/^\s*(.*)\s*$/g;
$timp = $1;
というふうにやると $timpo が空になってしまいます。
どうしたらよいでしょうか。
0524nobodyさん
NGNG0525nobodyさん
2006/06/16(金) 16:37:56ID:???正直嬉しかったぞw
0526ヽ(´ー`)ノ ◆.ogCuANUcE
2006/06/16(金) 16:46:15ID:???if ($flag == 1) {
open(my $orig_stdout, '>&STDOUT');
open(STDOUT, '|nkf');
}
# パイプを通して出力
print "ちんこ";
# そのまま出力
print $orig_stdout "ちんこ";
perlfaq5 にある How do I dup() a filehandle in Perl? か、
perlfunc -f open を読むと良い。
0527nobodyさん
2006/06/16(金) 16:59:43ID:???ありがとう。それを参考に
if( $flag==1 ){ open(STDOUT, "| nkf"); }
とやったらだいたいうまくイキました。
0528nobodyさん
2006/06/16(金) 17:31:55ID:???で送ったFと
<input type="text" name="F" value="">
に & を入れて送ったF
って違いますよね?
0529nobodyさん
2006/06/16(金) 17:33:13ID:???&→&
0530nobodyさん
2006/06/16(金) 17:36:21ID:???HTMLなら表示されてる通り送られると思う普通。
0531nobodyさん
2006/06/16(金) 17:45:41ID:???試せばすぐ分かることに対してまじめに答える気にはならん
0532nobodyさん
2006/06/16(金) 17:46:42ID:???use strict;
print "Content-type: text/html\n\n";
my $buffer;
read(\*STDIN, $buffer, $ENV{'CONTENT_LENGTH'},0);
print <<END;
$buffer
<form method="post">
<input type="text" name="111" value="&"><br>
<input type="text" name="222" value=""><br>
<input type="submit">
</form>
END
exit;
下のフォームに&と入れて送信するとあら不思議。
同じような挙動をする文字を知りたいんですがどこかにドキュメントありませんか?
0533nobodyさん
2006/06/16(金) 17:49:12ID:???○<input type="text" name="111" value="&&"><br>
0534nobodyさん
2006/06/16(金) 17:49:56ID:???◎<input type="text" name="111" value="&"><br>
0535nobodyさん
NGNG0536nobodyさん
2006/06/16(金) 18:16:46ID:???$hogeにはブラウザから送られてきたのをデコードしただけの物が入っていて、
print <<END;
<form method="post">
<input type="text" name="hoge" value="$hoge"><br>
<input type="submit">
</form>
こんなことをやって、&が入っていたら&に変わっちゃう…とかいう理由での質問なんじゃないか。
HTMLに流し込む前に実体文字参照に変換汁。
$hoge =~ s/&/&/g;
$hoge =~ s/</</g;
$hoge =~ s/>/>/g;
$hoge =~ s/"/"/g;
# というかこれを知らないなら、頼むから公開するCGIなんか作らないでくれよ…
# XSS脆弱、下手するとScript Insertion脆弱だから…
■ このスレッドは過去ログ倉庫に格納されています