質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

2回答

443閲覧

perlでの文字の抽出方法について

shigoto

総合スコア30

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2017/07/12 03:00

お世話になります。
perlでjson記載の文字列があるのですが、その中からある部分を抜き出して
変数に代入するにはどうしたらいいのでしょうか。

例:
aaa:11111
bbb:wwwww
11cc:fgfgfg
test:333-gggg-222
ddd:cvcv1111

この中から333-gggg-222を探して変数に入れるには
どうしたらいいのでしょうか。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

perlのパターンマッチング演算子の挙動はなかなか複雑です。
まず、スカラーコンテキストで評価されているかリストコンテキストで評価されているかで挙動が異なります。更に、部分文字列が指定されているか否かで返り値が変わってきます。
上記ではリストコンテキストでの評価を成立させるために左辺をリストにする必要があります。

このスタイルは意外に紹介されていないようですが、私はこういうケースでは最もシンプルかつ直感的だと思っています。

詳しくは perldocを参照するのが良いでしょう。

投稿2017/07/12 05:41

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shigoto

2017/07/13 01:29 編集

んー難しいですね。 つまり今回の例では/test:(\S+)/の( )カッコの中のデータが変数へ代入されている という理解です。 この勉強をしていくキーワードは「パターンマッチング演算子」でいいのでしょうか。 なかなかわかりやすいサイトが無いですね。。
KojiDoi

2017/07/13 02:21

本買いましょう。「プログラミングperl」は座右に備えておいたほうがいいかと。
KojiDoi

2017/07/13 02:27

ネットの情報もいいですが、いい加減なことを書いてあったりもするのであまり頼りすぎるのもキケンです。私やester41さんが紹介しているperldoc以上に信頼できるサイトは中々無いと思います。 もともとこの演算子の挙動は複雑なので一発で頭に入らないのは仕方ないです。とにかく、リストコンテキストか否か、()を使っているか否か、gオプションを指定しているか否かなど、場合分けをしてそれぞれの返り値を確かめてみることです。
shigoto

2017/07/13 04:13

了解しました。 有り難うございました。m<..>m
guest

0

質問文が今ひとつ曖昧ですが、意図は、test:に続く改行までの文字列を取得したいということでいいんでしょうか。
その文字列がまるごと$_に入っているとして、

perl

1($a)=/test:(\S+)/; 2コード

これで$aに333-gggg-222が入ります。

投稿2017/07/12 03:37

編集2017/07/12 03:38
KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shigoto

2017/07/12 03:45

すみません、違います。実際には改行は無く1行の長文の中かからキーワードを抽出したいのです。
KojiDoi

2017/07/12 03:52

だとすると、上で改行で示されている部分には実際にはどのような文字が入るのですか? カンマですか、スペースですか? その区切り文字の前後にスペースが入ったりすることは許容されますか? その辺の条件はしっかり書いてもらわないと正確な回答はできませんよ。
shigoto

2017/07/12 04:02

有り難うございます。スペースが入っています。 aaa:11111 bbb:wwwww 11cc:fgfgfg test:333-gggg-222 ddd:cvcv1111 な感じです。
KojiDoi

2017/07/12 04:09

ならば上ので大丈夫のはずです。自分で確かめてみてください。ダメだったらどうダメだったのかを詳しく追記して下さい。
shigoto

2017/07/12 05:00

($a)=/test:(\S+)/; (カッコ$a )の意味って配列なのですね。 配列にしないとでないのですね。。なぜだ・・・。 有り難うございます。。
shigoto

2017/07/12 05:13

すみません、この式はなぜ test:333-gggg-222が代入されず333-gggg-222のみ抽出できるのか わかりません。ネットで検索してますが、よくわからず、勉強したいのでどこか載ってるサイトなどご存知ないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問