- 締切済み
インデックス(index)関数を用いて
ある数値配列をもったファイルがあります。(100個ほど数値があるとしてください)その中から、自分でプログラムを作る際に指定した連続した配列(7、8個程度だと考えてくだされば結構です)を探し、それが見つかった場所から配列の最後までを表示するプログラムを作りたいんですが、どのようにしたらいいんでしょうか? インデックスindexだけでは、指定した文字が存在するかしないかの判断はできると思われるんですが。 実行する際には、以下のようにするつもりです。 プログラムファイル名.pl データファイル(数値配列)名.txt 検索する数値列(ここでは簡単に表示するために1234567)としておきます。 わかりにくくてすいませんが、回答よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- urakids
- ベストアンサー率77% (7/9)
第一引数を下記で受け取ると @data=<>; 第二引数が受け取れないと思いますよ。 一応、内容に沿っているのでは?と思えるように 書き換えましたが、chaimasukaさんの回答の方が すっきりしていて良いかもしれませんね。 #!/usr/bin/perl -w use strict; my(@DATA, $out); #引数チェック if ($#ARGV < 1) { print qq(引数が足りない。\n); print qq(perl $0 data.txt search_num\n); exit(1); } #ファイルオープン open(FILE, "$ARGV[0]") or die("$ARGV[0]が開けない"); eval{flock(FILE,1);}; @DATA = <FILE>; close(FILE); #配列内チェック foreach(@DATA) { my($len, $str); #文字列位置取得 if ($_ =~ /^>/) { next; } $len = index($_, $ARGV[1]); if($len == -1) { #文字列が見つからなかったので次へ next; } #指定位置以降を取得 $str = substr($_, $len); $str =~ tr/\r\n//d; $out .= $str; #print qq($str); } print qq($out);
- chaimasuka
- ベストアンサー率57% (26/45)
index, substr, length にこだわらないのであれば、 正規表現を用いて、以下のようにすっきり書けると思います。 -------------------------------------------------------------------------------- #!/usr/bin/perl use strict; use warnings; use Fatal qw(open close); sub usage { die "Usage: perl <data.txt> <search_num>\n"; } my $filepath = shift or usage(); my $keynumber = shift or usage(); my $flag; open my $fh, '<', $filepath; while ( <$fh> ) { print, next if $flag; $flag = 1, print "$1\n" if /($keynumber.*)$/; } close $fh; --------------------------------------------------------------------------------
お礼
実行できました。ありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
すみません, 正直なところ「やりたいこと」が見当つきません. できれば具体的な例で「何をやりたいのか」を書いてもらえませんか?
補足
>acdeerer kiuj database data sequence 123659856986578569871225989785642358945623213 123654885456523546875448675135487313548313549 123457854678798453735475678454564867834346767 545467542123456876543531346874346754345646434 547895487989865656232154879895651245787565451 123456789012365498745612300001235644788952122 上の内容のファイルがあります。 今回知りたいのは、質問欄にも記載しましたが、自分でプログラムを実行する際に12345678を指定し、それから始まる数値配列をindex関数で探し、そこから最後の数値までを表示させたいと考えているんです。 実行結果としては123456789012365498745612300001235644788952122 (最後の行)だけを表示させたいんです。 index substr length関数を使うのはわかるんですがNo1さんの補足の欄にも記載しましたが、そのプログラムにどのようにindex substr lengthを応用させたらいいんですか?
- urakids
- ベストアンサー率77% (7/9)
こういった感じではどうですか? #!/usr/bin/perl -w use strict; my(@DATA); #引数チェック if ($#ARGV < 1) { print qq(引数が足りない。\n); print qq(perl $0 data.txt search_num\n); exit(1); } #ファイルオ^プン open(FILE, "$ARGV[0]") or die("$ARGV[0]が開けない"); eval{flock(FILE,1);}; @DATA = <FILE>; close(FILE); #配列内チェック foreach(@DATA) { my($len, $str); #文字列位置取得 $len = index($_, $ARGV[1]); #指定位置以降を取得 $str = substr($_, $len); print qq($str); } たぶん書かれた内容にあったプログラムだと思いますが・・・。
補足
以下のプログラムをつくったんですが、これを実行するだけでは実行する際に自分の指定した文字列以降の文字列を表示させることができません。 どこにindex(文字位置の指定) substr(指定した文字列以降の文字を表示させるための条件文) length(文字列長を指定)をいれるとおもうのですが、どのようにするべきでしょうか? #! /usr/bin/perl @data=<>; print "普通の配列\n"; foreach $line(@data) { if($line!~/^>/) { chomp $line; $data.=$line; print "$line"; } } exit;
お礼
わかりました、ありがとうございます。