• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:perl $b=$a=~/パターン/)

perlでバックスラッシュのパターンマッチを使った場合の挙動

このQ&Aのポイント
  • perlのバックスラッシュのパターンマッチを使った場合、特定のパターンに一致する文字列を取得できます。
  • パターンに/g修飾子を付けると、一致したすべての文字列を取得することができます。
  • 複数のパターンにマッチする場合、()を使って複数の変数に結果を代入することができます。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8514/19356)
回答No.1

>$b=$a=~/パターン/; >の$bには何が得られるのでしょうか。 >どんなときに使うのでしょうか。 Pealで $a=~/パターン/ という式を書いた場合、得られるのは「真」か「偽」です。 パターンが含まれているか否かが「真」または「偽」の値になり、その結果を$bに代入する事になります。 if ($a=~/パターン/ ) { print "マッチした\n"; } else { print "マッチしなかった\n"; } と書く代わりに $b=$a=~/パターン/ if ($b) { print "マッチした\n"; } else { print "マッチしなかった\n"; } と書く事が出来ます。 >($b)=$a=~/パターン/; >に/g修飾子を付けると >何も得られなくなってしまいますが >なぜでしょうか。 「エラーだから」です。 文字列がパターンにマッチしたかどうかを真か偽で返す 文字列 = ~/パターン/ という演算子には「/g」修飾文字は付けられません。付けても「結果は未定義」であり、どういう結果になるかは「決まっていない」のです。 とは言え「偽」つまり「何も入ってない状態」になる事が多いようですが。 >$a=~/(\d)\d(\d)/g;からは、 >(1,3,4,6)のリストが返されて、 そうとは限りません。 「メンドクサイからそういう実装にしている処理系も存在する可能性があるにはある」かも知れませんが、本来、返されるのは「真(空ではない何か)」と「偽(空)」です。 処理系によっては「パターンに一致したら、固定で『1』という値を返す」かも知れません。 結論は ・$bには、真(空ではない何か。何が入るかは不定)か、偽(空)が入る ・/gを付けると何が起こるか判らない(処理系に依存する。結果は不定) と言うことです。

yam2012
質問者

お礼

>・$bには、真(空ではない何か。何が入るかは不定)か、偽(空)が入る >・/gを付けると何が起こるか判らない(処理系に依存する。結果は不定) そういわれてみると確かにIF()の中で使われているので 真か偽に気付くべきでした。 このような基本的なことの調べ方が まだよく分からなくて困っていました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Perlのキャプチャ

    プログラム #!/usr/bin/perl my $str = "abc,def,ghi"; ($a,$b,$c) = $str =~ /(.*),(.*),(.*)/; print $a,"\n"; print $b,"\n"; print $c,"\n"; 実行結果 abc def ghi このようなプログラムで ($a,$b,$c) = $str =~ /(.*),(.*),(.*)/;は それぞれ$a,$b,$cにabc,def,ghiが入ります. キャプチャしたすべてを変数に入れるならこの方法ですが, defだけが欲しいのに変数を3つ用意する必要がないと思います. 間違った表記ですが, ($b) = $str =~ /(.*),(.*),(.*)/$2/; 2つ目にキャプチャした$2が変数$bに入るような表記は出来ないのでしょうか?

  • @b = grep(/マッチパターン/, @a);でなく@a = grep(/マッチパターン/, @a);でOKについて

    @b = grep(/マッチパターン/,@a);だと配列@aの中でマッチするものを探して@bに入れる・・・というのは理解できるんですが、 @a = grep(/マッチパターン/,@a);とし、 foreach $_ (@a) { print $_; } で参照した場合、@aの中のマッチパターンにマッチするのだけ表示されますけれども、ここでマッチしないのは削除されるのでしょうか・・。 @aから@aにいれる・・・となる事について、どのように@aにマッチしたものを入れ、マッチしないものは削除されるのかの仕組みについて、ご説明できる方はいらっしゃいますでしょうか(例えば内部的にpopやshiftが機能していて・・・みたいな事なのかな・・とか思うんですけれども) お手数ですが、ご存知の先生方ご教授願えましたら幸いです。

    • ベストアンサー
    • Perl
  • perlについて

    my @a = qw(a b c); my @b = ( qw(e f g) ); これの違いは何なのでしょうか? perlにおいて()で囲むのはリストとして扱うということなのでしょうが、いまいちよく分かりません。 教えてください

    • ベストアンサー
    • Perl
  • perlの構文がおかしいようです。

    構文は以下の通りです。IF文のところがおかしいようですが、どこに間違いがあるのか教えていただけないでしょうか。 sub ippack { my ($a, $b, $c, $d) = @_; return ($a << 24) | ($b << 16) | ($c << 8) | $d; } sub ipunpack() { my ($n) = @_; return (($n>>24)&0xFF,($n>>16)&0xFF,($n>>8)&0xFF,$n&0xFF); } open (IN,"<useIP.txt") while(my $input = <IN>) { if ($input =~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+) ([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/){; my $n = &ippack($1,$2,$3,$4); my $m = &ippack($5,$6,$7,$8); $n = $n & $m; $m = ~$m & 0xFFFFFFFF; for(my $i = 0; $i <= $m; $i++) { print join(".", &ipunpack($n+$i))."\n "; } } if-else($input =~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/);{ print "$input\n"; } print "\n"; }

    • ベストアンサー
    • Perl
  • Perl あっていますでしょうか?

    " " と ' ' の相違は? ""の内にある変数名は、その値に変換されます。 ''の内にあるものは、そのまま文字列として扱われます。 エスケープシーケンスは "" の内に記述した場合のみです。 $a="Hello"; 文字列Helloを変数$aに代入する。 $b="$a"; 変数$aを変数$bに代入する。 $c='$a'; $aという文字列を変数$cに代入する。 ""の内で""を使うことは出来ません。 ''の内で''も使うことは出来ません。 使うときはエスケープシーケンスを使います。 print "\"Hello\"\n"; 文字列"Hello"を表示させます。 print "'Hello'"; 'Hello'を表示させます。 ""の内で''又は''の内で""を使うことは出来ます。 $a="あいうえお"; 文字列 あいうえお を変数$aに代入する。 print "\n$a\n"; 改行して あいうえお表示して 改行する。 print '\n$a'; 文字列\n$aを表示する。 文字列の結合 . (ピリオド)を使って前後の文字列を連結することが可能です。 $a="Hello"." "."World"; 変数$aに文字列Helloと半角スペースとWorldをつないだものを代入します。 $a="c"x3; 変数$aに文字cを3回つないだものを代入します。 $a="A"; 文字Aを変数$aに代入する。 $b="B"; 文字Bを変数$bに代入する。 $c="C"; 文字Cを変数$cに代入する。 print $a.$bx3.$c; 文字Aと文字Bを3回結合したものと文字Cを表示する。 画面にはabbbcと表示されます。

    • ベストアンサー
    • Perl
  • m//gとm//gcの違い

    m//gとm//gcにはどんな違いがあるのでしょうか。 いくつか解説を見たのですが、どれも「m//gではマッチに失敗すると通常は文字列の検索位置が文字列の先頭にリセットされるが、cをつける (m//gc) と、これを防ぐことができる」のような感じでさらっと説明されていて、イマイチ理解できません。スクリプトを適当に作成して試してみたのですが、cをつけてもつけなくても結果は変わらないような気がします。これは、つまり、cがあるときと無いときの違いは、効率の違いとして現れるだけで一般的にはcをつけておけばいいと考えていいのでしょうか。 http://perldoc.jp/docs/perl/5.6.1/perlop.pod#item_m_PATTERN_cgimosx 以下のスクリプトはindex関数的に配列@strの各要素文字列に含まれる検索文字列$findwordの位置を表示させるものですが、やはりcをつけてもつけなくても結果は変わりませんでした。 my @str = ('pattern match', 'at random', 'exponentiation operator'); my $findword = 'at'; my $len = length $findword; print "search '$findword'\n\n"; foreach my $str (@str) { my $count; print '0123456789' x 3, "\n"; print "$str\n"; { if ($str =~ /$findword/ogc) { printf("match%d: %d\n", ++$count, pos($str)-$len) } else { print "\n"; last } redo; } } # /oはパターン内の不変変数を一度コンパイルすれば十分というものです

    • ベストアンサー
    • Perl
  • perlの内容なのですがこれで合っていますでしょうか?

    print 関数は文字列や数値だけでなく、変数を指定してその値を表示することもできます。 $a=1; 1を$aに代入する。 print $a; 変数$aの値を表示させる。 $a=2; 変数$aに2を代入する。 $b=3; 変数$bに3を代入する。 print "変数\$aに変数\$bを代入\n"; 「変数$aに変数$bを代入」という文字を表示させて改行する。 $a=$b; 変数$bの値を変数$aに代入する。 print "\$a="; 「$a=」を表示させる。 print $a; 変数$aの値を表示させる。 print ",\$b="; 「,$b=」を表示させる。 print $b; 変数$bの値を表示させる。 print "\n"; 改行を表示させる。 実行結果は↓↓↓↓↓↓↓ 変数$aに変数$bを代入 $a=3,$b=3 変数の書き方 文は ; で区切るが、1行に並べることも可能。 $a=2; $b=3; ↓ $a=2; $b=3; 複数の変数に、同時に値を代入することも可能。 $a=2; $b=2; ↓ $a=$b=2;

    • ベストアンサー
    • Perl
  • 良い考え方を知りたいです。(パターン照合について)

    良い考え方を知りたいです。  良い…処理が早い。  考え方…アルゴリズム(と言うのでしょうか) 与えられた部品のリストをマスターと照合し、完成させるタイプ(パターン)を判別したいと考えています。状況の例としては、 ○与えられる部品リスト   A,C,E,G,I,K,L,N,P… (アルファベットには8文字程度の文字列が入ります) ○マスター保持している例  パターン1:A,B,D,E,G,J,K…  パターン2:B,D,E,G,J,M…  パターン3:J,S,T,V,W,X,Z…  パターン4:A,B,D,Y,Z… パターン5:A,C,E,G,I,K,L,N,P…  (各タイプに保持されているマスタデータは順不同、且つ不特定数です) こんな感じで、データベース(MS AccessやSQLサーバー等)に保持されている各タイプと照合し、 与えられた部品リストがどのタイプ(パターン)に合致するか(一番近いか)を 判別するプログラムを作成したいのですが、 どんな考え方が適しているか、ご教示頂けないでしょうか? 照合するパターンはおよそ200弱、リストで渡される部品数は50前後です。 プログラミング自体は素人ですが、 ・適当なアルゴリズム ・サンプルソース(言語は何でも結構です) ・参考資料の探し方、検索場所 いずれかでご回答お願い申し上げます。

  • Perlの戻り値について

    配列の戻り値が理解できていないのですが、 Perlで正しく動作させるためには どのように記述したら良いのでしょうか? 戻り値の動作を詳しく書いてある(出来れば図入りで) 本はありますか? 例) sub a { my @a = ('A'); return (@a, "B", 2); } my (@a, $b, $c) = &a; print "a=[@a] b=[$b] c=[$c]\n"; # a=[A] b=[B] c=[2] # これを期待していたが # a=[A B 2] b=[] c=[] # こちらになる

    • ベストアンサー
    • Perl
  • Perlで1~10まで全部足す。簡単に書くには?

    題名のとおりなんですが。 Perlで1~10まで全部足すのに、 1番簡単に書いたらどんな感じなるでしょうか? (一回足すごとに結果は表示) 私は全然浮かばず、 $a = 1 print "$a\n" $b = $a + 1 print "$b\n" $c = $b +2 " …続く こんな感じのお粗末なものを書きました。 whileやforを使えばもっと簡単に書けると思いますが、 どなたかご存知でしたら教えてください。

    • ベストアンサー
    • Perl
子機が親機をずっと探している
このQ&Aのポイント
  • 子機を親機の近くに置いてもずっと親機を探していて、子機の設定も何もできない
  • Windowsで無線LAN接続している環境で、子機が親機を探し続けて設定ができない状況です
  • ブラザーのmfc-727dという製品で、子機が親機を見つけられず設定ができません
回答を見る

専門家に質問してみよう