2011-12-20 9 views
6

Perl docs khuyên này:perl s/này/đó/r ==> "bareword tìm thấy nơi khai thác dự kiến"

$foo = $bar =~ s/this/that/r; 

Tuy nhiên, tôi nhận được lỗi này:

Bareword found where operator expected near 
    "s/this/that/r" (#1) 

Đây là đặc trưng cho sửa đổi r mà không có mã hoạt động. Tuy nhiên, tôi không muốn sửa đổi $bar. tôi có thể, tất nhiên, thay

my $foo = $bar =~ s/this/that/r; 

với

my $foo = $bar; 
$foo =~ s/this/that/; 

Có một giải pháp tốt hơn?

+2

Điều này có đang chạy trên Perl 5.14 ...? (Hãy chắc chắn rằng bạn có một 'yêu cầu v5.14;' trong tiêu đề của bạn ...) – BRFennPocock

+0

Chỉnh sửa: dường như 'sử dụng v5.13.2' là mức tối thiểu cho' s /// r'. – BRFennPocock

+3

Chúng ta đã học được gì ở đây? Chúng tôi đã học được rằng chúng ta nên đọc các tài liệu * đi kèm với * ra phân phối perl thay vì đọc tài liệu từ "một nơi nào đó trên web". :-) – tadmc

Trả lời

17

Như ruakh đã viết, /r là mới trong perl 5.14. Tuy nhiên, bạn có thể thực hiện việc này trong các phiên bản trước của perl:

(my $foo = $bar) =~ s/this/that/; 
2

Không có giải pháp tốt hơn, không có (mặc dù tôi thường viết nó trên cùng một dòng, kể từ khi s/// được về cơ bản phục vụ như là một phần của quá trình khởi tạo:

my $foo = $bar; $foo =~ s/this/that/; 

). Nhân tiện, lý do cho thông báo lỗi của bạn gần như chắc chắn là bạn đang chạy phiên bản Perl không hỗ trợ cờ /r. Lá cờ đó đã được thêm khá gần đây, trong Perl 5.14. Bạn có thể thấy dễ dàng hơn để phát triển bằng cách sử dụng tài liệu cho phiên bản của riêng bạn; ví dụ: http://perldoc.perl.org/5.12.4/perlop.html nếu bạn đang sử dụng Perl 5.12.4.