Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re^3: How to set variable names using Text::CSV?

by Tanktalus (Canon)
on Oct 16, 2009 at 05:24 UTC ( [id://801499]=note: print w/replies, xml ) Need Help??


in reply to Re^2: How to set variable names using Text::CSV?
in thread How to set variable names using Text::CSV?

You're not really explaining what you want to do. Because, as far as I can tell, your first script works just fine. Once you get the $hr, you print Dumper($hr), and the output you see to your screen will look like:

$VAR1 = { 'class_name' => '1st level Fighter/1st level Thief/1st level + Mage', 'intelligence' => '18', 'wisdom' => '14', 'charisma' => '15', 'experience' => '0', 'dexterity' => '18', 'strength' => '18(93)', 'last_name' => 'Zendelic', 'generic_class_name' => 'Fighter-Thief-Mage', 'filename' => '!ZeKy', 'generic_race' => 'Half-Elf', 'constitution' => '17', 'race' => 'Half-Elf', 'alignment' => 'Neutral Good', 'gender' => 'Female', 'id_name' => 'Kymaria_Zendelic', 'first_name' => 'Kymaria' };
That means that $hr is a reference to a hash (see the braces? Just like in your perl code when you want a reference to an anonymous hash). You could print ref($hr) to see that it says HASH. That means that if you put the rest of your character-handling-code inside that loop, and use $hr as a reference to a hash containing all the variables you care about, you should be off and running:
while (defined (my $hr = $csv->getline_hr($io))) { # use $hr->{id_name} to get the id_name }
You can't use Tie::IxHash because, well, you're not populating the hash. You'll probably have to extract things yourself in the order you want, but that's ok, you already have the order you want as @names. (Using DBD::CSV allows you to do this, too, but we'll stick with what you have for now.)

So, you'll have this loop:

while (defined (my $hr = $csv->getline_hr($io))) { my %general_information = ( "class(es)" => $hr->{class_name}, alignment => $hr->{alignment}, race => $hr->{race}, gender => $hr->{gender}, ); my %ability_scores = ( strength => $hr->{strength}, dexterity => $hr->{dexterity}, constitution => $hr->{constitution}, intelligence => $hr->{intelligence}, wisdom => $hr->{wisdom}, charisma => $hr->{charisma}, ); # do stuff with the above hashes. }
Mind you, that does seem somewhat repetitive, and I'm not a fan of repetition, so ...
while (defined (my $hr = $csv->getline_hr($io))) { my %general_information = ( "class(es)" => $hr->{class_name}, map { $_ => $hr->{$_} } qw/alignment ra +ce gender/; ); my %ability_scores = ( map { $_ => $hr->{$_} } qw/strength dexterity constitution intelligence wisdom charisma/ ); # here you can use them, same as previous example. list_loop(\%general_information); list_loop(\%ability_scores); }
Now, in these cases, you can use Tie::IxHash if you want to control the order of the keys, otherwise the order will be different each time you run (possibly).

Replies are listed 'Best First'.
Re^4: How to set variable names using Text::CSV?
by Lady_Aleena (Priest) on Oct 16, 2009 at 06:16 UTC
    Tanktalus,

    If I knew you a bit better, I would kiss you all over the face. The best I can do is give you some zen-cookies. You answered the big question I didn't know to ask, what was the proper hashref. This is what happens when one leaves a script for a long while and comes back. Without semantic names, one forgets what is what. So, I was left with a whole bunch of letters that were meaningless and not knowing what was doing what, because I am still not good at this. Use this as a cautionary tale about nonsemantic variable names.

    I still couldn't get it to dump the big hash tied up, but that is okay. I don't need it.

    Here is the script that works!

    While you are not a fan or repetition, I am not that big a fan of sprawl. I hope you don't mind.

    Have a nice day!
    Lady Aleena

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://801499]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others avoiding work at the Monastery: (3)
As of 2024-04-20 02:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found