Tôi đang sử dụng Perl để chuyển đổi một số XML thành JSON. Nếu thuộc tính XML là một số, tôi không muốn đặt dấu ngoặc kép xung quanh nó để JSON sẽ coi nó là một số và không phải là một chuỗi. Làm thế nào tôi có thể biết nếu một chuỗi Perl là một số (chỉ chứa các số từ 0 đến 9 và có thể là một dấu thập phân)?Trong Perl, làm cách nào tôi có thể biết chuỗi là một số?
Trả lời
Các JSON specification cung cấp quy định khá rõ ràng về định dạng của một số, vì vậy regex sau nên làm việc:
/^-?(0|([1-9][0-9]*))(\.[0-9]+)?([eE][-+]?[0-9]+)?$/
Hãy thử Scalar::Util::looks_like_number
:
Ví dụ:
use Scalar::Util qw(looks_like_number);
if (looks_like_number($thingy)) {
print "looks like $thingy is a number...\n"
}
Tôi nghĩ this câu hỏi từ perlfaq giải quyết vấn đề của bạn.
Thường thì vấn đề là xác định chính xác bạn muốn đọc số nào.
- là số "-1.312" hợp lệ?
- là "inf"?
- 5.34123412E-03?
Bạn chỉ có thể ép nó thành một số sau đó so sánh với chuỗi ban đầu.
if($value eq $value+0){
print "$value is a number\n";
}
(Lưu ý: nó sẽ chỉ làm việc cho số đơn giản, giống như 123 hoặc 12,3)
Có phải "0" giống với "0e0" hoặc "0.0" hoặc "-0" không? Perl thường nghĩ như vậy, nhưng thử nghiệm của bạn tạo ra kết quả ngược lại. – jrockway
Nó có thể được dễ dàng hơn để bạn có thể chỉ cần đọc XML thành một cấu trúc dữ liệu trong Perl và để JSON Perl thư viện hình nó ra cho bạn. Nó đã kiểm tra điều đó, do đó, trừ khi số của bạn thực sự là một chuỗi trong XML (ví dụ: nó có một dấu cách sau nó, vv) JSON->encode()
sẽ mã hóa nó dưới dạng một số JSON.
Tôi nghĩ (từ những trải nghiệm gần đây) rằng bạn đang phạm sai lầm khi thực hiện bất kỳ loại chuyển đổi XML -> thủ công nào. Tôi gặp phải nhiều gotchas trong quá trình này, không ít nhất trong số đó liên quan đến các ký tự thoát không chính xác.
Tôi khuyên bạn nên phân tích cú pháp XML của bạn bằng một trong nhiều mô-đun XML :: * (tôi đã sử dụng XML :: Đơn giản) và sau đó hiển thị nó dưới dạng JSON sử dụng JSON :: XS. JSON :: XS cho phép bạn chuyển đổi cấu trúc dữ liệu Perl thành JSON; XML :: Đơn giản phân tích XML thành cấu trúc dữ liệu Perl. Trong thời gian có nghĩa là bạn có thể thao tác cấu trúc dữ liệu Perl như bạn muốn.
Điểm mấu chốt là bạn không còn quan tâm đến các ký tự trích dẫn/thoát.
Giả sử bạn không cần phải hỗ trợ những thứ khác thường (như khoa học viễn tưởng ký hiệu) này hầu như làm việc (và rất đơn giản):
#!/usr/bin/perl
my $foo = '1234.5';
if($foo =~ /\d+/){
print "$foo is a number\n";
}
Lý do nó không hoàn toàn làm việc là vì bạn có thể có dấu gạch nối và dấu chấm ở bất kỳ đâu (bao nhiêu tùy thích) miễn là bạn có ít nhất một chữ số hiện tại). '--1--2' đánh giá bằng không, và '1.2.3.4.5' evals là 1.2 (dấu chấm thứ hai và mọi thứ sau được bỏ qua). Điều này có thể hoặc không có thể là một vấn đề cho bạn.
- 1. Làm cách nào tôi có thể nội suy thủ công chuỗi thoát trong chuỗi Perl?
- 2. 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?
- 3. Làm thế nào tôi có thể trích dẫn một chuỗi dài trong Perl?
- 4. Làm thế nào tôi có thể trích xuất các chất nền từ một chuỗi trong Perl?
- 5. Làm thế nào tôi có thể đoán mã hóa của một chuỗi trong Perl?
- 6. Trong Perl, tôi có thể coi một chuỗi là một mảng byte không?
- 7. Làm thế nào tôi có thể bọc một chuỗi trong Perl?
- 8. 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?
- 9. Làm thế nào tôi có thể phân bổ trước một chuỗi trong Perl?
- 10. Làm thế nào tôi có thể lặp lại một chuỗi N lần trong Perl?
- 11. Làm thế nào tôi có thể kiểm tra rằng "cái gì" là một băm trong Perl?
- 12. Làm thế nào tôi có thể nhận Getopt của Perl :: Dài để biết liệu đối số có bị thiếu không?
- 13. Tôi làm cách nào để có được số lượng trang trong một tệp PDF trong Perl?
- 14. Làm cách nào để biết tập lệnh Perl của tôi có đang chạy trong Windows không?
- 15. Làm thế nào tôi có thể làm số học 64 bit trong Perl?
- 16. Làm thế nào tôi có thể chuyển đổi một chuỗi 48 hex thành byte bằng Perl?
- 17. Chuỗi dài nhất tôi có thể có là gì?
- 18. Trong R, làm thế nào bạn có thể biết một chuỗi bao gồm các chuỗi thoát?
- 19. Làm cách nào để gzip nén một chuỗi trong Perl
- 20. Làm thế nào tôi có thể lưu trữ ảnh chụp regex trong một mảng trong Perl?
- 21. Trong .net, biết số tuần làm thế nào tôi có thể nhận được ngày trong tuần?
- 22. Làm thế nào tôi có thể gọi một tên hàm được định nghĩa trong một chuỗi ký tự trong perl?
- 23. Perl biết một tệp là nhị phân như thế nào?
- 24. 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?
- 25. 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ệ?
- 26. 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?
- 27. Làm thế nào để biết một biến thể Delphi là một chuỗi rỗng?
- 28. Làm thế nào tôi có thể vẽ đồ thị chuỗi thời gian với Perl?
- 29. Làm thế nào tôi có thể sử dụng số nguyên chiều dài tùy ý trong Perl?
- 30. Tôi có thể thao tác chuỗi ngày giờ Sybase trong Perl như thế nào?
chỉ nhận ra rằng look_like_number trả về giá trị đúng cho 'inf', 'nan', '1E02' và có thể là một vài chuỗi khác mà bạn có thể không mong đợi là số. – mirod
tại sao '1E02' không được mong đợi là một số?đó là ký hiệu khoa học cho 100. –