Perlコーディング初心者質問スレ Part 43
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/08/12(金) 01:26:47ID:mHnZWvqz【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0714nobodyさん
2005/10/03(月) 23:16:50ID:???0715709
2005/10/03(月) 23:55:41ID:YGt8QF/sなものなので。
とりあえず、ログデータを定義している部分をチェックしたので、そこ
からスタートです!!
0716nobodyさん
2005/10/04(火) 11:53:28ID:ibcAkGb+@list1 = (1,3,5,7,9,11,13,15,17,19,21,23,25,27,29)
@list2 = (1,4,7,10,13,16,19,22,25,28,30)
と入っています。
ここで
・リスト2の中のものがリスト1にある場合はその値を@list3に、
・リスト2の中のものがリスト1にない場合はその値を@list4に、
それぞれ入れて行きたいと思うのですが、その方法がわかりません。
最終的には
@list3 = (1,7,13,19,25,30)
@list4 = (4,10,16,22,28)
にしたいのです。
@list1〜@list4は便宜上数値にしていますが、実際に入るのは文字列(URL)で、@list1の要素は100以上になる場合があります。@list2はせいぜい5個くらい。
0717nobodyさん
2005/10/04(火) 12:19:46ID:???ハッシュにいれて調べるのが常套手段。
@list3 = (1,7,13,19,25,30)
@list4 = (4,10,16,22,28)
じゃなくて
@list3=(1,7,13,19,25)
@list4=(4,10,16,22,28,30)
でよければ
@list1{@list1} = ();
@list3 = grep {exists $list1{$_}} @list2;
@list4 = grep {!exists $list1{$_}} @list2;
でいけるけど、30が@list4じゃなくて@list3に入るようにするのは難しいな。
0718nobodyさん
2005/10/04(火) 14:23:03ID:???> @list1{@list1} = ();
こんな書き方あるのか。
0720716
2005/10/04(火) 15:10:49ID:ibcAkGb+30は@list4の間違いです。申し訳ありません。
ハッシュを使うのですね。
ありがとうございました!!
0721nobodyさん
2005/10/04(火) 15:12:11ID:???$dummy = '/^';
$dummy .= join'$/ || /^',@list2;
$dummy .= '$/';
@list3 = grep(eval $dummy,@list1);
@list4 = grep(!eval $dummy,@list1);
0722721
2005/10/04(火) 15:16:47ID:???0723nobodyさん
2005/10/04(火) 15:21:32ID:???スライスはやりすぎのような気がするので、
$list1{$_} = 1 foreach @list1;
ぐらいの方が見やすいんじゃないかねぇ。これだと値が1だから
exists使わずに
@list3 = grep {$list1{$_}} @list2;
みたいに書けるし。
0724nobodyさん
2005/10/04(火) 15:45:08ID:???my %flag = map { $_ => 1 } @list1;
0725709
2005/10/04(火) 15:46:59ID:16WUnnwbまずは入力フォームを追加して、ログデータの項目を追加。
掲示板に投稿して入力値が入っているかテスト。・・・FTPで開いて
みるが、入っていない。試行錯誤するがダメ。もう止めようと思う。
第一夜続き。お風呂でぶくぶくしていると、使っていないname値を流用すれ
ば全部済むことに気がつく。
俺って天才!! さっそく試す。ダメ。
0728709
2005/10/04(火) 15:50:20ID:16WUnnwbよ〜〜〜く見たら、formのnameに「"」がついてないことに気がつく。
再度、投稿してFTPでファイルを開く。
入ってる〜〜〜〜〜!!!!!
新たにログデータの項目を追加した状態で試す。
入ってる〜〜〜〜〜!!!!!
0730nobodyさん
2005/10/04(火) 16:56:19ID:???0731709
2005/10/04(火) 17:13:56ID:0ZPYmA+sところでローカルということは、サーバーに上げなくてもCGIは動く
のですか?
第二夜続き。
過去ログの処理が入っているので、安全を考えてname値の流用の方に決
定。とりあえずクッキーを外したいので、そこだけ消去。動作確認。
レスロック判定をしてロックなら投稿記事にマークを出す。ログデータ
はもともと読み込まれているので、if文を書いてみる。
原文から「!」が逆の判定になるのだろうと推測。
if ((!$reno)&&($sub_color eq "1")) {
print "[ロック] ";
}
出た〜〜〜〜〜!!!!
0733nobodyさん
2005/10/04(火) 18:20:23ID:???> ローカルサーバ
あの KENT-WEB にさえ 「自宅マシンWWWサーバ化計画」 とやらがあるんだし、いろいろぐぐってみそ
0734nobodyさん
2005/10/04(火) 18:31:14ID:???---------- ソース(EUC) ----------
use Jcode;
$char = '(1)'; # 機種依存文字の丸1だと思ってください。
print qq(${char}\n);
Jcode::convert( \$char, 'euc' );
print qq(${char}\n);
exit;
---------- 出力(EUC) ----------
(1)
?
文字コード同じでもJcodeかますと機種依存文字が「?」になるんですね…
なんでだろ。
0737734
2005/10/04(火) 19:49:55ID:???まじですか?
ちなみに環境は、
・FedoraCore 3
・Perl 5.8.5
・内部エンコードUTF8(あまり関係ない気がするけど)
です。
0738nobodyさん
2005/10/04(火) 19:54:18ID:???0739709
2005/10/04(火) 20:09:01ID:5HGueAp3はあ。プログラマーさんは真面目なんですね。
では、さようなら。アドバイスありがとうございました。
0740nobodyさん
2005/10/04(火) 20:51:20ID:???エディターで使用してるフォントと結果表示のフォントが違うんじゃない?
同じ文字コードでも後者のフォントには含まれてない文字だとか。
0741nobodyさん
2005/10/04(火) 21:16:41ID:???Jcode::convertにかける前と後で表示させていて、かける前のは
ちゃんと表示されてるというんだからそれは違うんじゃないかと。
print qq(${char}\n);
のかわりに、
print unpack('H*', $char), "\n";
にして文字コード表示させるとなにかヒントがつかめるかもしれず。
ちなみにうちの環境ではどちらも普通に丸1が表示されてコードは
ada1だった。
0742nobodyさん
2005/10/04(火) 21:27:51ID:???PerlバージョンとJcodeのバージョンによって動作が違うと考えられるけど。
0743nobodyさん
2005/10/04(火) 21:47:32ID:???0744nobodyさん
2005/10/04(火) 22:10:19ID:???print qq(${char}\n);
は
print $char . "\n";
とか
print "$char\n";
にならんのか?
いや、オフトピだけどさぁw
0745nobodyさん
2005/10/04(火) 22:16:13ID:???print $char, "\n";
かな
0747nobodyさん
2005/10/05(水) 01:00:16ID:???open (FH, "<hoge.txt");
print FH "�I";
close FH;
これを実行してエディタで開くと、文字コードがEUCになってしまう
0748nobodyさん
2005/10/05(水) 02:26:59ID:???ここは独り言書き込みスレじゃねえ
0749nobodyさん
2005/10/05(水) 03:23:07ID:???キーに指定不可能な文字列というものはあるものなの
でしょうか。
ご教示いただけますと幸いです。
0751734
2005/10/05(水) 12:48:09ID:???コード出力試したんですが、
見事に
(1) → ada1
? → 3f
でしたw
3fってもろに ? のコードなんだよなぁ…
となるとJcodeの変換テーブルに無い文字は
全部 ? に変換しちゃってるとしか考えようが…
ちなみに Jcode.pm のバージョンは 2.3 でした。
一応現在の最新版を入れたんだけど…
>>742, 743
それは痛い…
まだまだJcode使わざるをえないようですね
>>744, 745, 746
大抵 print するときはPerl変数と通常の文字列が混ざるんで、
qq() でくくって ${} で変数を切り分ける癖が付いてるみたいです。
逆に , や . で結合する方が気持ち悪いと感じてる…
(もちろん、単純な文字列の場合はその限りじゃないですが)
0753nobodyさん
2005/10/05(水) 13:51:44ID:???たぶん勘違いしてると思うのだが、新しめのJcode.pmはperl5.8以降と
組み合わせるとコード変換部分をPerlがもともと備えている機構を
使うようになるので、
0755nobodyさん
2005/10/05(水) 14:06:45ID:???とJcode.pmのHPから落としてきた2.03との組み合わせでで確かに'?'になった。
unstableでJcode.pmのパッケージはいまだに0.88なのはその辺を嫌ってるの
かもしれんな。
0759nobodyさん
2005/10/05(水) 16:29:09ID:???0760nobodyさん
2005/10/05(水) 16:35:30ID:???いきなり convert じゃなくて、getcode で文字コード取得してから自分で判別してやれば「いいじゃない
0761nobodyさん
2005/10/05(水) 17:13:12ID:???>---------- ソース(EUC) ----------
>use Jcode;
ソースはEUCとのことだが、use encoding を宣言していないため、
Perl はこのソースをUTF-8だと認識すると思われ。
>$char = '(1)'; # 機種依存文字の丸1だと思ってください。
$charには、「『丸1』のEUCコード」が入る。但し、PerlはこれをUTF-8の
文字コードだと認識する。
>print qq(${char}\n);
PerlがUTF-8の文字コードだと認識している「『丸1』のEUCコード」が出力される
ため、出力結果は見かけ上は正常に見える。
>Jcode::convert( \$char, 'euc' );
これは、「『丸1』のEUCコード」をUTF-8の文字コードだとして、対応する
EUCコードを返せ、ということになるが、そんなものが無いために「?」が
返されるのではないだろうか。
0763nobodyさん
2005/10/05(水) 18:06:34ID:???euc2euc("\xad\xa1");
euc2euc("\xdb\xd9");
exit;
sub euc2euc
{
my $char = shift;
from_to($char, 'euc-jp', 'euc-jp');
print ((map{ unpack('H2', $_) } split(//, $char)), "\n");
}
これを動かしてみれば分かると思う。
結局、○に1とかの文字を渡さないのがいいかと。
0764nobodyさん
2005/10/05(水) 19:43:50ID:???なるほど。
ということはEncodeを使うコード変換(Perl5.8以上のJcode含む)に
機種依存文字を渡してはいけないってことですね。
※5.8以下のJcodeとjcode.plは不明
うーん、、機種依存文字の判定はしんどいなぁ…
0765nobodyさん
2005/10/05(水) 21:14:51ID:???CPANにあるEncode::JIS2K使うとか。詳しくはわかんないけど
試した感じでは丸付き数字ぐらいならなんとかなるっぽいよ。
0766nobodyさん
2005/10/05(水) 21:36:18ID:???クイズのプログラムを作っているのですが、csvへの書き込みが思うようにいきません。。
↓とりあえず現状はこうなっています。
ttp://s1.muryo-de.etowns.net/~testjoy/
このまま回答を送信すると
項目1 項目2 項目3
総問題数 回答番号 正解番号
総問題数 回答番号 正解番号
・ ・ ・
・ ・ ・
と書き込まれるのですが、これを
項目1 項目2 項目3
Q1(問題番号) Q1の回答番号 Q1の正解番号
Q2(問題番号) Q2の回答番号 Q2の正解番号
Q3(問題番号) Q3の回答番号 Q3の正解番号
・ ・ ・
・ ・ ・
という形に修正したいです。ここまでやってどうしてもうまくいきません。。。
どなたかお助けお願い申し上げます。
0767766
2005/10/05(水) 21:37:30ID:???foreach (@question) {
($rank_data) = split(/\t/);
open(CSV , ">> file.csv");
flock(CSV,2);
@logs2=<CSV>;
$rank_data="$key,$val,$aval\n";
push(@logs2,$rank_data);
print CSV @logs2;
flock(CSV,8);
close(CSV);
}
です。お願い申し上げます。。
076976
2005/10/05(水) 21:52:03ID:???こんな具合でございます。。
# 質問の取得
&ReadParse;
if(open(IFILE,"question_1.tsv")) {
while(<IFILE>) {
chomp();
push(@question,$_);
}
close(IFILE);
0770767
2005/10/05(水) 21:54:07ID:???my($qnum) = 0;
foreach (@question) {
($qval,$aval,@column) = split(/\t/);
next if($qval eq "");
$qnum++;
$key = "Q".$qnum;
【問題$qnum】$qval
!;
$anum = 0;
foreach (@column) {
next if(!$_);
$anum++;
print qq!<BR>\n!;
print qq!<INPUT TYPE="radio" NAME="$key" VALUE="$anum">$_\n!;
}
0771767
2005/10/05(水) 21:58:19ID:???my($qnum) = 0;
foreach (@question) {
($qval,$aval,@column) = split(/\t/);
next if($qval eq "");
$qnum++;
$key = "Q".$qnum;
$val = $in{$key};
if($val eq $aval) {
$check = "○";
} else {
$check = "×";
}
$anum = 0;
$answer[$anum] = " ";
foreach (@column) {
next if(!$_);
$anum++;
$answer[$anum] = $_;
}
0772nobodyさん
2005/10/05(水) 22:30:09ID:Y4Xwvx08最近サイトの荒しが多くて、IPとホストのドメインを取得しようとしています。
$ENV{'REMOTE_ADDR'}
$ENV{'REMOTE_HOST'}
で情報を得ようとしているのですが、REMOTE_ADDRの方は値が入っているのに、
REMOTE_HOSTの方は何も入っていません。ローカル起動ではないのですがなぜ
でしょうか?プロバイダの違う複数の端末からもためしてみたのですが、入っ
ていませんでした。
よろしくお願いします。
0773nobodyさん
2005/10/05(水) 22:45:29ID:???つながってきた相手のIPアドレスは必ずわかるけど、
ホスト名はIPアドレスからDNSで逆引きしないと
出ないので、出そうとするとその分鯖の負荷になる。
なので、特に共用の鯖では逆引きしない設定にして
あることが多い。多分それじゃないかと。
0774nobodyさん
2005/10/05(水) 23:15:07ID:???0775nobodyさん
2005/10/06(木) 03:58:29ID:???0776nobodyさん
2005/10/06(木) 11:31:35ID:???> 機種依存文字
Shift_JIS だけど、
どこかに
/([\x85-\x87][\x40-\xff]|\x88[\x40-\x9e]|[\xeb-\xfc][\x40-\xff])/;
って書いてあった。
0777nobodyさん
2005/10/06(木) 11:54:16ID:???foreach (@question) のループの中で、$key, $val, $aval
が全く変更されていない。従って、$rank_dataは常に同一の
文字列になる。もしかすると、
($rank_data) = split(/\t/); を、
($key,$val,$aval) = split(/\t/);
にすれば、望んだ結果が得られるかもしれない。
0778nobodyさん
2005/10/06(木) 13:20:28ID:Zoab/OuC$st = $db->prepare("$C{sqlbase} and ch=? and subch!='notice' and pubtime > now() - '1 day'::interval order by pubtime desc");
すいません、↑この一文は何をしているんでしょうか?
perlの文章の中に出てきたのですが、これはSQLの文の一部なんでしょうか
0779nobodyさん
2005/10/06(木) 20:10:40ID:???PPクラスのdbメソッドの返値が代入されている$dbに対して
prepareメソッドを一つの引数とともに呼び、その返値を$stに代入してる。
引数は普通の文字列で、$C{sqlbase}が変数展開される。
SQL文の一部かどうかはそのプログラムを書いた人じゃないので知らん。
0780778
2005/10/06(木) 21:47:25ID:Zoab/OuC0781nobodyさん
2005/10/07(金) 04:33:20ID:7A4FQYqdでname=valueというクッキーを発行して
http://foo.jp/に渡したいんです。
domain="http://foo.jp/";
path="/";
name="value";
というクッキーを作ったんですが受け取ってもらえませんでした。
どうすればいいんでしょうか。
0782nobodyさん
2005/10/07(金) 07:25:00ID:???ただし、ピリオドが2つ以上含まれないといけないらしいが・・・
0784nobodyさん
2005/10/07(金) 11:40:23ID:???domain属性がドメイン名でないという782の指摘は正しいが、
ドメイン名foo.jpに直したとしても、クッキーを発行するホストの
ホスト名hogehoge.co.jpがドメイン一致しないので、拒否される
んじゃないだろうか。実際とは変えてあるのだろうからなんとも
言えんが。
RFC2965の「3.3.2クッキーの拒否」
ttp://www.studyinghttp.net/cgi-bin/rfc.cgi?2965
0785nobodyさん
2005/10/07(金) 11:54:42ID:???0786nobodyさん
2005/10/07(金) 12:11:20ID:???$dbはPPクラスのオブジェクトじゃないの?
推測だけど。
>>781
他所のCookieを読み込みたいのですが
http://pc8.2ch.net/test/read.cgi/php/997686085/
ほんと、古いスレがあるよなぁ。
>>785
それは、コンテンツに第三者のコンテンツを埋め込んで、
そこでクッキーを発行する方法っしょ。
0788nobodyさん
2005/10/08(土) 11:15:59ID:???0790nobodyさん
2005/10/09(日) 12:58:13ID:???500 エラーになります。試しに nph-redir.cgi という名前にすると 503 になります。
使ってるのは、apache2 です。よろしくおねがいします。
my $x = CGI->new();
print $x->redirect(
-location => $url,
-status => 301,
);
0791790
2005/10/09(日) 13:04:30ID:???0792nobodyさん
2005/10/09(日) 20:13:06ID:20mFB5Hkmは各行ごとに^や$が使えるようになるみたいですが。
どなたかおしえてください。
0793nobodyさん
2005/10/09(日) 20:25:55ID:???http://search.cpan.org/dist/perl/pod/perlre.pod
0794nobodyさん
2005/10/09(日) 20:32:38ID:???その説明を読んでいる可能性が高いのではないでしょうか。
マニュアルページを読むだけで、解決する質問がかなり多いような気がします。
ぐぐるだけではなく、手元のマニュアルページも調べてみましょう。
0795nobodyさん
2005/10/09(日) 20:38:17ID:???0796nobodyさん
2005/10/09(日) 22:47:29ID:???0798nobodyさん
2005/10/09(日) 22:56:16ID:???0801nobodyさん
2005/10/10(月) 00:11:38ID:???で正規表現で複数マッチしたら何を取り出すつもりだ
0802nobodyさん
2005/10/10(月) 00:12:41ID:???正規表現でキーを表現したいということでしょ。
$hash{/^ab/} = 3;
とか。
実際には tie して
$hash->{'^ab'} = 3;
みたいになるんだろうけど
0804nobodyさん
2005/10/10(月) 00:22:16ID:???0805nobodyさん
2005/10/10(月) 00:23:35ID:???0807nobodyさん
2005/10/10(月) 01:54:54ID:???> 正規表現でキーを表現したい
それだけなら tie なんざせんでも。
my $str = 'abcabcdefdefabcdefabef';
my %hash;
$hash{$_} = [ $str =~ /($_)/g ] for (
qr/^abc/,
qr/ab./,
qr/.fd.*?f/,
qr/\d/,
);
print "$_ : ", join(', ', @{$hash{$_}}), "\n" for sort keys %hash;
正規表現にマッチするキーが持つ値を
@values = $hash{ qr/^abc/ };
のように取り出したいというのなら、ラッパーを
探すなり書くなり、という話になると思うが。
0809nobodyさん
2005/10/10(月) 03:50:32ID:???print map { $hash{$_} } grep { /$regex/ } keys %hash;
0810nobodyさん
2005/10/10(月) 09:58:24ID:???0811nobodyさん
2005/10/10(月) 11:52:25ID:gKZw7BFl見よう見まねで以下のようにgethostbyaddrを使ってみたのですが
$addr = $ENV{'REMOTE_ADDR'};
$wkaddr = pack('C4', $addr);
use Socket;
$host = gethostbyaddr($wkaddr, AF_INET);
結果にYahooBB〜.bbtec.netってのが返ってきました。
使い方はこれであってるんでしょうか?
0812nobodyさん
2005/10/10(月) 12:56:52ID:???■ このスレッドは過去ログ倉庫に格納されています