Hi Dennis,

On Wednesday 01 December 2010 11:24:02 Dennis Jakobi wrote:
> Hi there,
> 
> I have the following problem:
> 
> I want to read a logfile in which every line follows this rule:
> <value1>:<value2>:<value3>...
> 
> But the number of values differs. Sometimes a line has 2 values (the
> minimum) and sometimes 3 or more values. Now I want to push these
> values into a hash that follows that form:
> $hash->{value1}->{value2}...
> 
> This is what I have so far:
> 

First a few comments on your code:


> sub readLog {
>     my $self = shift;
>     my $logfile = getFilename();

Are you sure you want to:

1. Use camelCase.

2. Not do $self->get_filename().

3. Call it "get_filename()" instead of "get_log_filename()"?

> 
>     open LOG, "<$logfile";

Use three-args-open, lexical filehandles, etc:

http://perl-begin.org/tutorials/bad-elements/#open-function-style

> 
>     foreach my $line (<LOG>) {

«while (my $line = <$log>)» would be more preferable here because it will 
consume less memory:

http://perl-begin.org/tutorials/bad-elements/#foreach-lines

>         my @values = split /\:/, $line;

split /:/ will work just as well, as ":" is not a special character.

>         ... # at this point I don't know what to do :(

OK, here's what you can do (untested):

[code]
my $hash_ref = \%hash;

foreach my $val (@values[0 .. $#values-2])
{
    $hash_ref = ($hash_ref->{$val} ||= {});
}

$hash_ref->{$values[-2]} = $values[-1];
[/code]

I did not deal with some edge cases, but hopefully it will be OK.

Regards,

        Shlomi Fish

-- 
-----------------------------------------------------------------
Shlomi Fish       http://www.shlomifish.org/
Funny Anti-Terrorism Story - http://shlom.in/enemy

<rindolf> She's a hot chick. But she smokes.
<go|dfish> She can smoke as long as she's smokin'.

Please reply to list if it's a mailing list post - http://shlom.in/reply .

--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to