• ベストアンサー

アスタリスクを検索できません

sample_の回答

  • sample_
  • ベストアンサー率76% (20/26)
回答No.1

>Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE / at hash.pl line 5, <> line 1. まずは、エラーについてですが直訳してみると 「正規表現の中に量指定子が従うべきものがないですよ!」 って言ってますね。 では、量指定子とは何かという話ですが、種類と意味を下記に記しておきます。  ?・・・前にある文字または条件に対し0個または1個にマッチ  *・・・前にある文字または条件に対し0個以上にマッチ  +・・・前にある文字または条件に対し1個以上にマッチ  {a,b}・・・前にある文字または条件に対しa個~b個続いた場合にマッチ と、言った感じです。 今回は、アスタリスクにマッチさせたいという話でしたが、 アスタリスクは、量指定子というPerl内での決まった役割がある為 量指定子として振る舞おうとしたが、前に文字または条件が無いため 何に対し0個以上マッチすればよいか指定してないのでエラーを吐いたわけです。 これらの量指定子を使う場合は、前になにかないといけないわけです。 さて、量指定子のように決まった役割をもったものに対し本来の記号の 意味として使いたい場合は、エスケープしてあげる必要があります。 エスケープするには、\(OSによっては→\のように表示)をつけてあげます。 よって、 $pattern = '*'; を $pattern = '\*'; としてあげるとアスタリスクにマッチするようになります!

mtd15
質問者

お礼

量指定子についてのご丁寧な説明、ありがとうございます。 *以外のものにも注意の必要があるようなので、今後の参考にさせていただきたいと思います。

関連するQ&A

  • perlです。配列ファイルをよみこんで、1つの要素を上書きする方法

    配列のファイルがあり、それをよみこんで、1つの要素だけ上書きして保存する方法を教えてください。 ex. file.datを以下のようなファイルだとして・・・ あいうえを かきくけこ さしすせそ たちつてと file.datが、 さしすせそ となるようにしたいのです。(つまり、三番目の要素を取り出し、上書き保存するというもの) 以下のように書いてみましたがうまく動きません。 open()やclose()は一回使うだけでいいように、読み書き両用で開いてみました。 $_にはファイル名が入っています。 open(FILE,"+<$_"); @temp=<FILE>; $temp2=$temp[2]; print FILE $temp2; close(LOGFILE); +<を+>とすると、ファイルが空(何も無くなる)となります。 まず読み専用で開いて、ファイルを閉じた後。上書き用で開いたほうがいいのでしょうか??

    • ベストアンサー
    • CGI
  • 配列内の文字列検索をしたい

    お世話になっております、またjavascriptで詰まってしました。現在作ってるソースは以下のイメージです。 var temp= hensuu; var list = "aa,bb,cc"; //tempがaa,bb,ccの文字を含んでいたら処理 if(list.indexOf(temp)!=-1){ //ここで何番目の要素か知りたい } という処理をしているのですがif(list.indexOf(temp)!=-1)の中で「文字列(list)に存在する」だけでなく,「区切りの何番目の要素か」も知りたいんですがそういう便利な関数か方法はあるでしょうか? list.indexOf(temp)の返す値は「文字列が見つかった場所」なのでリストの順番ではないんですよね…。 for文でひとつひとつ回すしか方法は無いのでしょうか??LIST(もしくは配列)内検索関数みたいなのがあればナイスなんですが…。分かる方、ご教授頂けたらこれ幸いです。

  • perl 5.8.8 日本語マッチ

    perl5.8.8を使っています。 日本語にマッチする正規表現を書きたいのですが、どうしてもマッチしません。 例えば、以下のファイルtest.txtから「さしすせそ」だけを抽出し、表示させたいです。 ---------test.txt-------------------------------- あいうえお かきくけこ さしすせそ たちつてと -------------------------------------------------- ----------test.pl-------------------------------- use strict; use warnings; open(FILE, 'test.txt') or die "$!"; my @file = <FILE>; close(FILE); foreach my $line (@file){ if($line =~ /^さ/){ print "$line\n"; } } ------------------------------------------------ このtest.plを実行しても「さしすせそ」を抽出することが できません。 どうしたらよいのでしょうか? 自宅の新しいバージョンのperlだとできるのですが 会社のperlは5.8.8で顧客環境でもあるのでバージョンアップも できません。 すみませんが、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • perl 計算結果をファイルへ出力したい

    perl やり始めたばかりです。宜しくお願いします。 入力ファイル data.txt があるとします。 data.txt は、 123 456 789 333 555 777 以上のようなテキストファイルといたします。このファイルを 以下の様に100分の1にして出力したい。 1.23 4.56 7.89 3.33 5.55 7.77 と言うことで、この場で教えていただきました。それが、以下です。 #!/usr/bin/perl open(IN, "data.txt") or die ; @x = <IN>; close (IN); foreach $line (@x){ chomp($line); @elms = split(' ',$line); foreach $data (@elms){ print $data/100," "; } print "\n"; } おかげ様でこれはこれで上手く動きました。そこで、出力値をファイルに 書き込みたいのです。 もちろん、以下の様な方法でファイルに 書き込めるのは判っております。 計算プログラム.pl > outfile.txt しかし、上のプログラムをベースにファイルに書き込めないかと色々と 試してはみましたが、どうも上手く行きません。 どなたか教えて頂けないでしょうか? 宜しくお願い申し上げます。

    • ベストアンサー
    • Perl
  • ハッシュのリファレンスを用いた処理

    ActivePerl 5.8 , WinXP SP2の環境です。 Perl スクリプトを用い、ファイルから複数のブロックからなる情報をよみとり、個別のハッシュを作り、それをリファレンスの配列としてまとめて後から参照するという操作をしたいのですが、詰まってしまいました。。 例として読み取るファイルは ---input.txt--------- >1 Jan 1 Feb 4 >2 Mar 9 Apr 3 >3 Oct 8 Nov 4 ------------------ ここから1,2,3の個別のハッシュ {Jan => 1 Feb => 4} {Mar=> 9 Apr =>3} {Oct =>8 Nov =>4} を作成し、それぞれのハッシュのリファレンスの配列をつくり、その後からすべてのハッシュの中身を個別に出力させたいと思いました。 次のようなスクリプトを作成したのですが思ったように作動しません。 use strict; open (IN, "input.txt") or die ("cant open file \n"); my $reff; my @array_of_reff; my %hash; my $count = 0; while(<IN>){ my $line = $_; ######ここでは各ブロックの頭の ">"を認識し、2個目以降であれば直前までで作ったハッシュのリファレンス($reff)を配列@array_of_reffに入れる。 if($line =~ /^>/){ if($count >0){ $reff = \%hash ; push (@array_of_reff, $reff); %hash = (); } $count++; } ########ここではアルファベットが入った行を認識して、ハッシュに追加しています if($line =~ /^[A-Za-z]/){           $line =~ /([A-Za-z]+)\s+/; my $month = $1; $line =~ /\s+(\d+)/; my $day= $1; $hash{$month} = $day;     } ###ここはファイルの最後になったら直前まで作っていたハッシュののリファレンス($reff)を配列@array_of_reffに入れる。 if( eof ){ $reff = \%hash ; push (@array_of_reff, $reff); } } #####ハッシュのリファレンスの配列(@array_of_reff)からもとのハッシュを参照し、ハッシュごとに出力 foreach my $reff_of_hash (@array_of_reff){    print "output";    while( (my $key,my $value) = each %$reff_of_hash ){     print "\n" , $key, " : ", $value, ;    } } このスクリプトを実行すると Nov 4 Oct 8 という3つめのハッシュのなかみが3回出力されてしまいます。自分では3つの別のハッシュをつくっているつもりでも、どうやら1種類しか作れていない、もしくはハッシュが上書きされているようなのですが、原因がわかりません。 この例だけ見るとハッシュのリファレンスを使う必要はないのですが、実際にはもうすこし大きいスクリプトで"ハッシュのリファレンスの配列を他のサブルーチンに渡す"ということを想定しており、これが解決できず先に進めない状態です。 アドバイス、解決法がわかったら教えていただけないでしょうか。

    • ベストアンサー
    • Perl
  • ファイルから複数行のトークンを文字列検索。

    input.txt から "," で区切られた文字列をトークンで分け、 左がパターン、右が検索する文字列になります。 一行の場合は while((line = brInput.readLine())!= null ) { StringTokenizer st = new StringTokenizer(line, ","); if(st.hasMoreTokens()){ pattern = st.nextToken(); text = st.nextToken(); } これでマッチするだけなのですが、複数行の場合はどうでしょうか?

    • ベストアンサー
    • Java
  • 文字列比較

    文字列比較演算子で~の文字列の中に~が含まれていれば真を返すという下記のようなサンプルを作ったのですが、「ソ」「タ」「ゼ」「ー」の4文字だけ比較することができませんでした。エラーは 「ソ」 Unrecognized character \x94 at untitled2.pl line 5. 「タ」 エラーなし。ただし比較せず。 「ゼ」 Unmatched [ in regex; marked by <-- HERE in m/ゼ <-- HERE / at untitled2.pl line 4. 「ー」 Unmatched [ in regex; marked by <-- HERE in m/ー <-- HERE / at untitled2.pl line 4. と表示されましたのですが、これは上記の4文字に関しては部分比較することができないのでしょうか? それとも別の方法があるのでしょうか?どなたかご指導のよろしくお願いします。 環境はWindowsXP、ActivePerl、Httpdです。 ************************ $words1 = "アイウカキクスセソタチツゼー" ; $compare = "タ" ; if( $words1 =~ /$compare/ ){ print "比較対象文字が含まれています。\n" ; } else{ print "比較対象文字は存在しません。\n" ; }

    • ベストアンサー
    • Perl
  • perl 配列名変数指定するには

    perlプログラムで for文で ループ分の配列定義するには どうしたらよいですか? 下記のようなことができないかと 考えております。 for(my $i = 0; $i < $file_no; $i++){ my @{"segments$i"} =(); #配列定義 my ${"line$i"}="";     #変数定義 my %{"hash$i"}= ();    #ハッシュ定義 open(ARG1,$ARGV[$i]); while(<ARG1>){ ${'line'.$i} = $_; chomp ${'line'.$i}; @{'segments'.$i} = split(/\t/,${'line'.$i});        ${'hash'.$i}{${'segments'.$i}[0]}=${'segments'.$i}[1];     } close(ARG1); } #下記で、その後 各ハッシュに設定したデータをもとに いろいろ計算したい foreach my $a (keys %{'hash'.$i}){ ・・・ } 今は、Can't declare array dereference in "my" at test.pl line XX, near "} =" と 配列定義でエラーとなり処理できません。

    • ベストアンサー
    • Perl
  • 2番目の最大値を求める

    n個の要素をもった配列で、2番目に大きい要素を見つけるコードを書きたいのですが、合っているのか不安になって、質問させてもらいます。 アルゴリズムとしては、まず、n-1回の比較をしてその中でmaxを見つけ、残りのn-1個の要素のなかでn-2回の比較をしてそのn-1個の配列のmaxを見つければ、2番目に大きい要素を見つけられると考えました。 int main(void) { int E[n]; int i, j, temp; for(i=0;i<N;i++){ for(j=1;j<N-i;j++){ if(E[j-1]>E[j]){ temp=E[j-1]; E[j-1]=E[j]; E[j]=temp; } } } return E[j]; } これであっていますでしょうか? よろしくお願いいたします。

  • ランダム表示文字について

    if ( open( IN,"hoge.txt" ) ) {   @line = <IN>;   close( IN ); } else {   exit; } $random1 = @line[rand(@line)]; $random2 = @line[rand(@line)]; $randam3 = @line[rand(@line)]; テキストファイルから1行文字をランダムに表示するプログラムを書き実行できたのですが、このままだとrandom1,2,3の変数に同じものが入ってしまう可能性があります。 これで全て違うものが入るようなプログラムを書きたいのですが、そのようなことは可能でしょうか?

    • ベストアンサー
    • CGI