Perlコーディング初心者質問スレ Part 43
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/08/12(金) 01:26:47ID:mHnZWvqz【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
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:???0814nobodyさん
2005/10/10(月) 13:58:02ID:???0815811
2005/10/10(月) 16:13:54ID:gKZw7BFlなっています。どうしてでしょうか?
お願いします。
0816nobodyさん
2005/10/10(月) 16:18:09ID:???何が欲しいのか分からない状態で使って
結果が正しいのかどうかも分からないって…
それは質問なのか?
0817nobodyさん
NGNG0818nobodyさん
2005/10/10(月) 22:40:59ID:???129 : foreach(keys %an){
130 : $data = sprintf("%08d\t$_",$an{$_});
131 : push(@count,$data);
132 : }
エラー内容は
Modification of a read-only value attempted at test.cgi line 130.
なのですが、このエラーの修正方法が分かりません。
このスレでいいのかちょっと謎ですが宜しくお願いします。
0819nobodyさん
2005/10/10(月) 22:55:19ID:???分からないエラーが出たときには、そのエラーメッセージでぐぐると良いですよ。
$dataが定数になっていたり、その行の変数、どれか tieしてませんか?
0820nobodyさん
2005/10/10(月) 23:44:14ID:j4NUbQ7s学校の宿題なんですが・・・初歩の初歩で質問するのもはずかしー問題かもしれません・・・
Hex number を入力してそのNumberをDecに変換し、さらにoctal number を decimal にするプログラムを作れ。
っていう問題です。
一応自分で書いたのは・・
#!/perl
use warnings;
use strict;
print "Hexadecimal and Octal number converter\n\n Please enter the Hexadecimal number:";
my $hex = <STDIN>;
print $hex,;
とりあえず、Hex→Decの変換をやってみようと思ってここまで書きました。
これだと、例えば、0xFFっていれても255って返ってこずにそのまま、0xFFって出ちゃうんですよね・・・
神様助けて・・・
0821nobodyさん
2005/10/10(月) 23:52:05ID:???つttp://www.site-cooler.com/cgi-bin/kansuu.cgi?lang=perl
0822nobodyさん
2005/10/10(月) 23:52:46ID:???それさ、そこに書いてある部分が問題文、
というか「これを拡張して書け」みたいな感じなんじゃない?
変換しろって言うんだから、変換しなよ。簡単だぞ。
がんばれよ。
0823820
2005/10/11(火) 00:01:28ID:ydWxrZ97んー。。
変換する式みたいなもんがあるんでしょうか?
print 0xFF,;
って書くと勝手にPerlが普通の数字に変換してくれますが、内部でどのように変換してるんでしょか?
なんか、三角形の面積を求める公式みたいな計算式があればできるっぽいんですけど。。
もう一度一から教科書読み直して勉強してみます・・・。
0824nobodyさん
2005/10/11(火) 00:02:58ID:???書いてもらいたいんだろうなぁ。
0826820
2005/10/11(火) 00:22:37ID:m+2zbTP9#!/perl
#ex2.plx
use warnings;
use strict;
print "Hexadecimal and Octal number converter\n\n Please enter the Hexadecimal number:";
my $hex = <STDIN>;
print hex $hex,;
としたら、0xFF→255
となって変換できたんですけど・・こんなエラーが↓
Illegal hexadecimal digit'
' ignored at ex2.plx line7, <STDIN> line 1.
255
このエラーの最後に255って出たんですけど。。このエラーは無視したら怒られますか??
ま、いっか。おし、次はOctal!
0827nobodyさん
2005/10/11(火) 00:28:56ID:???う〜ん。怒られないと思うけど、初歩的な悪い例として取り上げられるかもw
0828nobodyさん
2005/10/11(火) 00:39:23ID:???0829820
2005/10/11(火) 00:44:24ID:m+2zbTP9#!/perl
#ex2.plx
use warnings;
use strict;
print "Hexadecimal and Octal number converter\n\n Please enter the Hexadecimal number:";
my $hex = <STDIN>;
print hex $hex,;
print "\n Please enter the Octal number:";
my $oct = <STDIN>;
print oct #oct,;
って感じに書いたら、、、
Use of uninitialized value in oct at ex2.plx line 10, <STDIN> line 2.
0
ってなって数字が0に!!
うーん。初歩的な悪い例ですか・・・$hex の中になにか良くないものが入ってるっぽいんですね・・・。
しかし、なんでOctalの場合だと0に・・・
もうちょいがむばってみます・・・
0831827
2005/10/11(火) 01:01:39ID:???>>826のソースでエラーがでるのは$hexにchomp関数を使用していないからです。
$hexの中には0xFF\nと入ってます。その\nを取り除くためにchomp関数を使います。
chomp関数とはなんぞや?
ttp://www.site-cooler.com/cgi-bin/kansuu.cgi?lang=perl&method=chomp
>>829についてはEasy mistake
それでは、おやすみなさい。
0832nobodyさん
2005/10/11(火) 01:12:14ID:???0833nobodyさん
2005/10/11(火) 01:12:39ID:???いや、お前よりかはみんな知ってると思うが・・・^^;
0834827
2005/10/11(火) 01:22:05ID:???馬鹿め!>>820宛に書いた文章だぞ。俺だってchompぐらい知ってる。
chomp関数とはなんぞや?(その下の行に簡単にわかるリンク先)
ttp://www.site-cooler.com/cgi-bin/kansuu.cgi?lang=perl&method=chomp
俺ってなんて優しいんだw
0835nobodyさん
2005/10/11(火) 01:26:50ID:???× print oct #oct,;
〇 print oct $oct;
って教えてやれよw
0837nobodyさん
2005/10/11(火) 01:45:08ID:???テキストエディタだったらすぐ気づきそうな。
0838nobodyさん
2005/10/11(火) 02:14:26ID:???0839nobodyさん
2005/10/11(火) 10:24:06ID:4r4FVZwb$kexp= 200;
$pexp= 676;
$bexp= 267;
$kexp= $a;
$pexp= $b;
$bexp= $c;
$a + $b + $c= $d;
print $d;
何がいけないのかな?
■ このスレッドは過去ログ倉庫に格納されています