Vâng, chủ yếu là nó không hoạt động như tr///d
không liên quan gì đến yêu cầu của bạn (tr/abc/12/d
thay thế bằng 1, b bằng 2 và loại bỏ c). Ngoài ra, theo các mảng mặc định không nội suy thành các cụm từ thông dụng theo cách hữu ích cho tác vụ của bạn. Ngoài ra, không có thứ gì đó giống như tra cứu băm hoặc cuộc gọi chương trình con hoặc logic khác, bạn không thể đưa ra quyết định ở bên phải của hoạt động s///
.
Để trả lời câu hỏi trong tiêu đề, bạn có thể thực hiện nhiều Thay thế đồng thời - er, liên tiếp thuận tiện - theo cách này:
#! /usr/bin/env perl
use common::sense;
my $sentence = "hello world what a lovely day";
for ($sentence) {
s/what/it's/;
s/lovely/bad/
}
say $sentence;
Để làm được một cái gì đó giống như những gì bạn cố gắng ở đây:
#! /usr/bin/env perl
use common::sense;
my $sentence = "hello world what a lovely day";
my %replace = (
what => "it's",
lovely => 'bad'
);
$sentence =~ s/(@{[join '|', map { quotemeta($_) } keys %replace]})/$replace{$1}/g;
say $sentence;
Nếu bạn sẽ được làm rất nhiều thay thế như vậy, 'biên dịch' regex đầu tiên:
my $matchkey = qr/@{[join '|', map { quotemeta($_) } keys %replace]}/;
...
$sentence =~ s/($matchkey)/$replace{$1}/g;
EDIT:
Và để mở rộng nhận xét của tôi về mảng nội suy, bạn có thể thay đổi $"
:
local $" = '|';
$sentence =~ s/(@{[keys %replace]})/$replace{$1}/g;
# --> $sentence =~ s/(what|lovely)/$replace{$1}/g;
Mà không cải thiện tình hình ở đây, thực sự, mặc dù nó có thể nếu bạn đã có các phím trong một mảng:
local $" = '|';
$sentence =~ s/(@keys)/$replace{$1}/g;
Từ có luôn là toàn bộ từ hoặc có tiềm năng cho mẫu không? – squiguy