停止 Rexx Do 循环退出
Stop Rexx Do Loop from Exiting
由于某种原因,我的 Rexx 循环中断了,我不知道为什么。我正在尝试通过 ICCID(SIM 卡的标识号)搜索 phone 号码数据库并提取 phone 号码。这是我的循环,稍微简化了一点:
(t) is the tab hex code, ICCIDlist.txt contains a list of ICCIDs I'm trying to gather info on
and phonenumberinfo.txt an exhaustive list of ICCIDs and Phone Numbers, looking something like this:
89298374987 409-392-2434
89298765345 409-365-2132
89298334745 409-967-2863
----------------------------------------------
streamICCID=.stream~new('iccidList.txt')
lni = streamICCID~lines
DO i = 1 to lni
ICCID.i = streamICCID~linein(i)
END
soFile=.stream~new('phonenumberinfo.txt')
lno = soFile~lines
DO line = 1 to lno
lnInfo = soFile~linein(line)
lnFind = POS(ICCID.i,lnInfo)
IF lnFind==1 THEN DO
PARSE VAR lnInfo ICCID (t) ownNum.i
i = i + 1; ITERATE
END
ELSE ITERATE
END
DO n = 1 to i
SAY ownNum.n
END
它适用于第一个,但一旦它从第一个 ICCID 中提取 phone 号码,它就会中断。我需要它继续,直到完成所有 ICCID。谁能帮帮我?
你说得对,这只在搜索一个 ICCID 时有效——最后一个。正如 NicC 所说,如果在 do line = ...
循环之前放置一个 Trace Intermediate
(或只是 Trace I
)指令,您可能会明白这一点。这样做会告诉您,您正在进入该循环,i
设置为您读取的最后一个 ICCID 的编号,并且您正在从那里开始计数 (i=i+1; ITERATE
)。
在其他语言中,这种搜索问题通常用两个嵌套循环来解决。加载第一个数据集后,迭代第二个数据集,对于每条记录,迭代整个第一个数据集,检查匹配项。你没有这样做,你是 hand-writing 内部循环,并且你正在将其索引变量 (i
) 用于两个不同且相互冲突的目的(遍历第一个数据集并创建输出数据集)。
在 Rexx 中,我们不会那样做(尽管我们可以)。我们将通过将第一个数据集加载到关联数组中,然后在迭代第二个数据集时直接访问它来解决这个问题。将 N-squared 阶算法转换为 N 阶算法,大获全胜。
/* Load the ICCIDs into the "ICCID.*" associative array. The value of
each element we load is TRUE, and the value of anything else is FALSE.
*/
ICCIDlist. = 0 /* Set all the elements to FALSE */
streamICCID=.stream~new('iccidList.txt')
DO i = 1 to streamICCID~lines
item = streamICCID~linein(i)
ICCIDlist.item = 1 /* Set this element to TRUE */
END
/* Search the phone number file for ICCIDs we loaded above and record their presence. */
soFile=.stream~new('phonenumberinfo.txt')
lno = 0
DO line = 1 to soFile~lines
lnInfo = soFile~linein(line)
PARSE VAR lnInfo ICCID (t) phoneNumber
IF ICCIDlist.ICCID THEN DO /* If the ICCIDlist element is TRUE, it was in the first dataset */
lno = lno + 1
ownNum.lno = phoneNumber
END
END
/* Write out the phone numbers for the ICCIDs that we found in both datasets. */
DO n = 1 to lno
SAY ownNum.n
END
由于某种原因,我的 Rexx 循环中断了,我不知道为什么。我正在尝试通过 ICCID(SIM 卡的标识号)搜索 phone 号码数据库并提取 phone 号码。这是我的循环,稍微简化了一点:
(t) is the tab hex code, ICCIDlist.txt contains a list of ICCIDs I'm trying to gather info on
and phonenumberinfo.txt an exhaustive list of ICCIDs and Phone Numbers, looking something like this:
89298374987 409-392-2434
89298765345 409-365-2132
89298334745 409-967-2863
----------------------------------------------
streamICCID=.stream~new('iccidList.txt')
lni = streamICCID~lines
DO i = 1 to lni
ICCID.i = streamICCID~linein(i)
END
soFile=.stream~new('phonenumberinfo.txt')
lno = soFile~lines
DO line = 1 to lno
lnInfo = soFile~linein(line)
lnFind = POS(ICCID.i,lnInfo)
IF lnFind==1 THEN DO
PARSE VAR lnInfo ICCID (t) ownNum.i
i = i + 1; ITERATE
END
ELSE ITERATE
END
DO n = 1 to i
SAY ownNum.n
END
它适用于第一个,但一旦它从第一个 ICCID 中提取 phone 号码,它就会中断。我需要它继续,直到完成所有 ICCID。谁能帮帮我?
你说得对,这只在搜索一个 ICCID 时有效——最后一个。正如 NicC 所说,如果在 do line = ...
循环之前放置一个 Trace Intermediate
(或只是 Trace I
)指令,您可能会明白这一点。这样做会告诉您,您正在进入该循环,i
设置为您读取的最后一个 ICCID 的编号,并且您正在从那里开始计数 (i=i+1; ITERATE
)。
在其他语言中,这种搜索问题通常用两个嵌套循环来解决。加载第一个数据集后,迭代第二个数据集,对于每条记录,迭代整个第一个数据集,检查匹配项。你没有这样做,你是 hand-writing 内部循环,并且你正在将其索引变量 (i
) 用于两个不同且相互冲突的目的(遍历第一个数据集并创建输出数据集)。
在 Rexx 中,我们不会那样做(尽管我们可以)。我们将通过将第一个数据集加载到关联数组中,然后在迭代第二个数据集时直接访问它来解决这个问题。将 N-squared 阶算法转换为 N 阶算法,大获全胜。
/* Load the ICCIDs into the "ICCID.*" associative array. The value of
each element we load is TRUE, and the value of anything else is FALSE.
*/
ICCIDlist. = 0 /* Set all the elements to FALSE */
streamICCID=.stream~new('iccidList.txt')
DO i = 1 to streamICCID~lines
item = streamICCID~linein(i)
ICCIDlist.item = 1 /* Set this element to TRUE */
END
/* Search the phone number file for ICCIDs we loaded above and record their presence. */
soFile=.stream~new('phonenumberinfo.txt')
lno = 0
DO line = 1 to soFile~lines
lnInfo = soFile~linein(line)
PARSE VAR lnInfo ICCID (t) phoneNumber
IF ICCIDlist.ICCID THEN DO /* If the ICCIDlist element is TRUE, it was in the first dataset */
lno = lno + 1
ownNum.lno = phoneNumber
END
END
/* Write out the phone numbers for the ICCIDs that we found in both datasets. */
DO n = 1 to lno
SAY ownNum.n
END