Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
faust •->

Anmeldedatum: 25.02.2012 Beiträge: 15
|
Verfasst am: 25.02.2012 - 19:27 Titel: Variable in String |
|
|
Ich habe einen String, z.B.
set str to "3*a+4*a^2"
Ist es auf einfache Art möglich, der Variablen a einen Wert zuzuweisen und für diesen dann den Wert des Ausdrucks im String zu bestimmen? |
|
Nach oben |
|
 |
woodpecker •--->

Anmeldedatum: 12.10.2010 Beiträge: 150 Wohnort: Roggentin/Rostock
|
Verfasst am: 26.02.2012 - 19:25 Titel: |
|
|
Wenn du statt der Variablen a auch schreiben kannst $a, dann ist es ganz einfach, sonst etwas komplizierter.
Probiere mal so:
Code: | set expr to "3*$a+4*$a^2"
set value to "a=13;"
do shell script value & "bc -i <<.. | tail -1
" & expr |
|
|
Nach oben |
|
 |
Skeeve •---->


Anmeldedatum: 20.04.2006 Beiträge: 1068
|
Verfasst am: 26.02.2012 - 21:52 Titel: |
|
|
woodpecker hat Folgendes geschrieben: | Wenn du statt der Variablen a auch schreiben kannst $a, dann ist es ganz einfach, sonst etwas komplizierter. |
Aber nichts, was man in Code einsetzen sollte, der in Produktivsystemen verwendet wird.
Stell Dir nur mal vor, der böse Hacker gibt statt "a=13" ein "a=13;rm -rf;". _________________ "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies") |
|
Nach oben |
|
 |
woodpecker •--->

Anmeldedatum: 12.10.2010 Beiträge: 150 Wohnort: Roggentin/Rostock
|
Verfasst am: 27.02.2012 - 00:09 Titel: |
|
|
Skeeve hat Folgendes geschrieben: |
Aber nichts, was man in Code einsetzen sollte, der in Produktivsystemen verwendet wird.
Stell Dir nur mal vor, der böse Hacker gibt statt "a=13" ein "a=13;rm -rf;". |
Davon hat er nichts gesagt, dass die Daten eingegeben werden sollen, aber wenn es denn so sein soll, geht's natürlich z.B. auch so:
Code: | set expr to "3*$a+4*$a^2"
set value to "a=13;rm -rf;"
set cval to do shell script "expr " & quoted form of value & " : '\\(a=[0-9]*;\\)' || echo : "
if (count of value) is equal to (count of cval) then
do shell script value & "bc -i <<.. | tail -1
" & expr
else
display dialog "Eingabefehler: " & value
end if
|
Gruß woodpecker |
|
Nach oben |
|
 |
Skeeve •---->


Anmeldedatum: 20.04.2006 Beiträge: 1068
|
Verfasst am: 27.02.2012 - 05:47 Titel: |
|
|
[quote="woodpecker"] Skeeve hat Folgendes geschrieben: |
Davon hat er nichts gesagt, dass die Daten eingegeben werden sollen, aber wenn es denn so sein soll, geht's natürlich z.B. auch so:
|
War auch nur ein Sicherheitshinweis.
Man muß übrigens nicht auf die shell ausweichen und "$" davor setzen:
Code: |
set expr to "3*a+4*a^2"
set value to "13"
set run_expr to replace_all(expr, "a", value)
run script run_expr
to replace_all(str, old, new)
set oastid to AppleScript's text item delimiters
set AppleScript's text item delimiters to old
set splitted to text items of str
set AppleScript's text item delimiters to new
set str to splitted as string
set AppleScript's text item delimiters to oastid
return str
end replace_all
|
_________________ "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies") |
|
Nach oben |
|
 |
woodpecker •--->

Anmeldedatum: 12.10.2010 Beiträge: 150 Wohnort: Roggentin/Rostock
|
Verfasst am: 27.02.2012 - 10:32 Titel: |
|
|
Skeeve hat Folgendes geschrieben: |
Man muß übrigens nicht auf die shell ausweichen und "$" davor setzen:
|
Na super! Nach so was wie run script hatte ich auch zunächst gesucht. Ich wusste gar nicht, dass es das auch in Apple Script gibt. Das entspricht der interpret-Anweisung in REXX.
Aber dann ist Deine Lösung auch wieder einen Tick zu umständlich. Du musst den Wert der Variablen ja nicht vor Ausführung des Scripts ersetzen. Das kannst Du ja auch AppleScript überlassen:
Code: | set expr to "3*a+4*a^2"
set value to "3"
run script "set a to " & value & return & expr |
Gruß woodpecker |
|
Nach oben |
|
 |
Skeeve •---->


Anmeldedatum: 20.04.2006 Beiträge: 1068
|
Verfasst am: 27.02.2012 - 18:32 Titel: |
|
|
woodpecker hat Folgendes geschrieben: | Aber dann ist Deine Lösung auch wieder einen Tick zu umständlich. |
Da hast Du wahr. Aber schau mal, wann ich's schrub. Und zieh noch 'ne Stunde ab, hier gehen die Uhren falsch. _________________ "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies") |
|
Nach oben |
|
 |
faust •->

Anmeldedatum: 25.02.2012 Beiträge: 15
|
Verfasst am: 28.02.2012 - 19:08 Titel: |
|
|
Super, herzlichen Dank euch beiden. Das funktioniert bestens.
Mir ist das noch ein bisschen zu hoch, werde versuchen, mich da rein zu knien und es auch zu verstehen.
Ich hätte natürlich noch eine Anschlussfrage: Mit zwei Variablen (oder mehr) geht das nicht mehr so «einfach», wenn der Ausdruck "3*a+4*b^2" ist?
Ich könnte den Ausdruck in einzeln Teile splitten, was mir aber nicht so elegant scheint. |
|
Nach oben |
|
 |
woodpecker •--->

Anmeldedatum: 12.10.2010 Beiträge: 150 Wohnort: Roggentin/Rostock
|
Verfasst am: 28.02.2012 - 20:57 Titel: |
|
|
Das funktioniert genauso:
Code: | set expr to "3*a+4*b^2"
# diese Variablen können über Dialog eingelesen werden
set a to "3"
set b to "5"
set a to "set a to " & a
set b to "set b to " & b
run script a & return & b & return & expr |
Der Trick besteht darin, dass Du ein Script zusammenbaust, welches Du zur Laufzeit mit run script übersetzen und ausführen kannst |
|
Nach oben |
|
 |
faust •->

Anmeldedatum: 25.02.2012 Beiträge: 15
|
Verfasst am: 01.03.2012 - 11:30 Titel: |
|
|
Herzlichen Dank. Dann bleibt noch die letzte Frage.
Wenn ich die a's und b's eine Schleife durchlaufen lassen möchte, so erhalte ich eine Fehlermeldung.
set expr to "3*a+4*b^2"
set aa to 0
set b to 5
repeat until aa = 9
set aa to aa + 1
set a to aa as string
set a to "set a to " & a
set b to "set b to " & b
run script a & return & b & return & expr
end repeat
Ohne das repeat funktionierts. |
|
Nach oben |
|
 |
Wolle-77 •--->


Anmeldedatum: 25.02.2003 Beiträge: 448 Wohnort: Geldern
|
Verfasst am: 01.03.2012 - 13:42 Titel: |
|
|
Hallo faust,
um in solchen Fällen hinter Deinen Fehler zu kommen, ist es immer ratsam, sich einfach mal das Event-Protokoll anzusehen. Dann siehst Du genau, was das Problem ist und an welcher Stelle was schief geht.
In Deinem Fall ist es so, daß ab dem zweiten Durchlauf das b schon aus "set b to 5" besteht und dann aus "set b to 5 set b to ..."
So klappt das:
Code: | set expr to "3*a+4*b^2"
set a to 0
set b to 5
set ergebnisse to {}
repeat until a is 9
set a to a + 1
set va to "set a to " & a
set vb to "set b to " & b
set end of ergebnisse to ((run script va & return & vb & return & expr) as integer)
end repeat
return ergebnisse |
_________________ Martin Wolter
--
Apple rocks the planet! |
|
Nach oben |
|
 |
faust •->

Anmeldedatum: 25.02.2012 Beiträge: 15
|
Verfasst am: 01.03.2012 - 18:27 Titel: |
|
|
Danke, blöder Fehler von mir, leicht peinlich.  |
|
Nach oben |
|
 |
|