- Offizieller Beitrag
Wenn man eine Zeit lang in anderen Sprachen programmiert und wieder mit AutoIt skriptet, fällt einem auf, wie nützlich z.B. Iteratoren sind. Leider läßt die AutoIt-Syntax das Definieren von Iteratoren als Parameter nicht direkt zu. Ich habe hier mal Anleihe bei der Programmiersprache nim genommen (oops, das Wortspiel war ungewollt) und dortige Sequence templates (eine Art Makros) für 1D-Array in AutoIt adaptiert.
Es werden Bedingungen/Operationen an das Array übergeben mit denen über alle Elemente iteriert wird. In den Bedingungen wird "it" als Platzhalter für die Werte, über die iteriert wird, verwendet - s. Bsp.
;-- TIME_STAMP 2020-03-23 00:00:36
Opt('MustDeclareVars', 1)
#include 'ArrayIter.au3'
#cs
========================================================================================== FUNCTIONS
_ArrayFilterIt
Iteriert über das Array und erstellt ein Ergebnisarray mit den gültigen Werten der Bedingung
_ArrayKeepItIf
Iteriert über das Array und behält nur die gültigen Werte der Bedingung
_ArrayAllIt
Prüft ob für alle Einträge des Arrays die Bedingung zutrifft
_ArrayAnyIt
Prüft ob für mindestens einen Eintrag des Arrays die Bedingung zutrifft
_ArrayMapIt
Iteriert über das Array und erstellt ein Ergebnisarray mit den Ergebnissen der Operation
_ArrayApplyIt
Iteriert über das Array und führt die Operation für jedes Element des Arrays aus
========================================================================================= /FUNCTIONS
#ce
Local $aN[] = [10,12,13,15,16,17,19,22,30,40]
; Rückgabe Array mit allen Treffern (zw. 10 und 20)
Local $aRes = _ArrayFilterIt($aN, '&it > 10 and &it < 20')
_ArrayWrite($aRes, '[_ArrayFilterIt] Ergebnisarray: alle Zahlen zw. 10 und 20')
; Ersetzt das Ausgangsarray mit den Treffern (gerade Zahlen)
_ArrayKeepItIf($aN, 'Mod(&it, 2) = 0')
_ArrayWrite($aN, '[_ArrayKeepItIf] alle geraden Zahlen')
; Prüft ob alle Einträge die Bedingung erfüllen (gerade Zahlen? true/false)
ConsoleWrite('[_ArrayAllIt] alles gerade? ' & _ArrayAllIt($aN, 'Mod(&it, 2) = 0') & @LF & @LF)
; Prüft ob ein Eintrag die Bedingung erfüllt (ungerade Zahlen? true/false)
ConsoleWrite('[_ArrayAnyIt] min. 1-mal ungerade? ' & _ArrayAnyIt($aN, 'Mod(&it, 2)') & @LF & @LF)
; Ergebnisarray mit Item die der Bedingung entsprechen
Local $aS[] = ["foo", "bar", "baz", "foobar"]
$aRes = _ArrayFilterIt($aS, 'StringLen("&it") = 3 and StringMid("&it", 1, 1) = "b"')
_ArrayWrite($aRes, '[_ArrayFilterIt] Länge=3, beginnt mit "b"')
; alternativ mit Übergabe einer Funktion
_ArrayKeepItIf($aS, '_yield("&it")')
_ArrayWrite($aS, '[_ArrayKeepItIf - yield] Länge=3, beginnt mit "b"')
Func _yield($_p)
Return (StringLen($_p) = 3 And StringMid($_p, 1, 1) = 'b')
EndFunc
; Operation mit jedem Item - neues Array
Local $aH[] = ["p", "a", "b"]
$aRes = _ArrayMapIt($aH, '"</" & "&it" & ">"')
_ArrayWrite($aRes, '[_ArrayMapIt] Tag-Einfassung')
; Operation mit jedem Item - im Array selbst
Local $aI[] = [10,20,30,40]
_ArrayApplyIt($aI, '&it / 5')
_ArrayWrite($aI, '[_ArrayApplyIt] Division')
Func _ArrayWrite(ByRef $_a, $_sTitle='')
Local $s = $_sTitle <> '' ? $_sTitle & @LF : ''
For $i = 0 To UBound($_a) -1
$s &= $_a[$i] & ' '
Next
ConsoleWrite($s & @LF & @LF)
EndFunc
Alles anzeigen
EDIT 23.03.2020:
Wie korrekt angemerkt wurde, gehört Opt('MustDeclareVars', 1) nicht in eine UDF. Passiert bei mir automatisch beim Speichern. Habe das nun korrigiert, ebenso ein paar Schreibfehler in den Funktionsbeschreibungen.