Perlコーディング初心者質問スレ Part 44
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/10/17(月) 00:47:17ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0496493
2005/11/18(金) 16:18:46ID:???データ数1024よりも多くして実験してなかった・・・こちらでは2050付近で抜かれた
>>495
詳しい検証乙
データ数が増えるとkeysの戻り値の配列の大きさがネックになるわけか
0498nobodyさん
2005/11/18(金) 16:49:18ID:???こういうのはどこで言えばいいんだろ(´・ω・`)
0499nobodyさん
2005/11/18(金) 17:03:10ID:b/mBx1Hf@list = (['key' => 'val'], ...);
これで値をセットしたときってどうやって取り出すんでしょうか?
for(my($i) = 0; $i < $#list; $i += 2){
my($key, $val)= ($list[$i], $list[$i + 1]);
〜処理〜
}
って感じですか?
>>485, 486
ちょっと使い方を覚えてみようかな
>>488
そうやって値をセットしたときの取り出しはどうやるんでしょか?
0500nobodyさん
2005/11/18(金) 17:07:32ID:???その要求が通るとは到底思えないが、弾の人にでもメールしてみたらぁ?
>>499
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldsc.html
0501nobodyさん
2005/11/18(金) 17:25:13ID:b/mBx1Hf慣れるまでに時間かかりそうですが、ありがとうございました m(_ _)m
0502nobodyさん
2005/11/18(金) 17:35:46ID:b/mBx1Hf@list2 = (
{'audio' => "オーディオ"},
{'video' => "ビデオ"},
{'cd' => "CD-ROM"},
{'dvd' => "DVD"},
{'bench' => "ベンチマーク"},
{'text' => "テキスト"},
{'bin' => "バイナリ"}
);
foreach (@list2){
my($key, $val) = each(%$_);
print "$key => $val\n";
}
順番を保持しなくちゃならないときはこんな感じでいこうかなって思います。
0503nobodyさん
2005/11/18(金) 17:40:35ID:???ちなみに
>>485 みたいに配列使うなら
foreach my $elem (@list) {
my($key, $val) = @$elem;
}
で行ける。
>>502 のやり方だと要素が1つだけのハッシュがいくつか出来てしまうので
少しだけ空間効率が悪い。
まぁ、小さいから気にならないだろうけど。
0504nobodyさん
2005/11/18(金) 17:45:08ID:b/mBx1Hfおぉ〜、そのやり方のほうがスマートな気がする。
いやはや勉強になります。
0505nobodyさん
2005/11/18(金) 18:15:21ID:???「ハッシュはリストである」ということを知っていれば、簡単にわかる。
@foo = (1,10,2,20,3,30);
%bar = @foo;
print "$_ -> $bar{$_}\n" foreach keys %bar;
0506nobodyさん
2005/11/18(金) 18:15:31ID:lIGSV4IR【5.1登場】PHP時代到来 他言語終了【Perl即死】
http://pc8.2ch.net/test/read.cgi/php/1129715894/842
842 名前:nobodyさん[sage] 投稿日:2005/11/18(金) 18:05:46 ID:???
PerlはKE★Tの糞コードのせいで全てが終わった
0507nobodyさん
2005/11/18(金) 18:29:06ID:???続きはこっちでやって
http://pc8.2ch.net/test/read.cgi/php/1078991985/l50
いちいち解説してられないから
0509nobodyさん
2005/11/18(金) 18:32:14ID:EJTafLuMぐぐっても九行で書かれたP2Pしか出てこなくてorz
0510nobodyさん
2005/11/18(金) 18:53:23ID:???デバッグに必要なのは「P2Pアプリを作成するチュートリアル」ではなくて
Perl のマニュアルではないのか? >>7-8
0511nobodyさん
2005/11/18(金) 19:03:33ID:???すいません。やりたいことの整理が出来てませんでした。
新月作者がPerl版の開発を放棄してるので、余分な機能を付与しない掲示板だけのP2Pソフトを作りたいんです。
ただP2Pアプリを弄ったことがないものでどうしたものかなと。
ソース読んで改造するのがてっとりばやいにしても概念が分からないので・・
0512nobodyさん
2005/11/18(金) 19:09:55ID:???pdfで流れてる
0514nobodyさん
2005/11/18(金) 19:28:27ID:???概念や基本的な設計に関してはスレ違いだし、Google さんにでも
尋ねた方が早そう。具体的に Perl でのやり方となると改造ベース
が転がってるんだからソース読みながら学んだ方が効率いいわな。
コレだよね?
http://prdownloads.sourceforge.net/shingetsu/shingetsu-0.5b5.tar.gz
あと CPAN にはこういうのがあるね。
http://search.cpan.org/~klimkin/P2P-pDonkey-0.05/
0516nobodyさん
2005/11/19(土) 22:11:13ID:???0517nobodyさん
2005/11/19(土) 23:26:30ID:???0518nobodyさん
2005/11/20(日) 00:14:24ID:???インストール成功したかの確認方法ってありますか?
0521nobodyさん
2005/11/20(日) 00:20:29ID:???0522nobodyさん
2005/11/20(日) 00:47:10ID:???0523nobodyさん
2005/11/20(日) 01:29:36ID:q2W9WK5M0524nobodyさん
2005/11/20(日) 01:54:09ID:???0525nobodyさん
2005/11/20(日) 02:34:35ID:???変数名をループで作り出すにはどうすればいいのでしょうか?
my $chk0 = param('chk0');
↑の数字をforループでインクリメントして宣言するにはどうしたらいいでしょうか?
0527nobodyさん
2005/11/20(日) 19:45:49ID:???で、得点順に順位をつけるんだが、同点の場合同じ順位にし、次の順位は飛ばすって事ができなくて詰まっている。
現在は配列をforループし、$iをインクリメントして順位としている。
何かいい方法は無いだろうか。
0530nobodyさん
2005/11/20(日) 20:30:19ID:???既に回答を用意してる漏れがはっきり言ってやろう
> 名前1->得点1 名前2->得点2 っていうような配列があり
ここが意味不明。
以下に漏れが適していると考えたデータ構造とそのソースを貼ったるから
これで満足できないならちゃんと伝わるように説明汁
my %name2score = (hoge => 100, fuga => 90, hage => 100);
my %score2name;
foreach my $name (keys(%name2score)) {
push @{$score2name{ $name2score{$name} }}, $name;
}
my $rank = 1;
foreach my $score (sort {$b <=> $a} keys(%score2name)) {
foreach my $name (@{$score2name{$score}}) {
printf "%2d: %s(%3dpt)\n", $rank, $name, $score;
}
$rank += @{$score2name{$score}};
}
0531nobodyさん
2005/11/20(日) 20:35:37ID:???0532527
2005/11/20(日) 20:46:03ID:???thx
考え方さえわかれば後は自分で弄れると思いましたので、データ構造を適当に書いてしまいました。
申し訳ありませんでした。
あ、>>529は自分ではありませんので、念のため。
0536nobodyさん
2005/11/20(日) 21:01:02ID:???0537nobodyさん
2005/11/20(日) 21:23:44ID:???0538nobodyさん
2005/11/20(日) 21:32:49ID:???さっさと強制IDにしろよこの板
0539nobodyさん
2005/11/20(日) 21:33:46ID:???0540nobodyさん
2005/11/20(日) 21:35:51ID:???0542nobodyさん
2005/11/20(日) 21:39:20ID:???0544nobodyさん
2005/11/20(日) 21:41:55ID:???それよりム板も・・
0545nobodyさん
2005/11/20(日) 21:42:34ID:sql5orzi0547nobodyさん
2005/11/20(日) 22:45:33ID:Va/OuDM70548nobodyさん
2005/11/21(月) 01:50:14ID:???0549nobodyさん
2005/11/21(月) 02:08:53ID:???0550nobodyさん
2005/11/21(月) 02:12:55ID:???0551nobodyさん
2005/11/21(月) 03:36:00ID:m9z0lXWM純粋に順位を加えていく変数($i)と、状況に応じて順位を加えていく変数($j)の2つをつくる。
$iはループ中でひたすらインクリメントのみ。
$jは直前の人の点数と異なれば$iを採用する。 同じであれば$jをそのまま採用。
で出来ないかな?
0552nobodyさん
2005/11/21(月) 07:40:49ID:HZcu4vs3質問があります。
perlで$ENV{'PATH_INFO'}を取得しようとしていますが、
なぜか取得してくれません。
これはサーバー側の設定が影響しているのでしょうか。
ちなみに、他の環境変数については、正常に取得しています。
よろしくお願いします。
0554552
2005/11/21(月) 09:10:44ID:HZcu4vs3今やりたいことは、稼動中の掲示板の改造です。
$ENV{'QUERY_STRING'}からGETで取得している値を、
$ENV{'PATH_INFO'}から取得したいと思っています。
◆サーバー:ロリポップです。
◆コード
値を確かめるために、下のようなコードだけを記述したファイルを
アップし、適当な引数を付けてテストしていました。
print"Content-type: text/html\n\n";
print qq(
<HTML><HEAD><meta http-equiv=Content-Type content=text/html; charset=shift-jis>
</HEAD>
<BODY>
$ENV{'PATH_INFO'}
</BODY>
</HTML>
);
exit;
よろしくお願いいたします。
0555nobodyさん
2005/11/21(月) 09:19:28ID:???PATH_INFOを勘違いしてるって事は無いよね
テストに使ったURLはどういう形式?実在じゃなくていいから
0556nobodyさん
2005/11/21(月) 09:26:41ID:HZcu4vs3このような形式です。
http://ドメイン/bbs/index.cgi?room=1
よろしくお願いいたします。
0557nobodyさん
2005/11/21(月) 09:30:28ID:???getメソッドの取得はquery_stringのままでいいと思うけど、変更しないといけない理由は?
0558ヽ(´ー`)ノ ◆.ogCuANUcE
2005/11/21(月) 09:39:19ID:???それ、PATH_INFO 含まれてないし。とりあえず CGI.pm のドキュメント嫁。
OBTAINING THE SCRIPT'S URL と FETCHING ENVIRONMENT VARIABLES の path_info() のところ。
多分探せば日本語訳もある。
0559nobodyさん
2005/11/21(月) 10:31:19ID:HZcu4vs3何か私が勘違いをしているのでしょうかね。
ドキュメントを読んで見ます。
0560nobodyさん
2005/11/21(月) 11:37:26ID:5KZiaClrif(@abc[1] eq $name){&error}
@abc=split(/\,/,@aaa[1]);
if(@abc[1] eq $name){&error}
@abc=split(/\,/,@aaa[2]);if(@abc[1] eq $name){&error}
これを一行にしたくて@abc=split(/\,/,@aaa[0,1,2]);
if(@abc[1] eq $name){&error}
にしたんですけど機能しません
どこを直したらよいのでしょうか?
0561nobodyさん
2005/11/21(月) 11:44:26ID:???splitは配列を受けられない
見たところその処理はチェックのみで代入は不要?
(split(/\,/, $_))[1] eq $name && &error foreach @aaa[0,1,2];
こんな感じでどうだろ
0562nobodyさん
2005/11/21(月) 11:52:25ID:5KZiaClrレスありがとうございます
実際にはサブルーチンで代入します
すみません
使用目的は連続投稿を防ぐためで、ログファイルに同一内容があるのかチェックをしたいのです
0563nobodyさん
2005/11/21(月) 12:02:55ID:???@abc=split(/\,/,@aaa[0,1,2]);
のsplit(/\,/,@aaa[0,1,2]);の部分がサブルーチンの戻り値ということかな
期待する内容は(0の名前, 1の名前, 2の名前)という配列ということでOK?
それなら
map { +(split /,/, $_)[1] } @aaa[0,1,2];
とか。
でも、それは構造を考え直したほうが良いかも・・・
0565nobodyさん
2005/11/21(月) 12:29:45ID:???この辺参考にどぞー
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldsc.html
0566nobodyさん
2005/11/21(月) 15:57:20ID:???$ascii = '[\x00-\x7F]';
$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';
open (DATA, "<$log");
flock (DATA, 1);
@line = <DATA>;
close (DATA);
# $wordはフォームから受け取った検索対象文字列です
# 検索対象文字列はスペース区切りで複数設定可能にしてあります
$word =~ s/ | /\t/g;
&jcode::convert (\$word, "euc", "sjis");
@words = split (/\t/, $word);
foreach (@line) {
&jcode::convert (\$_, "euc", "sjis");
# ログはタブ区切りです
@data = split (/\t/, $_);
foreach (0 .. $#words) {
# &error ($words[$_]); # ※1
# $data[6]が記事の本文です
if ($data[6] =~ /^(?:$ascii|$twoBytes|$threeBytes)*?(?:$words[$_])/) {
# &error ($words[$_]); # ※2
検索文字に\を入れて※1の部分でエラーを出そうとすると正常にエラー画面に\が表示されるのですが、
※2で出そうとしても、その前にCGIエラーで落ちてしまいます。
下から2行目のif文内の$words[$_]に\が入った時点で落ちると思うのですが、
どのようにしたら正常に検索処理を行なえるでしょうか。
0567nobodyさん
2005/11/21(月) 16:06:06ID:???最低限そうしないと、いろいろ死ぬぜ?
0568566
2005/11/21(月) 16:19:18ID:???レスありがとうございます。
以下のように修正することで解決できました。
- @words = split (/\t/, $word);
+ @words = split (/\t/, quotemeta ($word));
0569nobodyさん
2005/11/22(火) 16:26:52ID:???オンラインのレンタルスペースにアップロードして稼動させようとしています.
ローカルできちんと動くスクリプトを組むまではOKだったのですが,
レンタルスペースで動かそうとすると,様々なエラーがでてしまいます.
レンタルスペースの仕様書を見て,使えないモジュールのチェックなどはもちろんですが,
ファイル名の大文字や小文字の判定など,他に気をつけることはありますでしょうか?
0570nobodyさん
2005/11/22(火) 16:36:17ID:???0571nobodyさん
2005/11/22(火) 17:10:04ID:???0572nobodyさん
2005/11/22(火) 17:18:46ID:???質問が少し漠然すぎたかもしれませんので,具体的な質問に変更します.
$year=2005,$month=11;
@allfiles=(haman200511,Amuro200511);
@persons=(Amuro,Quess,Char);
#指定された年月かつ,存在する人物のファイル名を取得
for my $file (@allfiles) {
for my $person (@persons) {
if($file eq "$person$year$month.dat"){
push(@files,$file);
}
}
}
0573nobodyさん
2005/11/22(火) 17:19:42ID:???SAJAX
http://www.modernmethod.com/sajax/
0574nobodyさん
2005/11/22(火) 17:21:11ID:???ローカル @files=(Amuro200511.dat);
レンタル @files=();
この箇所の挙動がレンタルとローカルで異なっています.
ローカルのPerlのVerは5.8で,レンタルのほうは5.6なのですが,
Verによる挙動の違いというようなものがあるのでしょうか?
訂正
@allfiles=(haman200511.dat,Amuro200511.dat);
0577nobodyさん
2005/11/22(火) 17:31:51ID:???CGI設置について質問 【Part2】
http://pc8.2ch.net/test/read.cgi/php/1104624784/
0579nobodyさん
2005/11/22(火) 17:53:28ID:eRlqTFqT@allfiles=(haman200511,Amuro200511);
@persons=(Amuro,Quess,Char);
↓
my($year, $month) = (2005, 11);
my(@allfiles) = ("haman200511", "Amuro200511");
my(@persons) = ("Amuro", "Quess", "Char");
0581nobodyさん
2005/11/22(火) 18:08:43ID:???0582nobodyさん
2005/11/22(火) 19:46:43ID:???0583nobodyさん
2005/11/22(火) 20:01:32ID:???0584nobodyさん
2005/11/22(火) 20:08:08ID:???0585nobodyさん
2005/11/22(火) 20:22:48ID:???use warningしてみましたが,状況は進展しませんでした.
>>579
実際のスクリプトではクォートしています.
抄写するにあたり,変数の中身を示しておこうと思い,
記述したときの手抜かりで,クオートし忘れました,申し訳ありません.
0587nobodyさん
2005/11/22(火) 20:35:50ID:???なんで誰も突っ込まないw
0588nobodyさん
2005/11/22(火) 21:08:47ID:???WInXp&Apacheのローカル環境だと大丈夫なのですが,レンタルスペースだとダメなんです.
ローカルとサーバの違いというものがよく判らなくて,デバッグに四苦八苦という状態です.
>>587
#!/usr/bin/perl ですね.すみません.
もう少し自分で頑張ってみてダメなようでしたら,また質問するかもしれませんが,
そのときはよろしくお願いします.
0589nobodyさん
2005/11/22(火) 21:15:52ID:???ローカルがWinってのは先に言おうな。話が全然違ってくるからな。
で、俺が言ってるのは>>572にクォート入れても動かないのか、なんだが。
もういいや。
0590nobodyさん
2005/11/22(火) 21:25:32ID:???無駄なやりとりが増えるから落ち着いてから出直してきなさい。
OSが異なれば改行の扱いが変わったりもするし、
スクリプトやデータファイルの文字コードに起因しているかもしれんし、
マルチバイトなファイル名/ディレクトリ名なんて脱力ものな原因かもしれんし、
FTP転送がまずいだけかもしれん。
typo
様々なエラーがでてしまいます。
挙動がレンタルとローカルで異なっています。
・・・神かエスパーじゃなきゃわからんよ。
0591nobodyさん
2005/11/22(火) 22:02:19ID:???0593974
2005/11/22(火) 23:14:39ID:???文字コードなんか気にせずに秀丸で文字コードをshift_jisに設定して書いて
マスタ、所が全角英数字を半角英数字にしようとしたら、プログラム自体は
jcode::tr(\$arg_[$i], '0-9A-Za-z', '0-9A-Za-z');
たったのこれっぽっちなんだけど、これって文字コードがEUC-JPじゃないと
正確に変換出来ないんだよね、やっぱり皆さんもperlのプログラム書くときの
文字コードはEUC-JPデツカ?
0594nobodyさん
2005/11/22(火) 23:18:40ID:???0595nobodyさん
2005/11/22(火) 23:21:51ID:???0596nobodyさん
2005/11/23(水) 04:24:57ID:fNvsPnqm本のサンプルコードで理解できないところがあるんで教えてください。
$Value =~ /(\w+)\.(\w+)$/;
なんて書くときの、最後の、
$/
って何を表すんですか?
ファイル名を取り出すようなところで使われてるんだけど…。
これなに?
下の例だと$っていらない気がするんだが…。
こんな感じ
例:
if($FileName =~ /(\w+)\.(\w+)$/){
$FileName = "$1\.$2";
}
■ このスレッドは過去ログ倉庫に格納されています