1

Тема: AHK: Перебор в обратном порядке

Есть ли способ перебора элементов в обратном порядке, чтобы они перебирались не с начала, а с конца — сначала последний, потом предпоследний и т.д., до первого?

2

Re: AHK: Перебор в обратном порядке

Если имеете в виду массив [], то циклом Loop, начинаете с последнего ключа (MaxIndex), далее вычитаете по одному.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: DD, 2018-06-07 04:22:24)

Re: AHK: Перебор в обратном порядке

Там следующая конструкция (часть кода, скачивающего комментарии с Ютуба):


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
}

Как быть в этом случае?

4

Re: AHK: Перебор в обратном порядке

loop
   msgbox % a := A_Index a

5

Re: AHK: Перебор в обратном порядке

К сожалению, намёк не понял)). Применительно к While как это можно записать?

6

Re: AHK: Перебор в обратном порядке

А разница какая между while или loop?

while A_Index != 10
   a := "`n" A_Index a
msgbox % a

7

Re: AHK: Перебор в обратном порядке

Имелся в виду 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))

8

Re: AHK: Перебор в обратном порядке

Приведите простой пример исходного текста, вашей регулярки и то, что вы хотите получить в итоге.

9

Re: AHK: Перебор в обратном порядке

Так, вроде:

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

Мне надо начать перебор с конца списка.

10

Re: AHK: Перебор в обратном порядке

А зачем?Если вы хотите получить обратный порядок совпадений, то, как я уже писал:

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 и потом перебирайте его.

11

Re: AHK: Перебор в обратном порядке

Malcev пишет:

А зачем?

По умолчанию вложенные комментарии в выдаче API Ютуба располагаются от старых — к новым, и поэтому их надо обратить. То есть, под-ответы к основному комментарию приходят в обратном порядке.
С InsertAt и массивом что-то не заладилось, мне бы пример)). Правильно ли понимаю, что перебирать для этой цели придётся дважды и сходу перебирать с конца не получится?

12 (изменено: Malcev, 2018-06-08 04:07:41)

Re: AHK: Перебор в обратном порядке

То есть у вас такая структура:

kommentarij1
	2
	1
kommentarij2
	3
	2
	1

А вы хотите получить такую?

kommentarij1
	1
	2
kommentarij2
	1
	2
	3

13

Re: AHK: Перебор в обратном порядке

Да.

14

Re: AHK: Перебор в обратном порядке

Так а в чём проблема?
Чем вас не устраивает вариант из 10 поста?

15

Re: AHK: Перебор в обратном порядке

В 10 посте код выводит весь список, а мне нужен его перебор, для возможности обработки каждого комментария.

16

Re: AHK: Перебор в обратном порядке

Я имел в виду так:

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
+ DD

17

Re: AHK: Перебор в обратном порядке

Или так:

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" )
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder
+ DD