2009-05-01 6 views
6

Ich überprüfe einige ClearCase-Trigger in Perl geschrieben. Ich habe bemerkt, dass Variablen in einigen regulären Ausdrücken entweder geradlinig oder mit ihren Namen in geschweiften Klammern übergeben werden.

Zum Beispiel habe ich die folgende Codezeile in einem Trigger:

if ($baseline !~ /^${component}_(|.*_)$phase\.\d+(|[a-z]|-\d+|${automateddigit})$/ && 
     $baseline !~ /^${project_root}_$phase\.\d+(|[a-z]|-\d+|${automateddigit})$/) 

$component, $phase, $automateddigit, $project_root alle Variablen.

Warum werden einige als $variable und andere als ${variable} im regulären Ausdruck übergeben?

Kommt es darauf an, wie sie initialisiert werden?

Hier sind die Codezeile sie initialisiert:

($project = $ENV{CLEARCASE_PROJECT}) =~ s/\@.*$//; 
($component = $ENV{CLEARCASE_COMPONENT}) =~ s/\@.*$//; 

($project_root, $phase) = ($project =~ /^(.*)_(R\d+.*)$/); 

exit(0) if (! $phase); 

$phase .= ".0" if ($phase =~ /^R\d+$/); 

$automateddigit = ''; 

$istream = `cleartool desc -fmt "%[istream]p" project:$ENV{CLEARCASE_PROJECT}`; 

$componentlist = `cleartool desc -fmt "%[components]Cp" stream:$ENV{CLEARCASE_STREAM}`; 
$componentsnbr = split(',', $componentlist); 

if ($componentsnbr > 1) { 
    $automateddigit .= '\\.\\d+'; 
} 

Antwort

7

Wenn Sie passieren die Variable als $ {name}, dies begrenzt ausdrücklich, wo das Ende des Variablennamens ist, und wo der Rest des zitierten Die Zeichenfolge beginnt. Zum Beispiel im Code:

if ($baseline !~ /^${component}_(|.*_)$phase\.\d+(|[a-z]|-\d+|${automateddigit})$/ && 

Ohne die {} Trennzeichen:

if ($baseline !~ /^$component_(|.*_)$phase\.\d+(|[a-z]|-\d+|${automateddigit})$/ && 

Beachten Sie, dass die Variable $ Komponente (Sie es so oder so beziehen kann) wird wie $ Component_ wegen der falsch interpretiert werden abschließender Unterstrich im regulären Ausdruck.

+0

OK, so dass ich besser nutzen $ {variable} die ganze Zeit, dann. Nein ? –

+0

Ich schlage nur vor, wo es nötig ist - Sie sollten sich der Namen Ihrer Variablen bewusst sein, wenn sie einen Konflikt verursachen würden, dann tun Sie es. Es kann überall laut sein –

+0

OK, Danke! Ich habe meine Antworten bekommen. :-) –

1

Zuerst wird dies String-Interpolation genannt. Ein guter Grund, es in diesem Fall zu verwenden, besteht darin, zu verhindern, dass $ project_root als $ project_root_ interpretiert wird (beachten Sie den abschließenden Unterstrich). Es macht den Variablennamen explizit, anstatt ihn den komplizierteren Interpolationsregeln zu überlassen.

Siehe perldata für mehr über Interpolation und perlre und perlop auf Besonderheiten der Interpolation innerhalb regulärer Ausdruck Operatoren.

1

Wie oben erwähnt, dient es zum Abgrenzen von Variablennamen. Zu viele geschweifte Klammern machen bereits schwierige reguläre Ausdrücke noch schwieriger. Curly-Klammern haben ihre eigenen Regexp-Verwendungen (um die Häufigkeit zu begrenzen, mit der ein Muster übereinstimmt). Ich würde empfehlen, die regexp/x-Modifikator verwenden, und umschreiben Ihre regexp als:

if ($baseline !~ /^$component # Start with $component 
        _    # then an underscore 
        (|.*_)  # Then nothing, or anything followed by an underscore 
        $phase  # ... 
        \.\d+   # ... 
        (|   # Then optionally: 
         [a-z]|  # lower alpha 
         -\d+|  # or ... 
         $automateddigit 
        ) 
        $/x && 
    $baseline !~ /^$project_root 
        _ 
        $phase 
        \.\d+ 
        (| 
        [a-z]| 
        -\d+| 
        $automateddigit 
        )$/x) 
Verwandte Themen