Subject:
|
Re: Access a LEGO set DB with your phone!
|
Newsgroups:
|
lugnet.off-topic.geek
|
Date:
|
Mon, 18 Mar 2002 18:00:39 GMT
|
Viewed:
|
317 times
|
| |
| |
In lugnet.off-topic.geek, Christopher L. Weeks writes:
> The example at
> http://www.perldoc.com/perl5.6/faq/perlfaq4.html#How-do-I-process-modify-each-e
> lement-of-an-array- suggested using :
>
> for (@lines) {do stuff}
>
> But that didn't seem to work. I'm looking at a simple tutorial on foreach, but
> I don't get what the $set means or does for the loop. In your example, is it
> doing something like setting $set equal to $sets[each] while stepping through
> each array element? Or is $set just a counter while incrementing along the
> array's indecies?
well, $set gets assigned each element in the array, in order. so if your
array is "1", "10", "20", "this-string", $set will get each of these values,
then run the code block.
> Oh yeah. Oops. That was a hold over from an attempt to create the result of
> split() as an anonymous array. There was a [ to the left of split at one time
> too. Is there a way to put the results of the split function into a referenced
> array?
maybe I'm misunderstanding again...
@array = split /\t/, $test;
will put the result in an array.
if you want to skip a step, and get the result in an annonymous array, you
do something like this:
$ref = [ split /\t/, $test ];
> It actually never gets there. Something else is killing the script before it
> returns the results. I'm doing this by FTPing the code to a cgi-bin space that
> I can't ssh or telnet into and then running the CGI through a web page. Will
> that wait for all the results before displaying anything?
it was probably a syntax error. I would suggest installing perl on your
local box (if it's windows, you can go to activestate.com to download their
perl... or install it as part of cygwin, the unix for windows package, from
cygwin.com). that way, you can debug the script before you upload it to the
server... especially if you don't have access to the server error log.
> > for ($i=0;$i<$#sets;$i++) {....}
>
> How does $#sets evaluate?
$#sets will give you the index of the last element in the array (under any
sane conditions).
> > my %set_data = (); # empty hash
>
> declaring this variable is optional, right? I can just start using
> variables/datastructures and they're automagically declared..?
you can, but it's good practice to declare them. just a habit, I guess.
> > foreach $set (@sets) {
> > my $array_ref = []; # a reference to an annonymous array - new one created
> > # in each iteration of the foreach
> > @$array_ref = split /\t/, $set;
>
> Is that the right syntax? are there supposed to be curly braces around the
> $array_ref (ie. @{$array_ref} )? Is that optional, or am I just mistaken?
I believe that would work, but adding the curly braces will defenitly not
hurt :) like I said, this is really untested. I know that oft you can get
away with @$ref instead of @{$ref}.
> > my $set_id = shift @$array_ref; # the first entry is the set number, we'll
> > # use that as the indexing key
> > $set_data{$set_id} = $array_ref; # store our parsed array in the hash
> > }
>
> That shift pulls off the first cell of the array which isn't unique. Isn't
> that going to mess up searches? If you pop the last cell instead, that'll use
> the guide's unique identifier as the key. What are the dangers of non-unique
> keys?
actually, shift pulls off the first cell of the array. period. the whole
unique part is in the hash... in this case, if the Guide list had two sets
that were 3033-1, the latter would overwrite the former. But I believe the
Guide is designed so that the keys are unique, which is why we have the -1,
-2 there in the first place.
> > now this is all untested, written first thing in the day, so you might want
> > to try it out first... but it should work. now, when you want to look up a
> > set, you can do something like:
> >
> > @set_info = @{$set_data{$set_id});
> >
> > to retreive the array. if you don't have the exact id, you can run a "search":
> >
> > @set_matches = grep /$partial_id/, keys %set_data;
> >
> > does any of this make any sense to you?
>
> Some. Actually, I'm losing the ability to ask cogent questions. In the line
> above "@set_info = @($set_data($set_id));" for instance, I don't follow what
> exactly is being assigned, but I'm not sure what to ask to get at the heart of
> what I'm missing.
$set_data{$set_id} is reading from the hash we created earlier. so it gets
a reference to an array. to dereference it, we add a @{...} around it.
then, the array gets assigned to @set_info.
:)
> > > Also, if I want to print the value of $i+1 in a loop based on incrementation
> > > of $i, what do I do to represent that?
> for ($i=0;$i<10; $i++) {
> print "$i+1\n";
> }
>
> prints:
>
> 0+1
> 1+1
> 2+1
>
> etc. and I want:
>
> 1
> 2
> 3
ahhh...
for ($i=0; $i<10; $i++) {
print $i+1, "\n";
}
print accepts a list, so seperating parts with commas works. another way
would be to do this (which is less readable, imo):
for ($i=0; $i<10; $i++) {
print ($i+1). "\n";
}
and use the string concat operator (.), so that print gets a single value,
instead of a list.
> > Hope that helped!
>
> Yeah! Thank you _very_ much for all this. I suppose I should be over at
> com.lang.perl.newbie or something but this really is just me trying to
> implement LShop improvements, not learn perl generally.
oh, I love preaching perl... so np :)
Dan
|
|
Message is in Reply To:
| | Re: Access a LEGO set DB with your phone!
|
| (...) The example at (URL) suggested using : for (@lines) {do stuff} But that didn't seem to work. I'm looking at a simple tutorial on foreach, but I don't get what the $set means or does for the loop. In your example, is it doing something like (...) (23 years ago, 18-Mar-02, to lugnet.off-topic.geek)
|
9 Messages in This Thread:
- Entire Thread on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
|
|
|
|