Is this code better?
I noticed, you missed some inverted commas,
So, at the risk of being pedantic, I am appending the code:
#!/usr/bin/perl
use strict;
use warnings;
use Tie::Handle::CSV;
my $qbook = Tie::Handle::CSV->new('C:\Documents and Settings\Soham
Das\Desktop\Quotes.csv',header=>1);
my $tradebook = Tie::Handle::CSV->new('C:\Documents and Settings\Soham
Das\Desktop\Transactions.csv',header=>1);
my $dailytrade={};
my $portfolio={};
while(my $mktdates =<$qbook>)
{
while(my $trades=<$tradebook>)
{
if($trades->{'Date'} eq $mktdates->{'Date'})
{
$dailytrade->{$trades->{'Scrip'}}={
'Action'=$trades->{'Action'},
'Scrip'= $trades->{'Scrip'},
'Shares'= $trades->{'Shares'},
'Price'=($trades->{'Price'})*1.00845,
};
}
#Update the portfolio
}
}
close $qbook ;
close $tradebook;
When I compile this, it gives me an error like this:
Can't modify constant item in scalar assignment at Test.pl line 18, near "}";
So for the sake of clarity I highlited the Line 18.
'Action'=$trades->{'Action'},
A bit of help in this, will be great!
Soham
________________________________
From: John W. Krahn <[email protected]>
To: Perl Beginners <[email protected]>
Sent: Fri, 9 October, 2009 11:57:09 AM
Subject: Re: Building a record on the fly via hash of hashes
Soham Das wrote:
> The Code:
>
> use strict;
> use warnings;
> use Tie::Handle::CSV;
>
> my $qbook = Tie::Handle::CSV->new('C:\Documents and Settings\Soham
> Das\Desktop\Quotes.csv',header=>1);
> my $tradebook = Tie::Handle::CSV->new('C:\Documents and Settings\Soham
> Das\Desktop\Transactions.csv',header=>1);
>
> my $dailytrade={};
> my $portfolio={};
> my $singletrade={};
You are declaring $singletrade in file scope from this point forward.
> while(my $mktdates =<$qbook>)
> {
> while(my $trades=<$tradebook>)
> {
> if($trades->{'Date'} eq $mktdates->{'Date'})
> {
> $singletrade->{'Action'}=$trades->{'Action'};
> $singletrade->{'Scrip'}= $trades->{'Scrip'};
> $singletrade->{'Shares'}= $trades->{'Shares'};
> $singletrade->{'Price'}=($trades->{'Price'})*1.00845;
Because $singletrade is in file scope you are overwriting the same four keys
each time you enter this if block. You need to restrict the scope of
$singletrade to inside the inner while loop otherwise you are just copying the
*same* hash reference to every key of $dailytrade.
> $dailytrade->{$singletrade->{'Scrip'}}= $singletrade;
> # print
> $dailytrade->{$singletrade->{'Scrip'}}->{'Price'},"\n";
> }
> #Update the portfolio
>
> }
> }
> close $qbook ;
> close $tradebook;
You probably want something like this:
use strict;
use warnings;
use Tie::Handle::CSV;
my $qbook = Tie::Handle::CSV->new( 'C:\Documents and Settings\Soham
Das\Desktop\Quotes.csv', header => 1 );
my $tradebook = Tie::Handle::CSV->new( 'C:\Documents and Settings\Soham
Das\Desktop\Transactions.csv', header => 1 );
my %dailytrade;
my %portfolio;
while ( my $mktdates = <$qbook> ) {
while ( my $trades = <$tradebook> ) {
if ( $trades->{ Date } eq $mktdates->{ Date } ) {
$dailytrade{ $trades->{ Scrip } } = {
Action => $trades->{ Action },
Scrip => $trades->{ Scrip },
Shares => $trades->{ Shares },
Price => $trades->{ Price } * 1.00845,
};
# print "$dailytrade{$trades->{Scrip}}{Price}\n";
}
#Update the portfolio
}
}
close $qbook;
close $tradebook;
John
-- The programmer is fighting against the two most
destructive forces in the universe: entropy and
human stupidity. -- Damian Conway
-- To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/
From cricket scores to your friends. Try the Yahoo! India Homepage!
http://in.yahoo.com/trynew