トップページ⇒php
1001コメント371KB

Perlコーディング初心者質問スレ Part 43

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/08/12(金) 01:26:47ID:mHnZWvqz
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0714nobodyさん2005/10/03(月) 23:16:50ID:???
やってもらいたいなら、最初からそう書くべきだと思うけど。
07157092005/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:???
>>716
ハッシュにいれて調べるのが常套手段。

@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} = ();

こんな書き方あるのか。
0719nobodyさん2005/10/04(火) 15:06:23ID:???
>>718
原理としては @hash{'foo', 'bar', 'baz'} と同じなんだが。
07207162005/10/04(火) 15:10:49ID:ibcAkGb+
>>717

30は@list4の間違いです。申し訳ありません。

ハッシュを使うのですね。
ありがとうございました!!
0721nobodyさん2005/10/04(火) 15:12:11ID:???
素人スマソ、生理的に嫌かもしれませんが

$dummy = '/^';
$dummy .= join'$/ || /^',@list2;
$dummy .= '$/';
@list3 = grep(eval $dummy,@list1);
@list4 = grep(!eval $dummy,@list1);
07227212005/10/04(火) 15:16:47ID:???
間違ったので読み飛ばしてください。(鬱
0723nobodyさん2005/10/04(火) 15:21:32ID:???
>>718
スライスはやりすぎのような気がするので、

$list1{$_} = 1 foreach @list1;

ぐらいの方が見やすいんじゃないかねぇ。これだと値が1だから
exists使わずに

@list3 = grep {$list1{$_}} @list2;

みたいに書けるし。
0724nobodyさん2005/10/04(火) 15:45:08ID:???
それならこう書くかな。
my %flag = map { $_ => 1 } @list1;
07257092005/10/04(火) 15:46:59ID:16WUnnwb
第一夜。
まずは入力フォームを追加して、ログデータの項目を追加。
掲示板に投稿して入力値が入っているかテスト。・・・FTPで開いて
みるが、入っていない。試行錯誤するがダメ。もう止めようと思う。

第一夜続き。お風呂でぶくぶくしていると、使っていないname値を流用すれ
ば全部済むことに気がつく。
俺って天才!! さっそく試す。ダメ。

0726nobodyさん2005/10/04(火) 15:47:19ID:???
どうでもいいが >>721 は /^(?:a|b|c)$/ とういうような書き方を知らないのか
0727nobodyさん2005/10/04(火) 15:49:41ID:???
>>709 オツカレw
07287092005/10/04(火) 15:50:20ID:16WUnnwb
第二夜。
よ〜〜〜く見たら、formのnameに「"」がついてないことに気がつく。
再度、投稿してFTPでファイルを開く。

入ってる〜〜〜〜〜!!!!!

新たにログデータの項目を追加した状態で試す。

入ってる〜〜〜〜〜!!!!!
0729nobodyさん2005/10/04(火) 16:38:19ID:???
>>728
ローカルでテストしましょうね。
0730nobodyさん2005/10/04(火) 16:56:19ID:???
とりあえずオメ
07317092005/10/04(火) 17:13:56ID:0ZPYmA+s
ありがとうございます!! 
ところでローカルということは、サーバーに上げなくてもCGIは動く
のですか?

第二夜続き。
過去ログの処理が入っているので、安全を考えてname値の流用の方に決
定。とりあえずクッキーを外したいので、そこだけ消去。動作確認。

レスロック判定をしてロックなら投稿記事にマークを出す。ログデータ
はもともと読み込まれているので、if文を書いてみる。
原文から「!」が逆の判定になるのだろうと推測。

if ((!$reno)&&($sub_color eq "1")) {
 print "[ロック] ";
 }

出た〜〜〜〜〜!!!!
0732nobodyさん2005/10/04(火) 17:47:20ID:???
>>731
プログラムだから動くよ〜。
0733nobodyさん2005/10/04(火) 18:20:23ID:???
>>731
> ローカルサーバ
あの 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かますと機種依存文字が「?」になるんですね…
なんでだろ。
0735nobodyさん2005/10/04(火) 19:35:46ID:???
>>731
ここで日記書く前にCGIの基礎を勉強して来い
つか質問無いなら書くな
0736nobodyさん2005/10/04(火) 19:40:27ID:???
>>734
ウチではそのソースでも「?」にはならないけど
07377342005/10/04(火) 19:49:55ID:???
>>736

まじですか?
ちなみに環境は、

・FedoraCore 3
・Perl 5.8.5
・内部エンコードUTF8(あまり関係ない気がするけど)

です。
0738nobodyさん2005/10/04(火) 19:54:18ID:???
Jcode.pm の ユニコ←→EUC 変換テーブルにない文字なだけじゃね?
07397092005/10/04(火) 20:09:01ID:5HGueAp3
>>735

はあ。プログラマーさんは真面目なんですね。
では、さようなら。アドバイスありがとうございました。
0740nobodyさん2005/10/04(火) 20:51:20ID:???
>>734
エディターで使用してるフォントと結果表示のフォントが違うんじゃない?
同じ文字コードでも後者のフォントには含まれてない文字だとか。
0741nobodyさん2005/10/04(火) 21:16:41ID:???
>>740
Jcode::convertにかける前と後で表示させていて、かける前のは
ちゃんと表示されてるというんだからそれは違うんじゃないかと。

print qq(${char}\n);

のかわりに、

print unpack('H*', $char), "\n";

にして文字コード表示させるとなにかヒントがつかめるかもしれず。

ちなみにうちの環境ではどちらも普通に丸1が表示されてコードは
ada1だった。
0742nobodyさん2005/10/04(火) 21:27:51ID:???
Jcodeは5.8.x以降Encodeのラッパーとして動くとかあるから、
PerlバージョンとJcodeのバージョンによって動作が違うと考えられるけど。
0743nobodyさん2005/10/04(火) 21:47:32ID:???
ああ、そういえば Encode の日本語変換はかなりのヘタレだ。
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";
かな
0746nobodyさん2005/10/04(火) 22:19:58ID:???
>>745
俺も。 なんとなく効率よさそう
0747nobodyさん2005/10/05(水) 01:00:16ID:???
Win2K環境でhoge.txtを作ってから、

open (FH, "<hoge.txt");
print FH "�I";
close FH;

これを実行してエディタで開くと、文字コードがEUCになってしまう
0748nobodyさん2005/10/05(水) 02:26:59ID:???
>747
ここは独り言書き込みスレじゃねえ
0749nobodyさん2005/10/05(水) 03:23:07ID:???
ハッシュのキーにHTMLタグ等を入れる予定なのですが、
キーに指定不可能な文字列というものはあるものなの
でしょうか。

ご教示いただけますと幸いです。
0750nobodyさん2005/10/05(水) 07:42:46ID:???
>>747
文字コードが被ってるだけ。エディタの問題。

>>749
文字列で表すことができれば、なんでもOK。
07517342005/10/05(水) 12:48:09ID:???
>>741

コード出力試したんですが、
見事に
(1) → ada1
? → 3f
でしたw

3fってもろに ? のコードなんだよなぁ…
となるとJcodeの変換テーブルに無い文字は
全部 ? に変換しちゃってるとしか考えようが…

ちなみに Jcode.pm のバージョンは 2.3 でした。
一応現在の最新版を入れたんだけど…



>>742, 743

それは痛い…
まだまだJcode使わざるをえないようですね



>>744, 745, 746

大抵 print するときはPerl変数と通常の文字列が混ざるんで、
qq() でくくって ${} で変数を切り分ける癖が付いてるみたいです。
逆に , や . で結合する方が気持ち悪いと感じてる…
(もちろん、単純な文字列の場合はその限りじゃないですが)

0752nobodyさん2005/10/05(水) 13:03:38ID:???
>>751
qq() と . は、文字列結合があるからなぁ。
, ならIOにそのまま渡るだけだけど。
0753nobodyさん2005/10/05(水) 13:51:44ID:???
>>751
たぶん勘違いしてると思うのだが、新しめのJcode.pmはperl5.8以降と
組み合わせるとコード変換部分をPerlがもともと備えている機構を
使うようになるので、
07547512005/10/05(水) 13:58:42ID:???
>>752

可読性を重視してました…
速度的にはそのとおりですね

>>753

×Jcode
○jcode(.pl)
でした。。
0755nobodyさん2005/10/05(水) 14:06:45ID:???
Debianのunstableで試してみたんだが、パッケージでインストールしたperl5.8.7
とJcode.pmのHPから落としてきた2.03との組み合わせでで確かに'?'になった。
unstableでJcode.pmのパッケージはいまだに0.88なのはその辺を嫌ってるの
かもしれんな。

0756nobodyさん2005/10/05(水) 14:10:46ID:???
>>754
いや jcode.pl は utf-8 ⇔ euc-jp はできんぞ。
07577542005/10/05(水) 14:14:34ID:???
>>756
ソースも出力もEUCなので、UTFからの変換は行ってないです。
(すんません、なんか本題とずれちゃってる…)
0758nobodyさん2005/10/05(水) 15:40:19ID:???
>>750
ありがとうございます。
キーボードで入力できる文字全てが対象なんですね。
良かったです。
0759nobodyさん2005/10/05(水) 16:29:09ID:???
いっそ、jcode.plにするとか
0760nobodyさん2005/10/05(水) 16:35:30ID:???
つか euc ⇔ euc なら変換する必要ないじゃんか。
いきなり convert じゃなくて、getcode で文字コード取得してから自分で判別してやれば「いいじゃない
0761nobodyさん2005/10/05(水) 17:13:12ID:???
>>734 を読んで思ったこと。

>---------- ソース(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コードを返せ、ということになるが、そんなものが無いために「?」が
返されるのではないだろうか。
0762nobodyさん2005/10/05(水) 17:35:41ID:???
>>761
use utf8してないからそんなこたないと思うが。
0763nobodyさん2005/10/05(水) 18:06:34ID:???
use Encode qw(from_to);

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:???
>>763

なるほど。
ということはEncodeを使うコード変換(Perl5.8以上のJcode含む)に
機種依存文字を渡してはいけないってことですね。
※5.8以下のJcodeとjcode.plは不明

うーん、、機種依存文字の判定はしんどいなぁ…
0765nobodyさん2005/10/05(水) 21:14:51ID:???
>>764
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の正解番号
・   ・   ・
・   ・   ・

という形に修正したいです。ここまでやってどうしてもうまくいきません。。。
どなたかお助けお願い申し上げます。
07677662005/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);
}

です。お願い申し上げます。。
0768nobodyさん2005/10/05(水) 21:42:47ID:???
>>767
問題が再現する最小のサンプルコードを載せるべし。
0769762005/10/05(水) 21:52:03ID:???
>>768
こんな具合でございます。。

# 質問の取得

&ReadParse;

if(open(IFILE,"question_1.tsv")) {
while(<IFILE>) {
chomp();
push(@question,$_);
}
close(IFILE);
07707672005/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!;
}
07717672005/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:???
>>772
つながってきた相手のIPアドレスは必ずわかるけど、
ホスト名はIPアドレスからDNSで逆引きしないと
出ないので、出そうとするとその分鯖の負荷になる。
なので、特に共用の鯖では逆引きしない設定にして
あることが多い。多分それじゃないかと。

0774nobodyさん2005/10/05(水) 23:15:07ID:???
つまりこっちで関数使って逆引きすればいいってことね。
0775nobodyさん2005/10/06(木) 03:58:29ID:???
げっとほすとばいあどれす
0776nobodyさん2005/10/06(木) 11:31:35ID:???
>>764
> 機種依存文字
Shift_JIS だけど、
どこかに

/([\x85-\x87][\x40-\xff]|\x88[\x40-\x9e]|[\xeb-\xfc][\x40-\xff])/;
って書いてあった。
0777nobodyさん2005/10/06(木) 11:54:16ID:???
>>767
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
$db = PP->db;

$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:???
>>778
PPクラスのdbメソッドの返値が代入されている$dbに対して
prepareメソッドを一つの引数とともに呼び、その返値を$stに代入してる。
引数は普通の文字列で、$C{sqlbase}が変数展開される。

SQL文の一部かどうかはそのプログラムを書いた人じゃないので知らん。
07807782005/10/06(木) 21:47:25ID:Zoab/OuC
ありがとうございます。かなり参考になりました。そのアドバイスを参考になんとか解析できそうです
0781nobodyさん2005/10/07(金) 04:33:20ID:7A4FQYqd
http://hogehoge.co.jp/cgi-bin/hoge.cgi
でname=valueというクッキーを発行して
http://foo.jp/に渡したいんです。

domain="http://foo.jp/";
path="/";
name="value";

というクッキーを作ったんですが受け取ってもらえませんでした。
どうすればいいんでしょうか。
0782nobodyさん2005/10/07(金) 07:25:00ID:???
URLじゃなくてドメイン名なんだからfoo.jpじゃないと。
ただし、ピリオドが2つ以上含まれないといけないらしいが・・・
0783nobodyさん2005/10/07(金) 10:32:33ID:???
>>778-779
そもそも
$db->prepare()
 ↑が何なのか分からん
0784nobodyさん2005/10/07(金) 11:40:23ID:???
>>781
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:???
IE の インターネットオプション → プライバシー → 詳細設定 に 「サードパーティの Cookie」 ってあるから、拒否されるかどうかはそこで決まるんじゃないかな。
0786nobodyさん2005/10/07(金) 12:11:20ID:???
>>783
$dbはPPクラスのオブジェクトじゃないの?
推測だけど。

>>781
他所のCookieを読み込みたいのですが
http://pc8.2ch.net/test/read.cgi/php/997686085/

ほんと、古いスレがあるよなぁ。

>>785
それは、コンテンツに第三者のコンテンツを埋め込んで、
そこでクッキーを発行する方法っしょ。
0787nobodyさん2005/10/07(金) 12:23:51ID:???
>>783
オレの推測ではDBIのデータベースハンドルじゃないかなー。


0788nobodyさん2005/10/08(土) 11:15:59ID:???
答はNoだ
0789nobodyさん2005/10/08(土) 18:30:12ID:???
>>783
これは本当のこと言ったらいかんの? >>786-788の流れは…。
0790nobodyさん2005/10/09(日) 12:58:13ID:???
こんなスクリプト書いて redir.cgi ってファイル名つけて実検してるんですけど、
500 エラーになります。試しに nph-redir.cgi という名前にすると 503 になります。
使ってるのは、apache2 です。よろしくおねがいします。
my $x = CGI->new();
print $x->redirect(
-location => $url,
-status => 301,
);

07917902005/10/09(日) 13:04:30ID:???
suexec のせいで 500 くらってますた。すんません。
0792nobodyさん2005/10/09(日) 20:13:06ID:20mFB5Hk
初歩的な質問ですが、正規表現で、最後にsをつけるのとつけないのとの違いがわかりません。
mは各行ごとに^や$が使えるようになるみたいですが。
どなたかおしえてください。
0793nobodyさん2005/10/09(日) 20:25:55ID:???
与えられた文字列を一行として扱う。.が改行にマッチする。
http://search.cpan.org/dist/perl/pod/perlre.pod
0794nobodyさん2005/10/09(日) 20:32:38ID:???
sオプションを使うことは稀ですから、sオプションがあるのを知っている時点で
その説明を読んでいる可能性が高いのではないでしょうか。

マニュアルページを読むだけで、解決する質問がかなり多いような気がします。
ぐぐるだけではなく、手元のマニュアルページも調べてみましょう。
0795nobodyさん2005/10/09(日) 20:38:17ID:???
まあ後はトライだな。
0796nobodyさん2005/10/09(日) 22:47:29ID:???
ハッシュのキーを正規表現で指定することは可能でしょうか
0797nobodyさん2005/10/09(日) 22:51:07ID:???
>>796
アルゴリズム上、無理です。
0798nobodyさん2005/10/09(日) 22:56:16ID:???
あ、tie して、そういうハッシュを作れば可能かな。面倒だけど
0799ヽ(´ー`)ノ ◆.ogCuANUcE 2005/10/09(日) 22:56:57ID:???
>>796
Tie Hash Reg で CPAN Search
0800nobodyさん2005/10/10(月) 00:05:51ID:???
>>796の質問の意味がわからん。
キーを正規表現で取り出すのとはちがうのか?
0801nobodyさん2005/10/10(月) 00:11:38ID:???
キーに対して値は1つ、
で正規表現で複数マッチしたら何を取り出すつもりだ
0802nobodyさん2005/10/10(月) 00:12:41ID:???
>>800
正規表現でキーを表現したいということでしょ。

$hash{/^ab/} = 3;
とか。

実際には tie して
$hash->{'^ab'} = 3;
みたいになるんだろうけど
0803nobodyさん2005/10/10(月) 00:14:08ID:???
>>801
複数マッチしたら、配列で返ってくるとかじゃないかな?たぶん
0804nobodyさん2005/10/10(月) 00:22:16ID:???
grepじゃできないようなことなのだろうか。
0805nobodyさん2005/10/10(月) 00:23:35ID:???
ハッシュ引くだけなら grep で出来そうだね
0806nobodyさん2005/10/10(月) 00:35:51ID:???
>>803
マジでーーー知らなかったスマソ
0807nobodyさん2005/10/10(月) 01:54:54ID:???
>>802
> 正規表現でキーを表現したい
それだけなら 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/ };

のように取り出したいというのなら、ラッパーを
探すなり書くなり、という話になると思うが。
0808nobodyさん2005/10/10(月) 03:48:24ID:???
>>796
単純に

print grep { /$regex/ } keys %hash;

でOK。
0809nobodyさん2005/10/10(月) 03:50:32ID:???
マッチするキーの値を求めたいなら

print map { $hash{$_} } grep { /$regex/ } keys %hash;
0810nobodyさん2005/10/10(月) 09:58:24ID:???
@hash{grep /$regex/, keys %hash }
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:???
是が非でもマニュアルは読みたくないと、そうおっしゃるか。
0813nobodyさん2005/10/10(月) 13:53:46ID:???
>>811
つかおまいはどういう結果を期待してgethostbyaddrを使ったんだ
■ このスレッドは過去ログ倉庫に格納されています