• ベストアンサー

Perl の 質問です

Perlで質問です。 1 while $all_total = ~ s/(.*\\d)(\\d\\d\\d)/$1,$2/g; という文があるのですが、説明を見るとカンマを3桁ごとに入れるとなっておりました。なぜか一番最初の 1 が私にとって違和感があります。 どういういみなのでしょうか。

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

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

  • ベストアンサー
  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.1

とりあえず・・・タイトルにはまともなものをつけること. Perlのカテゴリなんだから,Perlの話なのは当たり前. つぎに・・・まともに処理できるソースコードをだすこと > 1 while $all_total = ~ s/(.*\\d)(\\d\\d\\d)/$1,$2/g; たった一行で二箇所(数え方によっては四箇所)も間違えてる・・・ 正規表現に不要なエスケープがあることから想像して もしかして,これは何かの「文字列」の中の一部? #もういっこ,本質的に同じ質問があるのは。。。なぜだろ? 本題・・・while構文には 実行の部分が必要なんだけども, 今回の場合は whileの条件節が「置換が成功したかどうか」ということで 同時に置換も行っているので 実行するものが存在しない. しかし,それでは構文的に困るので 何も実行しないというか,常に「成功する」1をつけることで これを「何もしない実行部分」としているということ {} while ($all_total =~ s/(.*\d)(\d\d\d)/$1,$2/g); こうしても動くけど,こういう場合は習慣的に 1 を 使うことが多いよう.moduleなんかもで 最後に 1 をつけて「成功」を返すようになっている.

abesouri
質問者

お礼

有難うございます。 投稿の際に指が痙攣して連続して2度ボタンを押してしまいました。 ですので同じ質問が2つ登録されました。(削除もできません。) それからなぜか\マークが自動的に多く付きました。 原因不明です。

abesouri
質問者

補足

有難うございます。 投稿の際に指が痙攣して連続して2度ボタンを押してしまいました。 ですので同じ質問が2つ登録されました。(削除もできません。) それからなぜか\マークが自動的に多く付きました。 原因不明です。

関連するQ&A

  • perlのfor文について

    perlなのですが、以下のfor文の書き方について教えてください。 for($var1,$var2,$var3,$var4){ s/^(?:Company|Organization|Office|Location)\s*:\s*// if( $_ ); s/"(?:[^"]|\")*"//g if( $_ ); 1 while s/\([^()]*\)//g if( $_ ); } これは、どのようなfor文なのでしょうか。 for文の最後に「1 while」とあるのですが、最後の行の1とは どういう意味で、ここでは何をしているのでしょうか。 また、if文が置換の処理より後ろにかかれていますが、実際は if文が先に動いているのでしょうか。 それと、「 1 while s/\([^()]*\)//g if( $_ );」が以下のようにエラー がでます。 「syntax error at x.pl line x, near "s/\([^()]*\)//g if"」 エラーを出さないようにするにはどうしたらよいでしょうか。

  • perlの正規表現をCで・・

    while($searchwords =~ /^(.).*/g) たとえばperlでこのような文があったとします。 Cでならwhile文おそらくperlでも同じと思いますが 条件が真の時にぐるぐる回ります。 この場合の条件が おそらく一文字目以降を切り取るということだと思います。 $searchwords =~ /^(.).*/gが成立している間?whileするということなのでしょうか? もし$searchwordsに12345678が入っているとすると 一文字ずつ横にずれていくと言うことでしょうか? perlで質問するべきだと思いましたが・・。 Cで書きたいのでどうしたらよいのかと質問しました。 $a =~ s/^(.)//; ならば 行の先頭文字を一個消してaに入れているということになるから char a[] = "123456789"; ならばa[9]になります。 だからa[0] = a[1]ってな感じで一個ずつずらせばいいんだと勝手に思っていますが while($searchwords =~ /^(.).*/g) の場合Cではどのように記述したら良いのでしょうか?あとこの式の意味もわかりやすく教えてください。 こんがらがってしまっている面が強いかもしれません。

  • 置換演算子についての疑問

    お世話になっております。horagaiです。質問160286 http://oshiete1.goo.ne.jp/kotaeru.php3?q=160286 と同じようなことをやりたかったので回答#2のやり方を 試してみました。そこでいろいろ疑問が出てきたので教えていただきたいと思います。 (1) $num=<> ; while($num =~ s/(.*\d)(\d\d\d)/$1,$2/g){;} print "num=$num\n"; とするとたしかにうまくいくのですが、これでうまくいく理由がわかりません。 置換演算子が後ろからパターンマッチをしていくのだとすればわかるのですが。 前からだとするとたとえば123456は最初に(1)(234)56で引っかかって1,23456 。 次に (1,2)(345)6 で引っかかって1,2,3456 ・・・。 などとなりそうな気がします。 (2) またwhileを使わずに $num =~ s/(.*\d)(\d\d\d)/$1,$2/g; としてみると 例えば入力が 12345678 とすると num=12345,678 と最初の3桁しか区切ってくれません。マニュアルを見ると 「gオプションは出現したパターンをすべて置換する。」 と書いてあるのにどうしてでしょう。 前からマッチするせよ後ろからマッチするにせよカンマが1つしか 入らないということはないと思うのですが。 以上、私が根本的な勘違いをしているかも知れませんので その辺のところもご指摘いただければ幸いです。 ちなみにOSはLinux.Perlのバージョンは5.004です。

    • ベストアンサー
    • Perl
  • 「1 while ...」ってなに?

    webの裏技というサイトからショッピングカートのサンプルスクリプトを 入手して解読しようとしたら、 1 while $goukei=~s/(.*\d)(\d\d\d)/$1,$2/g; というのがありました。 桁カンマを入れる処理らしく、 $goukei以下は正規表現で置き換えをしているのが なんとなくわかるのですが 1 whileの意味がよくわかりません。 なくてもいいと思うのですが・・・。 教えてください。

    • ベストアンサー
    • CGI
  • Perlの基礎中の基礎を教えてください。

    Perlのそれぞれの言語がありますが、 例えばif文はこう言うタメにあるよとか、rand関数はこういうサイトでよく使われるなど教えてください。 if文やwhile文、rand、などなど他にもありますが思いついたものを簡単な説明でも構いませんのでそれぞれのプログラムはどういう動き、なんのために使うのか、こういうサイトが使われているなど教えてください!よろしくお願いします。

    • ベストアンサー
    • Perl
  • perl超初心的な質問

    perl初心者です。 辞書ファイルを編集するのに必要外な文字が多く、手作業では限界がありperlを使おうと思います。 ちまちまと自分で打ったのですが、いざ実行するとうまくいきません。 右も左もわからず途方にくれてます。 下が編集したい文です。 行の最初の”を削り、読んだものに上書きしたいのです。 "さ来週 [さらいしゅう]","(n-adv,n-t) week after next","",0,0,0,"" "さ迷う [さまよう]","(v5u) to loiter/to putter/to prowl/to wander about/to roam about/to knock around","",0,0,0,"" "ざあざあ","(adv) sound of rushing water/sound of pouring rain/white noise sound/(P)","",0,0,0,"" そして下の文が打ったperlの内容です。 $inputfile="DicA.csv"; open(DIC,"$inputfile") or die "$!";   -----------画面に表示される while ($line1 = <DIC>){ $string =~ s/"//g; open(OUT,"> DicA.csv");    ----------上書きされ空のファイルができる $out1 = join(",",@array); print OUT; } close(DIC) お手数をおかけしてすみません。 困っています。 どうかよろしくお願いします。

    • ベストアンサー
    • Perl
  • Perlで、文字の出現回数を調べたいのですが、

    Perlで、文字の出現回数を調べたいのですが、 どうすればよいのかわかりません。 while(<>){ s/あ/あ/g; } これを利用して、数えられないかと思ったのですが、 これだと無理ですよね。 1行に何度も出てくる文字も、ちゃんとカウントしたいのですが、 どのようにすればよいのでしょうか。 ご教示、お願い致します。

  • perlで作った掲示板、エラーが出てしまう。

    課題でperlの掲示板を作成したのですが、動作せず困っています。間違いを教えてください。 #!C:/Perl/bin/perl require 'html_data.pl'; require 'cgi-lib.pl'; require 'jcode.pl' if($ENV{'REQUEST_METHOD'}eq"POST"){ &ReadParse(*answer); $name=$answer{'name'}; $mail=$answer{'mail'}; $title=$answer{'title'}; $text=$answer{'text'}; $name=~s/,/,/g; $name=~s/&/&/g; &name=~s/"/"/g; $name=~s/<</g; $name=~s/>/>/g; $mail=~s/,/,/g; $mail=~s/&/&/g; &mail=~s/"/"/g; $mail=~s/<</g; $mail=~s/>/>/g; $title=~s/,/,/g; $title=~s/&/&/g; &title=~s/"/"/g; $title=~s/<</g; $title=~s/>/>/g; $text=~s/,/,/g; $text=~s/&/&/g; &text=~s/"/"/g; $text=~s/<</g; $text=~s/>/>/g; $data="$name,$mail,$title,$text"; &jcode'convert(*data,'sjis'); if($name ne""&& $title ne""&& $text ne""){ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time()); $mon=$mon+1; @youbi=('日','月','火','水','木','金','土'); $time="$mon月$mday日$youbi[$wday]曜日$hour時$min分"; $all_data="$time,$data\n"; open(ANSWER,"<answer.dat"); @all=<ANSWER>; close(ANSWER); unshift(@all,$all_data); open(ANSWER,">answer.dat"); flock(ANSWER,2); print ANSWER @all; flock(ANSWER,8) close(ANSWER); } } &form; open(ANSWER,"<answer.dat"); @all=<ANSWER>; foreach(@all){ ($time,$name,$mail,$title,$text)=split(/,/,$_); &toukou; } close(ANSWER); &footer; exit;

    • ベストアンサー
    • Perl
  • このperlのおかしい所を教えて下さい

    下記のプログラムはname11という変数名の文字列の平仮名を指定の数字に変更し、1文字づつ変数に当てはめ、1桁になるまで分解して足していくというプログラムを書きたいのですが、エラーばかりです。 初心者なのでネットの情報を見ながらの作成です。 ご教示よろしくお願いします。 while(($name11)=each %in){ $name11=~s/"ぁ"/6/g; $name11=~s/"あ"/6/g; $name11=~s/"ぃ"/9/g; $name11=~s/"い"/9/g; $name11=~s/"ぅ"/1/g; $name11=~s/"う"/1/g; $name11=~s/"ぇ"/11/; $name11=~s/"え"/11/g; $name11=~s/"ぉ"/3/g; $name11=~s/"お"/3/g; $name11=~s/"か"/6/g; $name11=~s/"が"/6/g; $name11=~s/"き"/9/g; $name11=~s/"ぎ"/9/g; $name11=~s/"く"/1/g; $name11=~s/"ぐ"/1/g; $name11=~s/"け"/11/g; $name11=~s/"げ"/11/g; $name11=~s/"こ"/3/g; $name11=~s/"ご"/3/g; $name11=~s/"さ"/6/g; $name11=~s/"ざ"/6/g; $name11=~s/"し"/9/g; $name11=~s/"じ"/9/g; $name11=~s/"す"/1/g; $name11=~s/"ず"/1/g; $name11=~s/"せ"/11/g; $name11=~s/"ぜ"/11/g; $name11=~s/"そ"/3/g; $name11=~s/"ぞ"/3/g; $name11=~s/"た"/6/g; $name11=~s/"だ"/6/g; $name11=~s/"ち"/9/g; $name11=~s/"ぢ"/9/g; $name11=~s/"っ"/1/g; $name11=~s/"つ"/1/g; $name11=~s/"づ"/1/g; $name11=~s/"て"/11/g; $name11=~s/"で"/11/g; $name11=~s/"と"/3/g; $name11=~s/"ど"/3/g; $name11=~s/"な"/6/g; $name11=~s/"に"/9/g; $name11=~s/"ぬ"/1/g; $name11=~s/"ね"/11/; $name11=~s/"の"/3/g; $name11=~s/"は"/6/g; $name11=~s/"ば"/6/g; $name11=~s/"ぱ"/6/g; $name11=~s/"ひ"/9/g; $name11=~s/"び"/9/g; $name11=~s/"ぴ"/9/g; $name11=~s/"ふ"/1/g; $name11=~s/"ぶ"/1/g; $name11=~s/"ぷ"/1/g; $name11=~s/"へ"/11/g; $name11=~s/"べ"/11/g; $name11=~s/"ぺ"/11/g; $name11=~s/"ほ"/3/g; $name11=~s/"ぼ"/3/g; $name11=~s/"ぽ"/3/g; $name11=~s/"ま"/6/g; $name11=~s/"み"/9/g; $name11=~s/"む"/1/g; $name11=~s/"め"/11/g; $name11=~s/"も"/3/g; $name11=~s/"ゃ"/6/g; $name11=~s/"や"/6/g; $name11=~s/"ゅ"/1/g; $name11=~s/"ゆ"/1/g; $name11=~s/"ょ"/3/g; $name11=~s/"よ"/3/g; $name11=~s/"ら"/6/g; $name11=~s/"り"/9/g; $name11=~s/"る"/1/g; $name11=~s/"れ"/11/g; $name11=~s/"ろ"/3/g; $name11=~s/"ゎ"/6/g; $name11=~s/"わ"/6/g; $name11=~s/"ゐ"/9/g; $name11=~s/"ゑ"/11/g; $name11=~s/"を"/3/g; $name11=~s/"ん"/1/g; } substr($name11, 0, 1) = $a; substr($name11, 1, 2) = $b; substr($name11, 2, 3) = $c; substr($name11, 3, 4) = $d; substr($name11, 4, 5) = $e; substr($name11, 5, 6) = $f; substr($name11, 6, 7) = $g; substr($name11, 7, 8) = $h; substr($name11, 9, 10) = $i; $x = $a + $b + $c + $d + $e + $f + $g + $h + $i; while ($x > 10) { substr($x, 0, 1) = $a; substr($x, 1, 2) = $b; substr($x, 2, 3) = $c; substr($x, 3, 4) = $d; substr($x, 4, 5) = $e; substr($x, 5, 6) = $f; substr($x, 6, 7) = $g; substr($x, 7, 8) = $h; substr($x, 9, 10) = $i; $x = $a + $b + $c + $d + $e + $f + $g + $h + $i; }

  • 初心者が超初歩的な質問です

    perlで初歩的な質問です。 辞書ファイルで編集していたら必要以外な文字が多くて自力で削っていたら大変なので、perlでしてみました。 参考資料を見ながら一応打ったのですが、どうもうまくいきません。 実は、最初のファイル入出力のところです。 open(DIC,"> $inputfile"); 初期化されて空ファイルになる open(DIC,"< $inputfile"); とすると画面には表示されるが処理が進まない。 下が打った文です。 $inputfile="DicIn.csv"; open(DIC,"+> $inputfile") or die "$!"; while (<DIC>){ @array = <DIC>; @Array = (@Array1,@Array2); $a1 = ~ s/"//g; $a2 = ~ s|///|---|g; print(DIC); } close(DIC) 本当に初歩的ですみません 困ってます、よろしくお願いします

専門家に質問してみよう