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

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

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

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

Q&A

解決済

2回答

6856閲覧

Perl 特定列かつ数字のみの抜き出し

moana_39

総合スコア10

Perl

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

0グッド

0クリップ

投稿2016/11/22 06:11

編集2016/11/22 06:26

perl初心者で、現在勉強中です。perlを利用して、以下のようなことをしたいと考えています。

test.log =============================== test 65 aaaaa 23 perl 1 example 0 main 2 sub 78 ===============================

上記ファイルを読み込んで、aaaaaからmainまでの行を抜き出し、かつその隣の数字だけを表示したいと思っています。

(イメージ)
23
1
0
2

aaaaaからmainまでを指定して抽出することはできました。以下の、特定行を抜き出すコードと、数字のみを抜き出すコードを利用すると思うのですが、、、
実行すると空欄になってしまい、目的の結果を得ることができません。
if文の構成が間違っていると思うのですが、もし分かる方がいらっしゃいましたら、教えて頂けますでしょうか。

(特定行を抜き出すソースコード)

open FH, "test.log" or die $!; $flag = 0; while ($data = <FH>) { chomp $data; $data =~ s/[^0-9]//g; if ($data eq "aaaaa" ) { $flag = 1 } elsif ($data eq "main") { $flag = 0 } elsif ($flag) { print "$data\n" } } close FH;

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

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

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

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

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

guest

回答2

0

区切り文字についてはA.Ichiさんと同じ。

..演算子を使ってみました。この使いかたを初めて見ると不思議な感じがしますが、動きます。

lang

1open my $fh, '<', "test.log" or die $!; 2 3while ( $data = <$fh> ) { 4 chomp $data; 5 my ( $name, $number ) = split /\s+/, $data; 6 7 print "$number\n" 8 if ( $name eq 'aaaaa' ) .. ( $name eq 'main' ); 9} 10 11close $fh;

投稿2016/11/22 08:41

編集2016/11/22 08:43
ikedas

総合スコア4229

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

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

moana_39

2016/11/24 00:40

ご回答ありがとうございます。 ..演算子は初めて見ました。 perlの演算子は沢山あってなかなか覚えるのが大変ですが、実践して身に付けたいと思います。 ありがとうございました。
guest

0

ベストアンサー

test.logの区切り文字はタブまたはブランクとしています。(複数可)

perl

1open FH, "test.log" or die $!; 2$flag = 0; 3while ($data = <FH>) { 4 chomp $data; 5 $data =~ s/[\s ]+/ /g; 6 ($name,$suu,) = split (/\s/, $data); 7 if ($name eq "aaaaa" ) { $flag = 1 } 8 if ($flag) { print "$suu\n" } 9 if ($name eq "main") { $flag = 0 } 10} 11close FH;

投稿2016/11/22 06:49

編集2016/11/22 07:31
A.Ichi

総合スコア4070

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

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

moana_39

2016/11/24 00:38

ご回答ありがとうございます。 split関数について理解しておらず、勉強不足でした。 もしtest.logがこのような場合、split関数ではなく他の関数を利用したほうがよいのでしょうか。 (testの後にスペース&files:を付け加える) test.log =============================== test files: 65 aaaaa files: 23 perl files: 1 example files: 0 main files: 2 sub files: 78 ===============================
A.Ichi

2016/11/24 01:03

($name,$dummy,$suu) = split (/\s/, $data);としてあげれば、行けるかと思います。
moana_39

2016/11/24 01:43

上手く表示できなかったので、もう少し勉強・実践してみたいと思います。ありがとうございました^^
moana_39

2016/11/24 01:50

申し訳ありません。わたしのコード記載ミスでした。目的の結果を得ることができました、ありがとうございました。
A.Ichi

2016/11/24 02:06

ikedasさんのsplitの書き方が良いと思います。()は、有っても無くても良いです。\sはスペースまたはタブがセパレータとなります。セパレータ文字が複数有る場合は、+を付けて繰り返しが1個以上とします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問