Khi toán tử "m" có cờ/g VÀ được thực thi trong ngữ cảnh danh sách, nó trả về một danh sách o f phù hợp với chất nền. Vì vậy, một cách khác để thực hiện việc này là:
my @ft_matches = $str =~ m/[FT]/g;
my $ft_count = @ft_matches; # count elements of array
Nhưng đó vẫn là hai dòng. Một mẹo lừa đảo khác có thể làm cho nó ngắn hơn:
my $ft_count =() = $str =~ m/[FT]/g;
"() =" buộc "m" nằm trong ngữ cảnh danh sách. Việc gán một danh sách với các phần tử N vào một danh sách các biến số không thực sự làm bất cứ điều gì. Nhưng sau đó khi biểu thức gán này được sử dụng trong ngữ cảnh vô hướng ($ ft_count = ...), toán tử "=" trả về số phần tử từ bên phải - chính xác những gì bạn muốn. Điều này là cực kỳ kỳ lạ khi lần đầu tiên gặp phải, nhưng "=() =" thành ngữ là một thủ thuật Perl hữu ích để biết, cho "đánh giá trong bối cảnh danh sách, sau đó nhận được kích thước của danh sách".
Lưu ý: Tôi không có dữ liệu nào trong số này hiệu quả hơn khi xử lý các chuỗi lớn. Trong thực tế, tôi nghi ngờ mã ban đầu của bạn có thể là tốt nhất trong trường hợp đó.
điều này sẽ là 'my $ ft_count = $ str = ~ tr/FT/FT /;', nếu không nó sẽ xóa các ký tự khỏi '$ str' – Hasturkun
ok, bỏ qua điều đó. bạn vẫn có thể loại bỏ các dấu ngoặc, mặc dù. – Hasturkun
Nó tính các dấu ngoặc vuông. Phải là 'tr/FT // ' – Toto