Re: Serious question on using Perl or not...

[email protected] (Dan Hursh)
Newsgroups perl.advocacy
Message-ID <[email protected]>
Gregoire Hostettler wrote:
> Hi!
> 
> I do not know I am on the right mailing list.
> If not, sorry for the burden.
> 
> To say thing briefly:
> I am a programmer for some 25 years using various old and newer languages.
> I have to write some small things in Perl.
> It was fine and fast with some text analysis.
> 
> Now I have to write something using an in-memory "database", i.e. a SINGLE
> table filled with records.
> 
> I am trying to simply add records then retriev them.
> I already spent more than 20 hours for something which should take 30
> minutes....
> 
> Seriousely considering making my customer change his mind and revert to
> plain old C++
> Just to be certain not to miss something simple, I attach a small part of my
> very, very basic trials.
> 
> As you can see when running this small piece of "code", as soon as you push
> a new record, all records already existing become
> filled with the new pushed record and it is impossible to get any other...
> 
> Looks like Perl is not able to handle trivial data structure like an array
> of records (or hashes).
> 
> Thank you for any help!
> 
> 
> Caracal - G. Hostettler
> 6, ch. du Raidillon
> 1522 Lucens
> 

My first bit of advise, don't pass around hashes.  Pass references. 
Second don't declare the @table.  Or rather declare it (with my) but 
don't initialize it.  The assignment make a great comment, but you don't 
declare 'fields' in a hash.  On the push in addrec push a reference.

	push @table, { %lrec};

It's just like an array of pointers in C.  It an array of hash 
references (or pointers).

In getrec, you have an off by 1.  $#table is the last used index in 
@table, not the size.  It's 1 too small. Use scalar(@table to get the 
size or do this

	if (($recnum < 0) or ($recnum > ($#table) )) {

To get you hash back you'd need to dereference it.

	%lrec = %{$table[$recnum]}

Your statements to print the size should look more like:

	print "Added rec. tblsize = ", scalar(@table), "\n";

After all of this, you code is still going to be kind of ugly because 
you pass around the hash in list context.

try something like

	sub addrec { # takes a list of key value pairs
		push @table, { @_ }
	}

	getrec($){ # take an index, returns hash ref or undef on failure
		return $table[shift]; # gets undef() on failure
	}

Dan
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.