Breaking dòng xuống này bằng đường vì nó đã không được:
sub trim {
@_ = $_ if not @_ and defined wantarray;
# if there are no arguments, but a return value is requested
# then place a copy of $_ into @_ to work on
@_ = @_ if defined wantarray;
# if the caller expects a return value, copy the values in @_ into itself
# (this breaks the aliasing to the caller's variables)
for (@_ ? @_ : $_) { s/^\s+//, s/\s+$// }
# perform the substitution, in place, on either @_ or $_ depending on
# if arguments were passed to the function
return wantarray ? @_ : $_[0] if defined wantarray;
# if called in list context, return @_, otherwise $_[0]
}
Tôi đồng ý rằng mã được một chút tẻ nhạt với tất cả các wantarray
séc, nhưng kết quả là một chức năng mà chia sẻ một mức độ linh hoạt với các hàm dựng sẵn của Perl. Kết quả thực hiện chức năng "thông minh" là dọn dẹp trang web cuộc gọi (tránh các cấu trúc vòng lặp, biến tạm thời, lặp lại, ...) tùy theo tần suất mà hàm được sử dụng có thể cải thiện khả năng đọc mã một cách có ý nghĩa.
Chức năng có thể được đơn giản hóa một chút:
sub trim {
@_ = @_ ? @_ : $_ if defined wantarray;
s/^\s+//, s/\s+$// for @_ ? @_ : $_;
wantarray ? @_ : shift
}
Hai dòng đầu tiên có thể được cuộn thành một, vì họ đang làm điều tương tự (gán để @_
) chỉ với giá trị nguồn khác nhau. Và không cần kiểm tra bên ngoài return ... if defined wantarray
ở cuối, vì trả về một giá trị trong ngữ cảnh void không làm bất cứ điều gì.
Nhưng tôi có thể thay đổi dòng cuối cùng thành wantarray ? @_ : pop
vì điều đó làm cho nó hoạt động giống như một danh sách (phần tử cuối cùng trong ngữ cảnh vô hướng).
Khi tất cả được nói và làm, điều này cho phép phong cách gọi sau đây sẽ được sử dụng:
my @test_array = ('string1', ' string2', 'string3 ', ' string4 ');
my @result = trim @test_array;
my $result = trim $test_array[0];
trim @test_array; # in place trim
và thậm chí vẫn hỗ trợ vòng lặp chỗ gọi:
my @result = map trim, @test_array;
hoặc một cách chi tiết hơn như:
my @result = map trim($_), @test_array;
và nó có thể được sử dụng trong vòng lặp tương tự như chomp
while (<$file_handle>) {
trim;
# do something
}
Ý kiến về sự lúng túng trong Perl được trộn lẫn. Cá nhân tôi thích nó khi chức năng cho tôi sự linh hoạt để mã người gọi theo cách có ý nghĩa, thay vì làm việc xung quanh giao diện cứng nhắc của một chức năng.
tại sao bạn muốn để bản đồ cho người dùng trong khi bạn có thể tóm tắt bản đồ? –
Liên quan: [trim in Perl] (https://plus.google.com/105725977711317285348/posts/ienzxqHJmRe) – daxim
wantarray và shit phép thuật tương tự là một blight. Đừng lập trình thông minh trừ khi bạn phải làm. API không bao giờ thông minh. – tsee