Тема: AHK: Перебор в обратном порядке
Есть ли способ перебора элементов в обратном порядке, чтобы они перебирались не с начала, а с конца — сначала последний, потом предпоследний и т.д., до первого?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Есть ли способ перебора элементов в обратном порядке, чтобы они перебирались не с начала, а с конца — сначала последний, потом предпоследний и т.д., до первого?
Если имеете в виду массив [], то циклом Loop, начинаете с последнего ключа (MaxIndex), далее вычитаете по одному.
Там следующая конструкция (часть кода, скачивающего комментарии с Ютуба):
match := "", Pos := 1
While Pos := RegExMatch(cmt_pages, "s)""id"": ""(.+?)"",\R.+?""authorDisplayName"": ""(.+?)"",\R.+?""authorProfileImageUrl"": ""(.+?)"",\R.+?""authorChannelUrl"": ""(.+?)"",\R.+?""textOriginal"": ""(.+?)"",\R.+?""likeCount"": (\d+),\R.+?""publishedAt"": ""(.+?)"",\R.+?""totalReplyCount"": (\d+),\R",match,Pos+StrLen(match))
{
y_cmts := match2 "`n" match3 "`n" match4 "`n" match5 "`n" match6 "`n" match7 "`n" match8
If (match8 > 0)
{
sleep, 400
ResponseText =
parentId := match1
Api_Url_parentId = %apis_cmtParent%%parentId%&key=%key%%other_parentId%
HTTP.Open("GET", Api_Url_parentId, true)
; HTTP.SetRequestHeader("Cookie", "remixlang=0") ; имена на русском
HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
ResponseText := HTTP.ResponseText
matchh := "", Poss := 1
While Poss := RegExmatch(ResponseText, "s)""id"": ""(.+?)"",\R.+?""authorDisplayName"": ""(.+?)"",\R.+?""authorProfileImageUrl"": ""(.+?)"",\R.+?""authorChannelUrl"": ""(.+?)"",\R.+?""textOriginal"": ""(.+?)"",\R.+?""likeCount"": (\d+),\R.+?""publishedAt"": ""(.+?)"",\R",matchh,Poss+StrLen(matchh))
{
y_sub_cmts .= "`n<UL>`n" matchh2 "`n" matchh3 "`n" matchh4 "`n" matchh5 "`n" matchh6 "`n" matchh7 "`n" matchh8 "`n<UL>`n"
}
GoSub, RedTransDelim
}
Else
GoSub, RedTransDelim
}
Как быть в этом случае?
loop
msgbox % a := A_Index a
К сожалению, намёк не понял)). Применительно к While как это можно записать?
А разница какая между while или loop?
while A_Index != 10
a := "`n" A_Index a
msgbox % a
Имелся в виду while в таком формате, где не понятно, где указывать «!=»:
match := "", Pos := 1
While Pos := RegExMatch(cmt_pages, "s)""id"": ""(.+?)"",\R.+?""authorDisplayName"": ""(.+?)"",\R.+?""authorProfileImageUrl"": ""(.+?)"",\R.+?""authorChannelUrl"": ""(.+?)"",\R.+?""textOriginal"": ""(.+?)"",\R.+?""likeCount"": (\d+),\R.+?""publishedAt"": ""(.+?)"",\R.+?""totalReplyCount"": (\d+),\R",match,Pos+StrLen(match))
Приведите простой пример исходного текста, вашей регулярки и то, что вы хотите получить в итоге.
Так, вроде:
cmt_pages=
(
"id": "1",
"id": "2",
"id": "3",
"id": "4",
"id": "5",
"id": "6",
)
match := "", Pos := 1
While Pos := RegExMatch(cmt_pages, "s)""id"": ""(.+?)"",",match,Pos+StrLen(match))
MsgBox % match1
Мне надо начать перебор с конца списка.
А зачем?Если вы хотите получить обратный порядок совпадений, то, как я уже писал:
cmt_pages=
(
"id": "1",
"id": "2",
"id": "3",
"id": "4",
"id": "5",
"id": "6",
)
match := "", Pos := 1
While Pos := RegExMatch(cmt_pages, "s)""id"": ""(.+?)"",",match,Pos+StrLen(match))
a := match1 a
msgbox % a
Если же вам необходимо именно перебирать в обратном порядке, то записывайте совпадения в массив с помощью InsertAt и потом перебирайте его.
А зачем?
По умолчанию вложенные комментарии в выдаче API Ютуба располагаются от старых — к новым, и поэтому их надо обратить. То есть, под-ответы к основному комментарию приходят в обратном порядке.
С InsertAt и массивом что-то не заладилось, мне бы пример)). Правильно ли понимаю, что перебирать для этой цели придётся дважды и сходу перебирать с конца не получится?
То есть у вас такая структура:
kommentarij1
2
1
kommentarij2
3
2
1
А вы хотите получить такую?
kommentarij1
1
2
kommentarij2
1
2
3
Да.
Так а в чём проблема?
Чем вас не устраивает вариант из 10 поста?
В 10 посте код выводит весь список, а мне нужен его перебор, для возможности обработки каждого комментария.
Я имел в виду так:
cmt_pages=
(
"id": "1",
"id": "2",
"id": "3",
"id": "4",
"id": "5",
"id": "6",
)
match := "", Pos := 1
While Pos := RegExMatch(cmt_pages, "s)(.+?)(\R|$)",match,Pos+StrLen(match))
a := "`n" match1 a
match := "", Pos := 1
While Pos := RegExMatch(a, "s)""id"": ""(.+?)"",",match,Pos+StrLen(match))
MsgBox % match1
Или так:
cmt_pages=
(
"id": "1",
"id": "2",
"id": "3",
"id": "4",
"id": "5",
"id": "6",
)
arr := StrSplit(cmt_pages, "`n", "`r")
max := arr.MaxIndex()
Loop % max
MsgBox, % RegExReplace( arr[ max - A_Index + 1 ], """id"":\s""([^""]+).*", "$1" )
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться