• ベストアンサー

パターンマッチ

perlの勉強を始めてまだ1週間くらいの初心者です。ゼミでperlのプログラムを渡されて解読するように言われperlを勉強しています。早速、質問なのです。 $fhはspecファイルを読みこんでいます。 1:while(my $line=<$fh>){ 2: chomp $line; 3: next if($line=~ /^\s*\#/ || $line=~ /^\s*$/); 4: : 5: : と続いて行きます。質問はプログラム3行目の $line=~ /^\s*\#/ || $line=~ /^\s*$/ の意味です。この意味がいまいち良く分りません。どなたか教えていただけないでしょうか。 ちなみにこのプログラムはUNIX MAGAZINE2005.9で紹介されたgenhtpgというシステムのプログラムと聞いています。

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • SHOO-3
  • ベストアンサー率56% (28/50)
回答No.1

各行が 0個以上のスペース文字から始まり、その直後に#がついている、 もしくは0個以上のスペース文字のみで構成されている 場合、ファイルの次の行に読みに行く。 正規表現のマッチングです。 たぶん、#から始まるコメント行と空白行を無いものとするために入れられてます。

mizumaki22
質問者

お礼

ありとうございます。参考になりました!!

関連するQ&A

  • perl:パターンマッチを使ったifの条件

    perlでパターンマッチを使ったifの条件が必ずTRUEになってしまいます。 以下は条件です。二つのファイルがあって、片方のファイルのある列の文字列と別のファイルのある列の文字列が一致したら一致した行の1列目を出力するというプログラムです。 perl v5.12.3 『oct_gene.csv』は以下のような2列のファイルで、2列目であるalphabetの群は空白で区切られています。文字コードはASCIIです。 1 zinc finger protein of the cerebellum 3 0 stathmin-like 2 . . . . 『RNA.csv』は以下のような3列のファイルで、3列目のalphabet群は同じく空白で区切られています。文字コードはUTF-8です。 1 NM_324891 sin3 associated polypeptide 2 NM_53344 Nanog homeobox . . . open (WRITE, ">RNAseq_Oct.csv"); open(FILE, "RNA.csv"); while($line = <FILE>){ chomp $line; @fact = split /\t/, $line; open(OCT, "oct_gene.csv"); while($octline = <OCT>){ chomp $octline; @oct = split /\t/, $octline; if($fact[2] =~ /$oct[1]/){ print WRITE $fact[2] . "\t" . $oct[1] ."\n"; last; } } close (OCT); } close (FILE); close (WRITE); この中のif文がうまく働かず、whileで繰り返すまでもなく必ず if($fact[2] =~ /$oct[1]/) が成り立ってしまいます。 どなたか詳しい方、どうかご教示願います。 それではよろしくお願いします。

    • ベストアンサー
    • Perl
  • パターンマッチと除算

    perl初心者です。学生でperlを学びはじめたばかりです。 文の変換プログラムをperlで作りたいのですが、 各辺が5cmの四角形→50mm 正方形 30分間の走りこみ→0.5時間 マラソン という具合に言葉の置き換えと数字の変換を同時に行えるようなプログラムを作りたいです。 また、数字を拾うときに言葉によって式を変えたいです。 $pattern =~ s///g;と数値演算子/を使ってやるのは分かるんですが、それをどう組み合わせて使ったらよいのかわかりません。 簡単なことを質問して申し訳ありません。 どうかよろしくお願いします。

    • ベストアンサー
    • Perl
  • ファイルのパターンマッチ処理の書き方

    現在Perlを勉強中です。 あるところからhtmlファイルをダウンロードした後、リンクを抽出する というスクリプトを、以下のように書いてみました。 (ファイルの各行について、「href="」と「"」の間にある、「"」以外が連続する部分を抽出する。 という考えです。) ----ここから------------------------------------------------- #!/usr/bin/perl ##################################################### #ここに、あるところから temp.htm をとってくる処理がある。# ##################################################### # temp.htm 中、 href でリンクされているページを出力 open ( FILE, "temp.htm"); while (<FILE>){ print ("$1\n") if /.*href="([^"]*.html)".*/; } ---ここまで-------------------------------------------------- この抽出部分はもっと簡潔に書けるものでしょうか? と言いますのは、これでも、Cに比べれば簡単なのですが、sedなら、 sed -n 's/.*href="\([^"]*.html\)".*/\1/p' temp.htm の1行で済むところなので、 一々ファイルを開いてwhileでまわすという書き方をするのが面倒だな と思いましたので質問させて頂きました。 (もっとも、sedはそのために特化したコマンドなので さすがにそれと同等に簡単に書けることを望むのが間違いなのかもしれませんが、 「簡単なことは簡単に...」がモットーのようなので、ひょっとしてという期待がありまして。。。) これは、私の書き方が冗長なのか、それとも、perlではこう書くのが普通なのか、 perlの勉強を始めたばかりで判断がつきません。 どちらなのかご教授いただけると幸です。 また、他にもこう書けるまたは私ならこう書くという御意見もお伺いできたら嬉しいです。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • perlからphpを実行して結果を得る方法

    perlのプログラムから同一サーバー内のphpを実行してその結果を取得したいのですが、うまくいきません。 print.phpというファイルの中身が <? echo "<div>1234567890</div>"; ?> だとして、これをブラウザで見た場合のソースは <div>1234567890</div> となるわけで、この1234567890をperlのプログラム内で表示するために main.cgiというプログラム内で $data = '/***/www/print.php'; open(FH,$data); @list = <FH>; foreach $data_line ( @list ) { if ($data_line =~/<div>/ ){ $data_line =~ s/<div>//i; $data_line =~ s/<\/div>//i; print = $data_line; } } close(FH); のような処理をすると echo "1234567890"; という実行前のphpの中身が表示されてしまいます。 表示したい結果はこの場合ブラウザでphpを実行した時のソースからdivタグをperl側で抜き取った 1234567890 なのですが、同じ事をperlの書き換えで実現する上手い方法があればご教授いただけますと助かります。

    • ベストアンサー
    • CGI
  • パターンマッチングにおいて変数を使いたい (2)

    「パターンマッチングにおいて変数を使いたい」の質問で無事解決したのですが、初心者で勉強不足で中身が理解できておりません。 新しい問題が発生しました。 標準出力では正しい結果が表示されます。しかしファイルに出力すると結果のデータが出力されません。どこが間違っているのでしょうか? また、data.csvのデータが膨大であるせいか標準出力においても、終了するまでやたらおそいです。 一瞬で該当データを表示(最終結果)してくれるのですが、その後数10分間何かの処理をした後、何も表示することなくプログラムが終了します。 この処理は何をしているのでしょうか? 高速化は可能でしょうか? open(KEY, "key.csv"); open(OUT,"> res.csv"); chomp(@keys = <KEY>); close(KEY); open(VAL, "data.csv"); while ($data = <VAL>) { chomp $data; for $key (@keys) { print OUT "$data\n" and next if $data =~ /$key/; } } close(VAL);

    • ベストアンサー
    • Perl
  • テキストファイルから日本語部分を削除

    英語と日本語が交ざっているテキストから日本語部分を削除するプログラムをPerlで書きたいと思って以下のようなプログラムを組みましたが、うまくいきません。 while ( <IN> ) { chomp; tr/^[\x00-\x7f]//d; print OUT "$_\n"; } Perl初心者です。助けてください。

  • 連想配列で時間短縮したい

    aaa.txt 06011800, 5.3 06012100, 5 06020000, 4.5 06020300, 6.2 … bbb.txt 06011800, 5.1 06012100, 7.5 06020000, 5.1 06020300, 9.3 … という二つのファイルがあります。 以下のプログラムを用いて、 06011800, 5.3, 5.1 06012100, 5, 7.5 06020000, 4.5, 5.1 06020300, 6.2, 9.3 … といった感じでデータを作る事に成功したのですが、どうしてもループに無駄が多く、時間がかかってしまいます。 連想配列などを使えば時間が短縮出来そうなのですが、よくわかりません。 ご教示いただけないでしょうか。 以下、作成したプログラム。 $csvfile1 = $ARGV[0]; $csvfile2 = $ARGV[1]; open(DAT1, $csvfile1) || die $!; while($line=<DAT1>) { chomp($line); @dat = split(/,/,$line); open(DAT2, $csvfile2) || die $!; while($line2=<DAT2>) { chomp($line2); @dat2 = split(/,/,$line2); if($dat[0] == $dat2[0]){ print "$dat[0],$dat[1],$dat2[1]\n"; } } } close(DAT);

    • ベストアンサー
    • Perl
  • Perlプログラムの変更方法

    メーリングリストのようなものをPerlで作って いるのですが、text.txtを一回だけ読み込むような プログラムに変更したいのですが、どこをどのように 変更すれば良いのでしょうか。 ================プログラム本体===================== #!/usr/bin/perl $wunderprize='100% genuine faux diamond'; open LIST,"list.txt"; while($name =<LIST>){ chomp($name); @f=split(/\s+/,$name); if($f[2] ne""){ open MAIL, "|mail $f[2]"; open TEXT,"text.txt"; while($line=<TEXT>){ $line=~ s/<FIRST>/$f[0]/g; $line=~ s/<FAMILY>/$f[1]/g; $line=~ s/<SUCKER>/$f[0] $f[1]/g; $line=~ s/<TRINKET>/fabulous $wunderprize/g; print MAIL "$line\n"; } close MAIL; close TEXT; } } close LIST; ==============text.txt======================== Dear <FIRST>, You have been chosen to win a brand new <TRINKET>!Free! Could you use another <TRINKET> in the <FAMILY> household? Yes <SUCKER>, I bet you could! Just respond by... ===============list.txt======================= 名前 名字 メールアドレス (実際はきちんとしたものを打ち込みます)

    • ベストアンサー
    • Perl
  • perlスクリプト

    perlの勉強をしているものです。人様の作ったスクリプトを解析しています。以下のスクリプトについて質問があります。 while(chomp($in = <STDIN>)){ last if ($in eq "\cD"); print "$in"; } このスクリプトに出てきている、"\cD"の意味と、ifの前に出てきているlastの働きが分かりません。またこのスクリプトは全体としてどのような仕事をするのでしょうか?? 分かる方いらっしゃいましたら、ご教授いただけると幸いです。よろしくお願いします。

  • PerlとUnixの関係

    現在、Perlを勉強しているものです。バッチプログラムやVBScriptを使って、コマンドラインで便利に開発するようにしています。近々PCを購入し、UNIXでの開発をしようとおもっています。その際には、シェルプログラムなるものを覚えて便利に開発したいなあとおもっています。 話はそれますが、私はコンピュータ専門書籍の本屋さん(名古屋で一番の品数があるとおもわれます)に勤めているのですが、返品の棚にやや古めの「Unix&Perl」みたいな題名の本がありました。 本題に戻りますが、UnixではPerlをコマンドラインの機能の一部としてつかえたりするのですか?Windowsだとバッチプログラムで足りないところはJScriptやVBScriptで補ったりしなくてはならないのですが、Unixのシェルではその役目はPerlが果たしてくれたりすることがあるんでしょうか?要するに、シェルプログラムの機能強化としてPerlを使えたりするのでしょうか? あと、これは本題とは関係ないのですが、Unixを入れるならばFreeBSDやSoralisなどがあるみたいですが、どのディストリビューション?を選択すれば一番いいとおもいますか? 分かる方、回答をお願いします。よろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう