初心者のFileMaker pro Q&A (旧掲示板)

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2017-11-23 12:34:43

salon_hiyake
Member

再帰を使ったLet関数(音引きの置換)

再帰を使ったLet関数

自分なりに再帰を使ったLet関数にチャレンジしようとして、つまづいています。


目的としては、
【例】
「カーネーションパーティー」 → 「カアネエションパアティイ」
のように、「音引きを直前の文字の母音で置き換える」というものです。

以下、自分の書いたソースですが、「カーネーションパーティイ」のように最後の音引きのみ置換されてしまいます。
(おそらく、ループの最後の周の結果だけが取得されている)
何がいけないのでしょうか?


Let([
   $txt="カーネーションパーティー";
   $i=0;
   $res="";
   $Onbiki = "ー" ;
   $fnc="Case($i= PatternCount ( $txt ; $Onbiki) ;  $res ;      /*終了条件:iが音引きの個数になったら*/
      Let([
         $i=$i+1;

         $OnbikiPos = Position ( $txt ; $Onbiki ; 1 ; $i ) ;  /*音引きの位置(i回目)*/
         $PreChar = Middle ( $txt; $OnbikiPos-1 ; 1 )  ;      /*音引きの直前の一文字*/

          $ReplChar =                                         /*音引きと置換する文字*/
          Case ( 
          PatternCount ( \"あぁかがさざただなはぱばまやゃらわアァカガサザタダナハパバマヤャラワ\" ; $PreChar ) ; \"ア\" ; 
          PatternCount ( \"いぃきぎしじちぢにひぴびみりイィキギシジチヂニヒピビミリ\" ; $PreChar ) ; \"イ\" ; 
          PatternCount ( \"うぅくぐすずつっづぬふぷぶむゆゅるウゥクグスズツッヅヌフプブムユュル\" ; $PreChar ) ; \"ウ\" ; 
          PatternCount ( \"えぇけげせぜてでねへぺべめれエェォケゲセゼテデネヘペベメレ\" ; $PreChar ) ; \"エ\" ; 
          PatternCount ( \"おぉこごそぞとどのほぽぼもよょろオォコゴソゾトドノホポボモヨョロ\" ; $PreChar ) ; \"オ\" ; 
          \"■\");

          $res = Replace ( $txt ; $OnbikiPos ; 1 ; $ReplChar )

      ]; Evaluate($fnc))
   )"
];
   Evaluate($fnc)
)

また、Let関数の場合、スクリプトと違って、処理の途中で変数の中身を確認したりできませんが、みなさんどうやってデバッグしているのでしょうか?

どなたかアドバイスをお願いします。

Offline

#2 2017-11-23 15:58:55

mic
Member

Re: 再帰を使ったLet関数(音引きの置換)

最初から最後まで置換前のテキストが$txtになっているのが原因では?
$txt="カーネーションパーティー";
これを
$res="カーネーションパーティー";
にして、式中の$txtを全て$resに変更すれば動きそうな。

Offline

#3 2017-11-23 16:45:35

salon_hiyake
Member

Re: 再帰を使ったLet関数(音引きの置換)

micさん、ありがとうございます。やってみました。
下記のソースを計算フィールドに入れてみて、結果は「カアネーションパアティー」2番目と4番目だけ置換されないという動作がわかりません。
うーん、困りました。

Let([
   $res="カーネーションパーティー";
   $i=0;
   $Onbiki = "ー" ;
   $fnc="Case($i= PatternCount ( $res ; $Onbiki) ;  $res ;      /*終了条件:iが音引きの個数になったら*/
      Let([
         $i=$i+1;

         $OnbikiPos = Position ( $res ; $Onbiki ; 1 ; $i ) ;  /*音引きの位置(i回目)*/
         $PreChar = Middle ( $res; $OnbikiPos-1 ; 1 )  ;      /*音引きの直前の一文字*/

          $ReplChar =                                         /*音引きと置換する文字*/
          Case ( 
          PatternCount ( \"あぁかがさざただなはぱばまやゃらわアァカガサザタダナハパバマヤャラワ\" ; $PreChar ) ; \"ア\" ; 
          PatternCount ( \"いぃきぎしじちぢにひぴびみりイィキギシジチヂニヒピビミリ\" ; $PreChar ) ; \"イ\" ; 
          PatternCount ( \"うぅくぐすずつっづぬふぷぶむゆゅるウゥクグスズツッヅヌフプブムユュル\" ; $PreChar ) ; \"ウ\" ; 
          PatternCount ( \"えぇけげせぜてでねへぺべめれエェォケゲセゼテデネヘペベメレ\" ; $PreChar ) ; \"エ\" ; 
          PatternCount ( \"おぉこごそぞとどのほぽぼもよょろオォコゴソゾトドノホポボモヨョロ\" ; $PreChar ) ; \"オ\" ; 
          \"■\");

          $res = Replace ( $res ; $OnbikiPos ; 1 ; $ReplChar )

      ]; Evaluate($fnc))
   )"
];
   Evaluate($fnc)
)

Offline

#4 2017-11-23 16:59:21

Shin
Member

Re: 再帰を使ったLet関数(音引きの置換)

それに追加で、
         $OnbikiPos = Position ( $txt ; $Onbiki ; 1 ; $i ) ;  /*音引きの位置(i回目)*/

         $OnbikiPos = Position ( $txt ; $Onbiki ; 1 ; 1 ) ;
にするか、$i を減らしていくか、にしましょう。

Offline

#5 2017-11-23 18:09:08

salon_hiyake
Member

Re: 再帰を使ったLet関数(音引きの置換)

Shinさん、ありがとうございます。できました!
iを減らしていき、0になったら終了、に変更しました。

Let([
   $res="カーネーションパーティー";
   $Onbiki = "ー" ;
   $i=PatternCount ( $res ; $Onbiki);      /*音引きの個数*/
   $fnc="Case($i= 0 ;  $res ;              /*終了条件:iが0になったら*/
      Let([
         $i=$i-1;

         $OnbikiPos = Position ( $res ; $Onbiki ; 1 ; 1 ) ;  /*音引きの位置(常に1個目)*/
         $PreChar = Middle ( $res; $OnbikiPos-1 ; 1 )  ;     /*音引きの直前の一文字*/

          $ReplChar =                                        /*音引きと置換する文字*/
          Case ( 
          PatternCount ( \"あぁかがさざただなはぱばまやゃらわアァカガサザタダナハパバマヤャラワ\" ; $PreChar ) ; \"ア\" ; 
          PatternCount ( \"いぃきぎしじちぢにひぴびみりイィキギシジチヂニヒピビミリ\" ; $PreChar ) ; \"イ\" ; 
          PatternCount ( \"うぅくぐすずつっづぬふぷぶむゆゅるウゥクグスズツッヅヌフプブムユュル\" ; $PreChar ) ; \"ウ\" ; 
          PatternCount ( \"えぇけげせぜてでねへぺべめれエェケゲセゼテデネヘペベメレ\" ; $PreChar ) ; \"エ\" ; 
          PatternCount ( \"おぉこごそぞとどのほぽぼもよょろオォコゴソゾトドノホポボモヨョロ\" ; $PreChar ) ; \"オ\" ; 
          \"■\");

          $res = Replace ( $res ; $OnbikiPos ; 1 ; $ReplChar )

      ]; Evaluate($fnc))
   )"
];
   Evaluate($fnc)
)

Offline

Registered users online in this topic: 0, guests: 1
[Bot] ClaudeBot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.004 seconds, 7 queries executed - Memory usage: 525.56 KiB (Peak: 530.1 KiB) ]