Stefan Welscher: Hash-Struktur dynamisch bilden

Beitrag lesen

OK, konnte es jetzt mit eval lösen... keine Ahnung ob das die geschickteste Lösung ist, aber es funkntioniert:

  
sub interpret_commands  
{  
        my $I=$_[0];  
        if ($I->{'commands'})  
        {  
                my $cmd;  
                my @commands=split (/[;:,.|]+/,$I->{'commands'});  
                foreach $cmd (@commands)  
                {  
                        #SET-Commands  
                        if ($cmd=~/^s*SET[_-]([a-z0-9_]+)(-([a-z0-9_]+))?(-([a-z0-9_]+))?(-([a-z0-9_]+))?(-([a-z0-9_]+))?(-([a-z0-9_]+))?(-([a-z0-9_]+))?(-([a-z0-9_]+))?(-([a-z0-9_]+))?(-([a-z0-9_]+))?\s*=\s*(.*?)\s*$/i)  
                        {  
                                my $construct="\$I->";  
                                my @parts=(lc($1),lc($3),lc($5),lc($7),lc($9),lc($11),lc($13),lc($15),lc($17),lc($19));  
                                my $value=$20; $value=~s/(^["']|["']$)//g; $value=~s/"/\\"/g;  
                                foreach $p (@parts)  
                                {  
                                        if ($p=~/^\d+$/)                                        { $construct.="{".$p."}";       }  
                                        elsif ($p=~/^[a-z0-9_]+$/i)     { $construct.="{'".$p."'}";     }  
                                }  
                                eval($construct."=\"".$value."\"");  
                        }  
                        elsif ($cmd=~/SET/i)  
                        { print STDERR "\nInvalid command syntax: ".$cmd."\n"; }  
                }  
        }  
}