Dường như bạn có quan niệm sai về cách hoạt động của =~
. =~
là toán tử liên kết liên kết biến với toán tử regexp. Nó không thực hiện bất kỳ nhiệm vụ nào.
Tất cả các toán tử regexp đều hoạt động theo mặc định với biến chủ đề $_
, vì vậy s/foo/bar/;
giống với $_ =~ s/foo/bar/;
. Không có chuyển nhượng nào xảy ra. Biến chủ đề được chuyển đổi.
Trường hợp tương tự khi hoạt động trên bất kỳ biến nào khác. $var =~ s/foo/bar/;
chuyển đổi $var
bằng cách thay thế phiên bản đầu tiên của foo
bằng bar
. Không có chuyển nhượng nào xảy ra.
Lời khuyên tốt nhất tôi có thể cung cấp cho bạn là viết Python bằng Python và Perl trong Perl. Đừng mong đợi hai ngôn ngữ sẽ giống nhau.
Bạn có thể làm như DVK gợi ý và viết một chương trình con sẽ tái tạo hành vi thay thế mà bạn quen.
Hoặc bạn có thể thử một số thành ngữ Perl.Dựa trên mong muốn thể hiện của bạn để áp dụng nhiều phép biến đổi trong một dòng, tôi đã cung cấp một vài ví dụ bạn có thể thấy hữu ích.
Ở đây tôi sử dụng một vòng lặp for
hơn một mục để topicalize $var
và áp dụng nhiều biến đổi mã hóa cứng:
for($var) {
s/foo/bar/;
s/fizz/buzz/;
s/whop/bop-a-loo-bop/;
s/parkay/butter/;
s/cow/burger/;
}
Hoặc có thể bạn cần phải áp dụng một nhóm biến của biến đổi. Tôi định nghĩa một chương trình con để lặp qua một danh sách các tham chiếu mảng xác định các cặp chuyển đổi cũ/mới. Ví dụ này tận dụng lợi thế của xử lý đối số định hướng danh sách của Perl để xử lý bất kỳ số lần chuyển đổi nào.
my $foo = transform(
'abcd' =>
[ 'a', 'b' ],
[ 'bb', 'c' ],
[ 'cc', 'd' ],
[ 'dd', 'DONE' ],
);
sub transform {
my $var = shift;
for (@_) {
my ($old, $new) = @$_;
$var =~ s/$old/$new/;
}
return $var;
}
Cuối cùng một chút rối tung lên để cung cấp một phiên bản của chuyển đổi mà sửa đổi đối số đầu tiên của nó:
my $foo = 'abcd';
transform_in_place(
$foo =>
[ 'a', 'b' ],
[ 'bb', 'c' ],
[ 'cc', 'd' ],
[ 'dd', 'DONE' ],
);
print "$foo\n";
sub transform_in_place {
for my $i (1..$#_) {
my ($old, $new) = @{$_[$i]};
$_[0] =~ s/$old/$new/;
}
}
Đối với dự án riêng của tôi, tôi có thể muốn sử dụng một trong hai tùy chọn đầu tiên tùy thuộc vào nhu cầu của vấn đề cụ thể.
dụ của bạn sẽ đặt cả '$ oldstring 'và' $ newstring' vào văn bản đã sửa đổi. Bạn có ý định thực hiện nhiệm vụ trước khi thay thế và sau đó thực hiện thay thế trên '$ newstring'? – mob