2009-05-01 31 views
6

Tôi đang xem xét một số trình kích hoạt ClearCase được viết bằng Perl. Tôi đã nhận thấy rằng trong một số biểu thức chính quy, các biến được truyền hoặc là straighforwardly hoặc với tên của chúng trong dấu ngoặc nhọn.

Ví dụ, tôi có dòng mã sau đây trong một trigger:

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

$component, $phase, $automateddigit, $project_root là tất cả các biến.

Tại sao một số được chuyển thành $variable và một số khác được chuyển thành ${variable} trong cụm từ thông dụng?

Sản phẩm có xuất phát từ cách chúng được khởi tạo không?

Sau đây là các dòng mã initialising họ:

($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+'; 
} 

Trả lời

7

Nếu bạn vượt qua các biến như $ {name}, điều này một cách rõ ràng delimits nơi kết thúc của tên biến là, và nơi mà các phần còn lại của trích dẫn chuỗi bắt đầu. Ví dụ, trong mã của bạn:

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

Nếu không có sự {} delimiters:

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

Lưu ý rằng $ thành phần biến (bạn có thể tham khảo một trong hai cách) sẽ bị hiểu sai như $ component_ vì sự dấu gạch dưới dấu gạch dưới trong cụm từ thông dụng.

+0

OK, vì vậy tôi nên sử dụng $ {variable} mọi lúc, sau đó. Không? –

+0

Tôi đề nghị chỉ khi cần thiết - bạn nên nhận biết tên của các biến của bạn vì vậy nếu chúng sẽ gây ra xung đột thì hãy làm điều đó. Làm mọi nơi có thể ồn ào –

+0

OK, Cảm ơn! Tôi đã nhận được câu trả lời của mình. :-) –

1

Đầu tiên, điều này được gọi là nội suy chuỗi. Một lý do chính đáng để sử dụng nó trong trường hợp này là ngăn $ project_root không được hiểu là $ project_root_ (lưu ý dấu gạch dưới sau). Nó làm rõ tên biến, thay vì để nó thành các quy tắc nội suy phức tạp hơn.

Xem perldata để biết thêm về nội suy, và perlre và perlop về các đặc thù của nội suy trong các toán tử biểu thức chính quy.

1

Như đã đề cập ở trên, nó có để phân định tên biến. Quá nhiều dấu ngoặc nhọn làm cho các biểu thức thông thường khó khăn hơn nữa. Niềng răng xoăn có sử dụng regexp riêng của chúng (để hạn chế số lần một mẫu phù hợp). Tôi khuyên bạn nên sử dụng công cụ sửa đổi regexp/x và viết lại regexp của bạn là:

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) 
Các vấn đề liên quan