Tôi nhận được một băm băm từ một hàm khác và một số phần tử của băm băm có thể là một băm khác. Làm thế nào tôi có thể kiểm tra để xem nếu một cái gì đó là một băm?Làm thế nào tôi có thể kiểm tra rằng "cái gì" là một băm trong Perl?
Trả lời
Tùy thuộc vào những gì bạn muốn, bạn sẽ cần phải sử dụng ref
hoặc reftype
(mà là ở Scalar::Util
, một mô-đun lõi). Nếu tham chiếu là một đối tượng, ref
sẽ trả về lớp của đối tượng thay vì loại tham chiếu cơ bản, reftype
sẽ luôn trả về kiểu tham chiếu cơ bản.
if (ref $var eq ref {}) {
print "$var is a hash\n";
}
use Scalar::Util qw/reftype/;
if (reftype $var eq reftype {}) {
print "$var is a hash\n";
}
@brian d foy Bạn có quen với từ "tf" không? Nó giống như "nếu", nhưng nhiều hơn thế. –
Vì vậy, một phiên bản mạnh mẽ hơn nếu? Có phiên bản yếu hơn không? –
@brain d foy Có, có "ɨf". –
Sử dụng ref
chức năng:
ref($hash_ref) eq 'HASH' ## $hash_ref is reference to hash
ref($array_ref) eq 'ARRAY' ## $array_ref is reference to array
ref($hash{$key}) eq 'HASH' ## there is reference to hash in $hash{$key}
Thử nghiệm này không hoạt động đối với các đối tượng giống như băm: '$ r = {}; ban phước $ r," không thành công "; in ref $ r' – mob
Tôi không nghĩ vi phạm đóng gói đối tượng là một ý tưởng tốt. –
Ngoài ra còn có một số tích cực sai ở đây. '$ array = []; ban phước cho mảng $, 'HASH'; print ref $ array; 'in' HASH'. Không phải là bạn nên làm điều này. –
use Params::Util qw<_HASH _HASH0 _HASHLIKE>;
# for an unblessed hash with data
print "$ref is a hash\n" if _HASH($ref);
# for an unblessed hash empty or not
print "$ref is a hash\n" if _HASH0($ref);
# for a blessed hash OR some object that responds as a hash*
print "$ref is hashlike\n" if _HASHLIKE($ref);
* qua overload
Bạn có lẽ không cần người cuối cùng, mặc dù.
thấy Params::Util
'Params :: Util :: _ HASHLIKE' gọi' Scalar :: Util :: reftype', nhưng nó cũng kiểm tra xem đối số của nó có đang quá tải toán tử băm - dereferencing hay không. phát hiện các đối tượng có thể giả vờ là hashrefs ngay cả khi chúng không thực sự là hashrefs. – mob
@mobrule: Vâng, tôi biết. Tôi chỉ nghĩ rằng trình bày hai lựa chọn sẽ đưa anh ta đến liên kết để xem sự khác biệt. Tôi đã thêm một ghi chú nói rằng có lẽ anh ấy không cần nó. – Axeman
Tôi luôn sử dụng isa
, nhưng nếu điều đang được thử nghiệm không phải là một đối tượng (hoặc có thể không phải là một đối tượng), bạn cần phải gọi nó như chức năng UNIVERSAL::isa
:
if (UNIVERSAL::isa($var, 'HASH')) { ... }
- 1. Rails: làm thế nào để tôi xác nhận rằng một cái gì đó là một boolean?
- 2. Làm cách nào tôi có thể hợp nhất nhiều băm thành một băm trong Perl?
- 3. Làm thế nào tôi có thể tìm thấy số lượng khóa trong một băm trong Perl?
- 4. cách kiểm tra xem hàm băm có rỗng trong perl
- 5. Trong Perl, làm thế nào tôi có thể gọi một phương thức có tên tôi có trong một chuỗi?
- 6. Làm thế nào tôi có thể tìm các chữ cái lặp lại với một regex Perl?
- 7. Android: Làm thế nào tôi có thể kiểm tra một mục cụ thể trong một ListView được kiểm tra?
- 8. Cách tốt nhất để sao chép sâu một băm băm trong Perl là gì?
- 9. Làm thế nào tôi có thể kiểm tra xem một mảng là null/empty?
- 10. AppleScript: Làm thế nào để kiểm tra xem một cái gì đó là một thư mục hoặc một tập tin
- 11. Kiểm tra xem một cái gì đó có phải là một lớp trong javascript
- 12. Làm thế nào tôi có thể sử dụng băm làm đối số cho các chương trình con trong Perl?
- 13. Làm thế nào để xóa một băm Perl
- 14. Trong Perl, làm thế nào tôi có thể đảm bảo rằng một chuỗi tương ứng với một ngày hợp lệ?
- 15. Làm thế nào tôi có thể khẳng định rằng một phương pháp cụ thể được gọi là sử dụng NUnit?
- 16. Cho rằng một đối tượng là một mảng của bất kỳ loại nào làm thế nào để bạn kiểm tra rằng nó có sản phẩm nào trong Java?
- 17. Làm cách nào tôi có thể xem liệu một băm Perl đã có một khóa nhất định?
- 18. làm thế nào tôi có thể kiểm tra nếu một đối tượng tồn tại trong C++
- 19. Làm thế nào để kiểm tra trong Javascript rằng một chuỗi chứa các ký tự chữ cái
- 20. Trong cmake, làm thế nào tôi có thể kiểm tra nếu trình biên dịch là Clang?
- 21. Robolectric: Làm thế nào tôi có thể kiểm tra một hoạt động có chứa một SherlockFragment?
- 22. Làm thế nào tôi có thể kiểm tra xem một int là một HttpStatusCode legit trong .NET?
- 23. Làm cách nào tôi có thể tham chiếu đến giá trị băm cụ thể trong Perl?
- 24. Làm thế nào tôi có thể kiểm tra xem một đôi có một phần phân đoạn?
- 25. Làm cách nào để kiểm tra xem chuỗi Perl có chứa chữ cái không?
- 26. Lọc một băm băm trong perl
- 27. Làm thế nào tôi có thể chuyển một băm bằng cách sử dụng máy khách và máy chủ trong Perl?
- 28. Làm thế nào để bạn kiểm tra hàm băm params trong bài kiểm tra Rails?
- 29. Làm thế nào tôi có thể bọc một chuỗi trong Perl?
- 30. Làm cách nào để kiểm tra xem khóa có tồn tại trong một hàm băm Perl sâu?
bản sao có thể có của [Làm cách nào để biết loại giá trị nào nằm trong biến Perl?] (Http://stackoverflow.com/questions/1731333/how-do-i-tell-what-type-of-value -is-in-a-perl-biến) – Ether