2017-10-28 13 views
5

Giả sử chúng ta có mẫu uốn đều đặn, không thể chia thành các đoạn. Ví dụ. nó có thể được trộn (thêm một số chữ cái bên trong từ) hoặc thay đổi nguyên âm ('ablaut'). Hãy xem xét một ví dụ từ tiếng Đức.Tôi có thể sửa đổi regex bằng chữ trong Perl 6 không?

my @words = <Vater Garten Nagel>; 
my $search = "/@words.join('|')/".EVAL; 

"mein Vater" ~~ $search;        
say $/; # 「Vater」 

Tất cả ba chữ Đức thành số nhiều bằng cách thay đổi thư thứ 2 của họ 'a' đến 'a'. Vì vậy, 'Vater' → 'Väter', 'Garten' → 'Gärten', 'Nagel' → 'Nägel'.

Có cách nào để sửa đổi regex $search của mình để nó có khớp với các dạng số nhiều không? Dưới đây là những gì tôi đang tìm kiếm:

my $search_ä = $search.mymethod; 
"ihre Väter" ~~ $search_ä; 
say $/; # 「Väter」 

Tất nhiên, tôi có thể thay đổi @words mảng và 'tiền biên dịch' nó thành một mới regex. Nhưng nó sẽ tốt hơn (nếu có thể) để sửa đổi trực tiếp regex hiện tại.

+1

Bạn chỉ nên tối ưu hóa sau khi nhận được nó để trạng thái hoạt động và sau khi xác định mã của bạn không đủ nhanh. –

+0

@BradGilbert, những hạn chế có thể có của việc sử dụng tối ưu hóa này theo mặc định (nói chung, tôi làm việc với hàng trăm phím tìm kiếm và corpora văn bản lớn, vì vậy mà không tối ưu hóa này thực sự chậm)? Ngoại trừ các mã được ít linh hoạt và ít thanh lịch. –

Trả lời

7

Bạn không thể.

Regexes là đối tượng mã trong Perl 6. Vì vậy, câu hỏi của bạn về cơ bản là "Tôi có thể sửa đổi chương trình con hoặc phương thức sau khi đã viết chúng không?". Và câu trả lời là giống nhau đối với các đối tượng mã truyền thống và đối với các regex: không, hãy viết chúng theo ý muốn của bạn ngay từ đầu.

Điều đó nói rằng, bạn không thực sự cần EVAL cho trường hợp sử dụng của mình. Khi bạn sử dụng một biến mảng bên trong một regex, nó được nội suy như một danh sách các chi nhánh khác, vì vậy bạn chỉ có thể viết:

my @words = <Vater Garten Nagel>; my $search = /@words/;

Các regex $search trở thành một đóng cửa, vì vậy nếu bạn sửa đổi @words, bạn cũng thay đổi những gì phù hợp với $search.

Một cách tiếp cận để ví dụ cụ thể này sẽ được sử dụng :ignoremark sửa đổi, mà làm cho a cũng phù hợp ä (mặc dù cũng có rất nhiều hình thức khác, chẳng hạn như ā hoặc ǎ.)

+1

Cảm ơn bạn đã làm rõ! Đối với việc tôi sử dụng 'EVAL' thay vì'/@ words/', vấn đề là với dữ liệu thực, mảng tìm kiếm' @ words' của tôi thường chứa vài trăm khóa. Vì vậy, nếu tôi không 'biên dịch trước' chúng bằng 'EVAL', chương trình sẽ trở nên rất chậm. Tôi đã hỏi một số câu hỏi về vấn đề này, vì vậy nếu có giải pháp tốt hơn, vui lòng cho tôi biết. ① [Tốc độ regex] (https://stackoverflow.com/questions/46867216/regex-speed-in-perl-6) ② [Lọc một mảng] (https://stackoverflow.com/questions/46933838/filtering-elements -of-an-array-với-phần tử-của-một mảng-trong-perl-6 khác) –

Các vấn đề liên quan