連想配列 %hogeにおいて、.name の名前が最後に付く配列の値を取り出したいと思い、下記のようにしました。
foreach ($hoge{/.*\.name$/}) {
 print "$_\n";
}
としてみましたが期待した出力がされませんでした。こういう描き方って出来ないんでしょうか?それともどこか間違ってますか?

A 回答 (2件)

$_ = "right.name";


print /.*\.name$/;
や、
$_ = "chigau.namae";
print /.*\.name$/;

の結果を見てみると分かりますが、この正規表現は、そのままで用いると変数 $_ に代入された値のマッチ結果になります。

foreach (keys %hoge) { # ハッシュのキーを一つずつ $_ に代入
 if (/.*\.name$/) {
  print "$hoge{$_}\n";
 }
}

のように、一旦$_ に代入する形式にすれば、お望みのことは可能だと思います。
    • good
    • 0
この回答へのお礼

回る数を減らそうと画策しましたが、配列の数分だけ回らないとだめと言うことですね。
ありがとうございました。

お礼日時:2002/01/16 15:29

ハッシュ(連想配列)のキーに正規表現を書くことはできません。


やるなら、次のようにします。
  foreach (keys %hoge) {
    print $hoge{$_} if /\.name$/;
  }
あるいは、
  foreach (grep /\.name$/, keys %hoge) {
    print "$hoge{$_}\n";
  }
もしくは、
  foreach (map $hoge{$_}, grep /\.name$/, keys %hoge) {
    print "$_\n";
  }
    • good
    • 0
この回答へのお礼

>ハッシュ(連想配列)のキーに正規表現を書くことはできません。
そうですか。出来ると嬉しいこともあるので是非対応して欲しいところです。その分オーバーヘッドが大きくなってしまっては元も子もないですが。
色々書き方があるものですね。勉強になります。
#といっても後半の2つはほとんど意味不明です^^;)。勉強しておきます。
ありがとうございました。

お礼日時:2002/01/16 15:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q@{$protocol_name}

usr strict;
をつかって、

$protocol_name = "pppoe";

@{$protocol_name}

のような使い方をしたいと思っていますが、

Can't use string ("pppoe") as an ARRAY ref while "strict refs" in use at ./ctest.pl line 152, <RCFG2> line 7

のようにエラー表示がでてしまいます。
どうしたら回避できるでしょうか。

Aベストアンサー

@pppoe という配列を生成する段階でハッシュ等扱いやすい変数に格納しておくのが定石だと思います。

・ハッシュにハードリファレンスで格納する方法
$protocol{pppoe} = \@pppoe; # 代入
@{$protocol{$protocol_name}} # 参照
# @pppoeとしましたがもちろん無名配列でかまいません。

・分岐させる方法
if($protocol_name eq "pppoe"){
... = @pppoe;
}elsif ...

・シンボリックリファレンスだけ許可させる方法
no strict 'refs';

・%main::から引く方法
@{$main::{$protocol_name}}

Q$hts =~ s/##([^#]+)##/$FORM{$1}/g の意味を教えてください!

お世話になります。
perl素人なのですが必要に迫られてWEBで調べながら
ソースを解析していますが、次のコードで完全に止まってしまいました。

$hts =~ s/##([^#]+)##/$FORM{$1}/g

この場合、
#hts から ##([^#]+)## を探して $FORM{$1} に全て置き換えようとしていると思うのですが、以下2点が理解できず困っています。

1.##([^#]+)## の意味
$htsに##で囲まれた文字列が複数あるのでそれら全てを探すということでしょうか?

2.$FORM{$1} の意味
$1は1.で検索した結果だと思いますが、$FORM{ }は一体なんでしょうか?

素人がいきなり解析するのは無謀なのは承知の上ですが、
どうしても業務で必要なので、お知恵をお貸し下さい。
よろしくお願いいたします。

Aベストアンサー

1.
perlを基準に「正規表現」で調べてごらん

2.
同じくperlでHTMLのformデータを受け取る方法を調べてごらん

Qforeach (1..4){ 英文字$_→$新しい変数として使いたい

$a1="あああ";
$a2="いいい";
$a3="ううう";
$a4="えええ";
$a5="おおお";
foreach (1..5){
$view = "a$_";
print <<"HTML";
$view<BR>

HTML
}

の時、$viewに$a1~$a5の値を表示させるようにしたいのですが、上記の場合ですとa1~a5として表示されます。

foreachで$_で順に数字をaと組み合わせて出来た文字列を変数として使い、元々指定してある値を取得するようにしたいのです。

どのようにすれば解決できますでしょうか。ご掲示頂けましたら幸いです。

Aベストアンサー

$a1="あああ";
$a2="いいい";
$a3="ううう";
$a4="えええ";
$a5="おおお";
foreach (1..5){
$view = ${"a$_"};
print <<"HTML";
$view<BR>

HTML
}

Q$in{'~'}を$~に変換

CGIを改造中です。
変数の処理なのですが、サブルーチン内で利用するときに「$in{'~'}」と言う形でしか表示してくれません。これを「$~」の形にしたいです。
数が少なければ「$~ = $in{'~'}」を個数書けばいいのでしょうけど、結構数があるので、何か簡単な方法で変換できないかと考えています。
良い方法があれば教えてください。

Aベストアンサー

ハッシュのままで何か不都合があるのかなと
疑問に思いつつ・・・
#実際ハッシュは
#「(変数の)値に別の値を対応させる」
#ために存在するわけだから

けど,まあ,やろうと思えばkeys関数でできますよ.

%in=(
'X' => 1,
'Y' => 2,
'Z' => 3,
);

for $key (keys %in){
${$key}=$in{"$key"};
print "key; $key ${$key}\n";
}

print "$X $Y $Z";

strictとwarningsのプラグマを外さないといけないので
副作用の方が大きいでしょうが.

Q変数 $abc と ${abc}

$abcを
${abc}と書くのはなぜですか
よろしくお願いします。

Aベストアンサー

正確なところは知らないのですが、
{}で囲むと変数名を明確にすることができます。
$abc = "123";
の時、$abc . "456"のつもりで
print "$abc456";
とすると、変数abc456の内容が出力されます。
一方、print "${abc}456";
とすると、上手く行きます。


おすすめ情報