2016-06-06 8 views
-1

Ich habe Zeilen im Programm:Seltsame Fehlermeldung in meinem Perl-Programm

$data->{external_mf}->{pre_price} = nearest(.000001, MOA::CLSUtils::get_price($data->{external_mf}->{pool_cusip} ,$start_date));  
    $data->{external_mf}->{pre_price} = (defined ($data->{external_mf}->{pre_price})) ? $data->{external_mf}->{pre_price} : 0;  
    $data->{external_mf}->{pre_price} ||=0;  
    $data->{external_mf}->{pre_price} = nearest (.01, $data->{external_mf}->{pre_price}) if ($&& $args->{port} !~ /20016|20026/); 

Wenn ich das Programm ausführen, bekam eine Fehlermeldung:

Use of uninitialized value $& in bitwise and (&) at G:\invacct\perl\scripts\pfi_ general_ledger_check.pl line 286.

Linie 286 ist die letzte oben in Segment. Kann mir jemand sagen, was es sein soll?

+2

schreiben, was Sie mit dieser Aussage 'wenn versuchen zu erreichen ($ && $ args -> {port} ~/20016 |! 20026 /) {}'? –

+5

['$ &'] (http://perldoc.perl.org/perlvar.html) ist eine gültige Variable in Perl und ['&'] (http://perldoc.perl.org/perlop.html#Bitwise -und) ist der bitweise-Operator. Diese Aussage macht wahrscheinlich nicht das, was Sie wollen/erwarten. –

+0

Das Problem ist, dass ich gerade dieses Programm habe und versuche zu verstehen, was es macht und warum es so viele Fehler hat. – nelli

Antwort

1

Das Problem ist hier

... if ($&& $args->{port} !~ /20016|20026/) 

die

... if $& & $args->{port} !~ /20016|20026/; 

als

parst Es ist schwer zu sagen, was du damit gemeint, aber $& hält die Zeichenfolge zuletzt durch einen RegexMuster abgestimmt. Es ist undef hier, vermutlich, weil Sie Regex-Muster in Ihrem Code zuvor nicht verwendet haben

Es sieht so aus, als könnte dies genug sein. Beachten Sie, dass Sie müssen auch Anker Ihre RegexMuster, sonst wird es jeden Teil passen statt des gesamten Zeichenfolge

$data->{external_mf}{pre_price} = nearest(0.01, $data->{external_mf}{pre_price}) 
     unless $args->{port} =~ /^200[12]6$/ 



Es kann diesen Code hilft richtig Refactoring zu sehen. Ich würde es so

$data->{external_mf}{pre_price} = do { 

    my $price = MOA::CLSUtils::get_price($data->{external_mf}{pool_cusip}, $start_date); 

    if ($price) { 
     my $precision = $args->{port} =~ /^200[12]6$/) ? 0.000001 : 0.01; 
     $price = nearest($precision, $price); 
    } 
    else { 
     $price = 0; 
    } 

    $price; 
}; 
+0

Es scheint wie $ & nicht in dieser Zeile verwendet werden müssen. Es bedeutet nichts, weil ich davor keinen regulären Ausdruck sehe. – nelli

+1

@nelli: Ich stimme dir zu. Selbst wenn es ein gültiger Test wäre, würde es aussehen wie 'if $ & && $ args -> {port}! ~/20016 | 20026/'. Ich denke, Ihr Vorgänger war einfach unfähig – Borodin

+0

coul, d Sie mir bitte sagen, wie Sie jede der mtghe folgenden Variablen drucken: $ Daten -> {external_mf} -> {cur_price} = nächste (.000001, $ Daten -> {external_mf} -> {cur_price} + $ data -> {external_mf} -> {täglich_div_rate} – nelli