2017-07-20 3 views
0

私のコードに間違いがあります。リストの最初の値を返しますが、最後の値を返します。マイコードコードの誤り、マクロ変数はリストの最初の値を返しますが、最後の値が返されます

%macro r(one, two); 
%local cnt num; 
%let cnt=0; 
%let num=0; 
%do %while(%scan(&one,%eval(&cnt+1),%str()) ne %str()); 
%let cnt = %eval(&cnt+1); 
%if %upcase(%scan(&one,&cnt,%str()))=%upcase(&two) %then 
%let num=&cnt; 
%end; 
&num 
%mend r; 

option mlogic symbolgen; 
%put b is at position %r(a b c b, b); 

出力は2でなければなりません。しかし、私は誰も私が私の間違いを見つけ出す助けることができます4として出力を取得しています。前もって感謝します。

+0

'while'ループは、一致するとすぐに終了する必要があります。現在はマッチングを続けているので、numの値は2と4の値を2回更新して終了します。 – alvits

答えて

1

一致が見つかると、whileループを終了する条件を追加する必要があります。さもなければそれはあなたが目指しているものではない、探し続ける。

%macro r(one, two); 
%local cnt num; 
%let cnt=0; 
%let num=0; 
%do %while(&num.=0 and (%scan(&one,%eval(&cnt+1),%str()) ne %str())); 
    %let cnt = %eval(&cnt+1); 
    %if %upcase(%scan(&one,&cnt,%str()))=%upcase(&two) %then 
    %let num=&cnt; 
%end; 
&num 
%mend r; 

option mlogic symbolgen; 
%put b is at position %r(a b c b, b); 
+0

助けてくれてありがとう! – Jals

関連する問題