RE: multi-dimensional arrays (new to AS)
RE: multi-dimensional arrays (new to AS)
- Subject: RE: multi-dimensional arrays (new to AS)
- From: "Wallace, William" <email@hidden>
- Date: Wed, 26 May 2004 13:10:04 -0500
- Thread-topic: multi-dimensional arrays (new to AS)
Is verboten! I had a situation a few months back where such a maneuver would have really come in handy, but I discovered (with the help of some folks from this list) that it can't be done that way.
Here is a link to the thread where it was explained to me:
http://lists.apple.com/archives/applescript-users/2003/Dec/05/usingvariablesinplaceofp.001.txt
B!ll
PS - sorry about any goofy line wraps. This list server doesn't like the way Outlook Exchange formats email (neither do I for that matter)
>
----------
>
From: email@hidden on behalf of Sprague, Graham
>
Sent: Wednesday, May 26, 2004 11:01 AM
>
To: Jeff Hartman; 'Graff'
>
Cc: Applescript List
>
Subject: RE: multi-dimensional arrays (new to AS)
>
>
Hey Jeff,
>
>
You seem pretty knowledgable when it comes to lists and records. I have a
>
question for you.
>
>
Is it possible to access a Key:value pair from a record when the key is
>
stored in a variable.
>
>
for example this causes an error but may illustrate what I'm attempting to
>
do...
>
>
> set theRecord to {mike: 1, jill: 10, sue: 3, paul: 20}
>
>
>
set keyToSearchFor to "mike"
>
>
set valueForKey to keyToSearchFor of theRecord-- Does not work gives error
>
"cant get keyToSearchFor of {mike: 1, jill: 10, sue: 3, paul: 20}"
>
>
>
Seems like it's not accepting the variable contents, in this case "mike"
>
and is attempting to use the variable name, in this case "keyToSearchFor" as
>
the key.
>
>
>
Any help would be great.
>
>
Thanks,
>
Graham
>
>
>
> ----------
>
> From: Graff
>
> Sent: Tuesday, April 20, 2004 9:45 PM
>
> To: Jeff Hartman
>
> Cc: Applescript List
>
> Subject: Re: multi-dimensional arrays (new to AS)
>
>
>
> On Apr 20, 2004, at 2:28 PM, Jeff Hartman wrote:
>
>
>
> > Bear with me as I am pretty new to applescript. Sorry for terminology
>
> > if not
>
> > correct.
>
> >
>
> > I have a list containing server volumes. Each server item in the list
>
> > contains a list of connection strings. Trying to fit into a Window
>
> > environment here...
>
> >
>
> > So:
>
> >
>
> > set theList to {server1:{ipaddress:"x.x.x.x",path:"blah"}, server2:{
>
> > ....
>
>
>
> That isn't an array or a list, it is a record. A record is a series of
>
> key-value pairs, a list is a series of values. You can't iterate
>
> through a record, you need to access each value by supplying the key
>
> that the value is attached to.
>
>
>
> For example, this is a list:
>
> set theList to {1, 2, 3, 4, 5}
>
>
>
> You would access each item in the list in several ways. One way is
>
> direct access:
>
> set theValue to item 1 of theList
>
>
>
> Another is through a repeat statement:
>
> set sum to 0
>
> repeat with theValue in theList
>
> set sum to sum + theValue
>
> end repeat
>
>
>
> You could also do this the long way:
>
> set sum to 0
>
> repeat with i from 1 to length of theList
>
> set sum to sum + item i of theList
>
> end repeat
>
>
>
> Both repeats are roughly equal, the first one is a shortcut for
>
> iterating through a list.
>
>
>
> This is a record:
>
> set theRecord to {mike: 1, jill: 10, sue: 3, paul: 20}
>
>
>
> A record has a key, followed by a colon (:), followed by the value.
>
> Each key-value pair is separated from the next pair by a comma. Values
>
> can be of any type of variable possible in AppleScript
>
>
>
> You can have lists of lists, records of lists, lists of records, etc.
>
> Basically you are just storing one set of objects inside another. For
>
> example:
>
> set listList to {{1, 2, 3}, {1, 3, 5}, {2, 4, 6, 8}}
>
>
>
> You'll notice that the objects don't even have to be the same type or
>
> of the same length:
>
> set anotherList to {1, {2 , 4, 6}, {3, 5}, "boo"}
>
>
>
> In order to get the value of any item in the record you need to get it
>
> explicitly:
>
> set theRecord to {mike: 1, jill: 10, sue: 3, paul: 20> }
>
> set theValue to mike of theRecord
>
> --> 1
>
> (1 is the value stored in theValue)
>
>
>
> To sum up all the values you need to get each one individually:
>
> set sum to 0
>
> set sum to sum + mike of theRecord
>
> set sum to sum + jill of theRecord
>
> set sum to sum + sue of theRecord
>
> set sum to sum + paul of theRecord
>
>
>
> You can also coerce a record into a list. This will lose all of the
>
> keys and will copy only the values into a list:
>
> set theList to theRecord as list
>
> --->{1, 10, 3, 20}
>
> (this is what is stored in theList)
>
>
>
> Then you can sum them up:
>
> set theRecord to {mike: 1, jill: 10, sue: 3, paul: 20}
>
> set theList to theRecord as list
>
> set sum to 0
>
> repeat with theValue in theList
>
> set sum to sum + theValue
>
> end repeat
>
>
>
> To iterate through a list of lists you would do a nested loop:
>
> set listList to {{1, 2, 3}, {1, 3, 5}, {2, 4, 6, 8}}
>
> set sum to 0
>
> repeat with aList in listList
>
> repeat with theValue in aList
>
> set sum to sum + theValue
>
> end repeat
>
> end repeat
>
>
>
> > set theList to {server1:{ipaddress:"x.x.x.x",path:"blah"}, server2:{
>
> > ....
>
> >
>
> > what I want to do is walk the array (repeat with?) and connect to each
>
> > server using the list of connection strings:
>
> >
>
> > mount volume smb://domain;uid:password@ipaddress/path
>
> >
>
> >
>
> > Each connection must be dropped before connecting to the next.
>
> >
>
> > I wondering how I can walk the arrays.
>
>
>
> Coming back to your example:
>
> set theStructure to {server1:{ipaddress:"x.x.x.x", path:"foo"},
>
> server2:{ipaddress:"y.y.y.y", path:"bar"}}
>
>
>
> This is a record of records. I'm assuming that the actual key of each
>
> server (the names server1, server2, etc.) doesn't matter so we can just
>
> throw it away and create a list of records:
>
> set theList to theStructure as list
>
> -->{{ipaddress:"x.x.x.x", path:"foo"}, {ipaddress:"y.y.y.y",
>
> path:"bar"}}
>
>
>
> Now since the interior records are the same between each item we can
>
> iterate through the items and use each record (I included all of the
>
> lines of the example here):
>
> set theStructure to {server1:{ipaddress:"x.x.x.x", path:"foo"},
>
> server2:{ipaddress:"y.y.y.y", path:"bar"}}
>
> set theList to theStructure as list
>
> repeat with aServer in theList
>
> set theAddress to ipaddress of aServer
>
> set thePath to path of aServer
>
> mount volume "smp://domain;uid:password@" & theAddress & thePath
>
> -- do other stuff here
>
> end repeat
>
>
>
> And that's the whole tutorial! :-)
>
>
>
> - Ken
>
> _______________________________________________
>
> applescript-users mailing list | email@hidden
>
> Help/Unsubscribe/Archives:
>
> http://www.lists.apple.com/mailman/listinfo/applescript-users
>
> Do not post admin requests to the list. They will be ignored.
_______________________________________________
applescript-users mailing list | email@hidden
Help/Unsubscribe/Archives:
http://www.lists.apple.com/mailman/listinfo/applescript-users
Do not post admin requests to the list. They will be ignored.