正規表現の置き換え文字列部分で使用できる$1や$2の使用方法を教えてください!

以下のソース1のようにs///gの置き換え文字列部分に$1や$2を直接記述すれば、1つ目と2つ目のマッチ部分で置換が行われるのは確認しました。
しかし、ソース2のように置き換え文字列部分を変数に代入したのち、使用すると、正しく置換が行われません。
$1や$2を含んだ置き換え文字列を変数に持っている状態で、ソース1と同じ結果を得るにはどうしたらよいか、ご存知でしたら教えて下さい。

##############################
# ソース1
##############################
#!/usr/bin/perl

$data = '1234567';
$ptn = '(\d{3})(\d{4})';
$data =~ s/$ptn/$1-$2/g;
##############################

$dataは123-4567となる。

##############################
# ソース2
##############################
#!/usr/bin/perl

$data = '1234567';
$ptn = '(\d{3})(\d{4})';
$str = "$1-$2";
$data =~ s/$ptn/$str/g;
##############################

$dataは-となる。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

こんにちは~


たとえばこんな感じでは

$data = '1234567';
$ptn = '(\d{3})(\d{4})';
$str = '$1-$2';
eval "\$data =~ s/$ptn/$str/g";
    • good
    • 0
この回答へのお礼

期待していた結果が得られましたー。
evalを使用するのですね。勉強になります。
本当にありがとうございました。

お礼日時:2006/11/24 20:24

No1 よりも劣るかも知れませんが、別の方法で.....。



$str = '$1-$2';
$data =~ s/$ptn/"\"$str\""/eeg;
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

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

Qスマホの便利な利用方法

新しいスマホの購入で、古いスマホが手元にあります。
この古いスマホの利用方法で便利なものがあれば教えてください。
今考えているのは、カーナビとして使えないかと思っております。
wi-fi 環境下では使えますが、ドコモの電波は使えないので家の中でしか
使えません。
新しいスマホと連携して、使う方法はありますか、スマホは新旧どちらもSonyの
エクスぺリアです。
よろしくお願いいたします。

Aベストアンサー

こんばんは。

んー。古い端末の使い道、ということは、買い換えた新しいス
マホがあるんですよね。どうせ新しいスマホ持って車に乗るで
しょうから、カーナビは通信出来る新しいスマホでやった方が
いいと思うのですが。

アイデアとしては
・自宅、玄関もしくはペット監視用のカメラ
・IP電話を使った固定電話もどき
・電話メモ
・フォトフレーム(ちょっとしたインテリア)
・寝室におきっぱなしにする目覚まし
・キッチンタイマーとして台所に
・防水とはいえお風呂場で使うの少し…、という人なら、遠
 慮無くお風呂場で使う(壊れてもダメージ少ないでしょう)

こんなところはいかがでしょうか。

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データを受け取る方法を調べてごらん

Q相手のスマホにハッキングして内容をパソコンで見る方法ってできますか?

妻の行動が怪しいく、24時間常にスマホを離さず、深夜2時~3時くらいに毎日スマホをいじっています。スキをみてスマホの中身を確認するのは不可能かもしれませんので、パソコンから妻のスマホをハッキングできますか?
または、もっと簡単な方法で調べる方法はありますか?

Aベストアンサー

>パソコンから妻のスマホをハッキングできますか?
不可能ではありませんが、専門知識の無い方には残念ながらムリです。

実際に浮気されているようでしたら、小型のGPSロガーを購入して、奥様のバッグなり自家用車に仕込んだ方がお手軽だと思います。

素直に「最近、どうしてスマホを肌身離さないの?」、「毎日深夜に何をしているの?」、「浮気してるんじゃないかと心配してしまう」と伝えたほうがストレートだと思いますが。

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のプラグマを外さないといけないので
副作用の方が大きいでしょうが.

QiTunesからスマホ(アンドロイド)に着信設定する方法を教えて下さい。

全くPCやiTunesにの超ビギナーです。
以前、iTunesからスマホ(アンドロイド)に着信設定が出来ると言う話を聞きました。
Googleで検索しましたが全く設定方法がチンプンカンプンです。
超ビギナーにスマホに音楽(着信設定)を設定する方法を教えて下さい。
スマホはAUのシャープSHL22です。
よろしくお願いします。

Aベストアンサー

添付の図が見えますかね?

① 切り取り加工の範囲指定(ここからここまで)使用としている初期段階の「ここから」ボタン
② ①に同じく「ここまで」ボタン
③ 今選んである範囲の再生ボタン。試しにこのまま再生ボタンをタップしてみてください。意味がわかります。
④ 今選んである範囲。(波形の色が濃い。)
⑤ 今選んでいない対象外の範囲(波形の色が薄い。)
⑥ 保存ボタン(範囲が決まったら一つの着信音データとして保存するボタン)

さて、再生ボタンと波形表示を見ながら、あなたが着信音にしたい曲の部分、鳴り始めと鳴り終わりを①と②を使って範囲指定してください。
初期のこの段階では5~6分の曲が始めから終わりまで全部小さな画面に波形として表示されているので微妙な位置選択も難しいです。
先ずはサビならサビとしてこの5~6分の曲から欲しい部分15秒程度(お任せしますが)を大ざっぱに前後とも広めに選び、一回保存ボタンをタップし、「タイプ」の項目を「着信音」、ファイル名の項目はそのままでも、別にわかりやすい名前に書き換えてでも書き込み(元になった音楽データと同じ名前にはしないこと、1文字でも違う文字が入っているファイル名とする。)、選んだ範囲の短い曲データとして「保存」してしまい、再度一つ前の回答の「RINGDROIDを起動し、曲データを選ぶ」方やり直し、今度は今作り保存した短いデータを編集対象に選択すれば良いのでです。
この仮であれ「保存」使用とすると、「通常の着信音にする」「連絡先の着信音にする」を選ぶ画面が開きますが、これは「全員一律にこの音を着信音にする」のか、特定の個人一人から電話が来たときだけこの音が鳴るように指定する」のかの違いです。
画面にはわずか15病程度の曲が波形として表示されますので、波形位置も選びやすくなります。
編集後(正しく範囲指定後)、同じ名前で保存④上書きすれば出来上がり。

短く加工も、指定もできてしまいました。
こんな容量で着信音はこの曲のこの部分、目覚ましはこの曲のこの部分、メール着信は・・・・どんどんオリジナルのサウンドを作り指定しましょう!!!


あ~~、長かった。
お互いにお疲れ様でした。

添付の図が見えますかね?

① 切り取り加工の範囲指定(ここからここまで)使用としている初期段階の「ここから」ボタン
② ①に同じく「ここまで」ボタン
③ 今選んである範囲の再生ボタン。試しにこのまま再生ボタンをタップしてみてください。意味がわかります。
④ 今選んである範囲。(波形の色が濃い。)
⑤ 今選んでいない対象外の範囲(波形の色が薄い。)
⑥ 保存ボタン(範囲が決まったら一つの着信音データとして保存するボタン)

さて、再生ボタンと波形表示を見ながら、あなたが着信音にしたい曲の...続きを読む

QData::Dumper;でダンプ後表示した文字列\x{30fc}...

お世話になります。
下記のスクリプトを使ってrssファイル内をuse Data::Dumper;でダンプして表示してみたのですが、rssファイルがutf8で記述されているせいか
表示時に日本語の所が\x{30fc}のような文字列になってしまいます。
これをshiftjisで表示させたいのですが、試行錯誤してもうまくいきません。
どなたかご教授いただけませんでしょうか。

#!/usr/bin/perl

BEGIN{
$| = 1;
print "Content-type: text/html\n\n";
open(STDERR, ">&STDOUT");
}

use XML::RSS;
use Data::Dumper;
my $rss = new XML::RSS;
#表示形式の違いで1と2がある。
$Data::Dumper::Indent = 1;
use open IN => ":utf8"; # 入力をUTF8とする
use open OUT => ":shiftjis";
#use open ":std";
#use Encode;
#use encoding 'shiftjis', STDIN=>'utf8', STDOUT=>'sjis';
#binmode STDOUT, ":encoding(utf-8)";
#binmode STDOUT, ":encoding(shiftjis)";
#binmode STDOUT, ":encoding(euc-jp)";
#use open ":encoding(shiftjis)";

# rssをセット。
open my $fh, '< ./test.rss';
my $text = join undef, <$fh>;
close $fh;

# rssをパース
$rss->parse($text);

# ひとまず中見を知る為にダンプしてみる
print "Content-type:text/html;charset=Shift_JIS\n\n";
print "<html><head>\n";
print "<title></title></head>\n";
print "<body>\n";
print Data::Dumper->Dump([$rss]);

お世話になります。
下記のスクリプトを使ってrssファイル内をuse Data::Dumper;でダンプして表示してみたのですが、rssファイルがutf8で記述されているせいか
表示時に日本語の所が\x{30fc}のような文字列になってしまいます。
これをshiftjisで表示させたいのですが、試行錯誤してもうまくいきません。
どなたかご教授いただけませんでしょうか。

#!/usr/bin/perl

BEGIN{
$| = 1;
print "Content-type: text/html\n\n";
open(STDERR, ">&STDOUT");
}

use XML::RSS;
use Data::Dumper;
my $rs...続きを読む

Aベストアンサー

#1さんと同じですが
use encoding 'utf-8', STDOUT => 'Shift_JIS';
を始めにつける

$out_text = Data::Dumper->Dump([$rss]);
$out_text =~ s/\\x{([0-9a-f]{4})}/chr(hex($1))/eg;
print $out_text;
だけでいいと思います。

Qスマホのお気に入りをパソコンで スマホのChromeのお気に入りをパソコンでみる方法を教えてくださ

スマホのお気に入りをパソコンで

スマホのChromeのお気に入りをパソコンでみる方法を教えてください。

Aベストアンサー

スマホの種類が分からないのと、「同期」設定されているのかの2点が分からないので、両方のせときます。
android
http://ap-land.com/archives/7407
iPhone
http://enjoy.sso.biglobe.ne.jp/archives/bookmark/

Q$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );がよく

$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );

というスクリプトがあったのですが、

$wfurikae = 1 の後に;もいれずifがきています。

違和感があります。

どのような意味になるのでしょうか。

宜しくお願い致します。

Aベストアンサー

そのまんまだと思いますよ。
if 以下の条件が真の時 $wfurikae = 1となります。
Perlはいろいろな書き方ができますので、こういう書き方もありです。
英語の文法の並びにする書き方です。

Q自分の部屋でスマホをするなと言われました。何かスマホがあると錯覚させる方法またなどありませんか?

自分の部屋でスマホをするなと言われました。何かスマホがあると錯覚させる方法またなどありませんか?

Aベストアンサー

携帯カバーを、触らなさそうな隅に置いとく。そこで常にスマホ打つふりも、お忘れなく。どう?(笑)

Qperlスクリプト s/^\s+//;  s/\s+$//;  return wantarray ? @out : $out[0]; について

自作の掲示板を作ろうと思い、perlの勉強をしている者です。人様の作ったスクリプトを解析しています。以下のスクリプトはライブラリに記述されていたものです。


sub tttt {
my @out = @_;
for (@out) {
s/^\s+//;
s/\s+$//;
}
return wantarray ? @out : $out[0];


このスクリプトなんですが、 s/^\s+//; の部分の「+」と s/\s+$//; の部分の「+$」、 また「return wantarray~」 の三つの部分のスクリプトが、どういった働きをしているの分かりません。専門書やウェブ上のリファレンスも色々調べたのですが・・。

分かる方いらっしゃいましたらご教授下さると幸いです。よろしくお願いします。

Aベストアンサー

まず前2つの「+」は,正規表現における,「直前の表現を一回以上繰り返し」をあらわします.
「\s」は空白文字一文字を表す正規表現ですので,「\s+」は,「一文字以上の空白文字」になります.
次に,最初の「^」と2番目の「$」は,その正規表現がどこに現れるかを示す記号です.それぞれ,先頭と最後尾にあることを示します.
したがって,「^\s+」は,「最初に空白が一文字以上ある文字列」に,
「\s+$」は「行末に空白が一文字以上ある文字列」にヒットします.
置換構文sはご存知なんですかね.すなわち,この2文で,行の最初と最後の空白を消しているんです.

次に, wantarray ですが,
http://www2u.biglobe.ne.jp/~MAS/perl/ref/wantarray.html
によると,このサブルーチンttttを呼び出すときに,何を返り値にしているかで真偽が決まる関数です.
呼び出す時に配列を希望していたら @out 全体を,変数を希望していたら $out[0]だけを返します.


人気Q&Aランキング

おすすめ情報