Tôi biết rằng trong một subroutine trong Perl, nó là một ý tưởng rất tốt để giữ gìn "biến mặc định" $_
với local
trước khi làm bất cứ điều gì với nó, trong trường hợp người gọi đang sử dụng nó, ví dụ:
sub f() {
local $_; # Ensure $_ is restored on dynamic scope exit
while (<$somefile>) { # Clobbers $_, but that's OK -- it will be restored
...
}
}
Bây giờ , thường là lý do bạn sử dụng $_
ở nơi đầu tiên là vì bạn muốn sử dụng regexes, có thể đưa kết quả vào các biến "ma thuật" tiện dụng như $1
, $2
v.v. Tôi cũng muốn giữ các biến đó, nhưng tôi đã Tôi có thể tìm cách để làm điều đó.
Tất cả perlvar nói là @+
và @-
, mà $1
, vv dường như phụ thuộc vào nội bộ, tham khảo phần "submatches thành công cuối cùng trong phạm vi năng động đang hoạt động". Nhưng ngay cả điều đó cũng có vẻ mâu thuẫn với các thí nghiệm của tôi. Theo kinh nghiệm, các bản in mã sau "aXaa" như tôi đã hy vọng:
$_ = 'a';
/(.)/; # Sets $1 to 'a'
print $1; # Prints 'a'
{
local $_; # Preserve $_
$_ = 'X';
/(.)/; # Sets $1 to 'X'
print $1; # Prints 'X'
}
print $_; # Prints 'a' ('local' restored the earlier value of $_)
print $1; # Prints 'a', suggesting localising $_ does localise $1 etc. too
Nhưng những gì tôi tìm thấy thực sự đáng ngạc nhiên là, trong ActivePerl tôi 5.10.0 ít nhất, ý kiến ra dòng local
vẫn giữ $1
- - đó là, câu trả lời "aXXa" được tạo ra! Dường như phạm vi từ vựng (không động) của khối ngoặc nhọn bằng cách nào đó giữ nguyên giá trị của $1
.
Vì vậy, tôi thấy tình huống này khó hiểu nhất và rất thích nghe lời giải thích cuối cùng. Tâm trí bạn, tôi muốn thực sự giải quyết một cách chống đạn để bảo vệ tất cả biến kỳ diệu regex liên quan đến mà không cần phải liệt kê tất cả chúng như trong:
local @+, @-, $&, $1, $2, $3, $4, ...
đó rõ ràng là một hack kinh tởm. Cho đến lúc đó, tôi sẽ lo lắng rằng bất kỳ regex nào mà tôi chạm vào đều sẽ làm một cái gì đó mà người gọi không mong đợi bị che khuất.
Cảm ơn!
@pilcrow: tôi không bắt câu trả lời của bạn, nhưng thấy nó trong một email tóm tắt SO gửi cho tôi - tôi đoán bạn đã xóa nó? Dù sao, tôi nghĩ đó là một câu trả lời hữu ích, và nếu bạn tình cờ đọc điều này: Tôi đang tìm kiếm loại bảo quản thứ nhất. Thứ 2 thực sự là những gì tôi hy vọng sẽ * không * xảy ra - điều đó sẽ làm cho những thứ "nên" cục bộ "chảy máu" vào các phạm vi khác, và vâng, nếu tôi muốn loại "bảo quản", tôi chỉ cần sao chép $ 1 vv vào các biến địa phương khác như bạn đã đề xuất. –