Để hơi rõ the excellent answer từ Сухой27:
Như bạn đã thấy, bạn không thể sử dụng một biến trong các tùy chọn phần của các nhà điều hành s///
(tốt, bạn có thể nếu bạn sử dụng eval
nhưng đó sẽ là một ý tưởng rất xấu).
Tuy nhiên, đó không phải là cách duy nhất để đưa các tùy chọn vào đối sánh regex. Bạn cũng có thể sử dụng cú pháp (?...)
bên trong chuỗi regex. Ví dụ: m/(?i)foo/
chính xác giống như m/foo/i
. Lưu ý rằng /g
là một lớp tùy chọn hơi khác, do đó bạn không thể sử dụng tùy chọn đó như thế này.
Nhưng vì chuỗi (?...)
này chỉ là một phần của regex, bạn có thể sử dụng biến để nhúng nó vào trong regex của mình.
my $opt = $IgnoreCase ? "(?i)" : "";
$string =~ s/$opt$source/$replace/g;
Xem "Extended Patterns" in perldoc perlre để biết thêm chi tiết.
Nguồn
2017-11-30 09:52:42
Bạn có thể giải thích một chút – ssr1012
Cảm ơn bạn đã trả lời nhanh. Nó woks hoàn hảo hình thành tôi. – Horst
Những thứ như 'i' có thể được cung cấp khi chạy bằng cách sử dụng dấu ngoặc vuông để bật và tắt chúng lần nữa. Bạn không thể làm điều này với 'g' mặc dù, bởi vì nó cơ bản làm thay đổi hành vi của động cơ regex. – Sobrique