Làm thế nào để tôi so sánh hai chuỗi trong Perl?
Tôi đang học Perl, tôi đã có câu hỏi cơ bản này khi tìm nó trên StackOverflow và không tìm thấy câu trả lời hay nên tôi nghĩ tôi sẽ hỏi.
Làm thế nào để tôi so sánh hai chuỗi trong Perl?
Tôi đang học Perl, tôi đã có câu hỏi cơ bản này khi tìm nó trên StackOverflow và không tìm thấy câu trả lời hay nên tôi nghĩ tôi sẽ hỏi.
Câu trả lời:
Xem perldoc perlop . Sử dụng lt
, gt
, eq
, ne
, và cmp
khi thích hợp để so sánh chuỗi:
Nhị phân
eq
trả về true nếu đối số bên trái là chuỗi bằng với đối số bên phải.Nhị phân
ne
trả về true nếu đối số bên trái là chuỗi không bằng với đối số bên phải.Nhị phân
cmp
trả về -1, 0 hoặc 1 tùy thuộc vào việc đối số bên trái có theo chuỗi nhỏ hơn, bằng hoặc lớn hơn đối số bên phải hay không.Nhị phân
~~
thực hiện một sự thông minh giữa các đối số của nó. ...
lt
,le
,ge
,gt
Vàcmp
sử dụng đối chiếu (loại) theo thứ tự theo quy định của địa phương hiện tại nếu một miền địa phương sử dụng di sản (nhưng không phảiuse locale ':not_characters'
) có hiệu lực. Xem perllocale . Không trộn lẫn chúng với Unicode, chỉ với mã hóa nhị phân cũ. Các mô-đun Unicode :: Collate và Unicode :: Collate :: Locale tiêu chuẩn cung cấp các giải pháp mạnh mẽ hơn nhiều cho các vấn đề đối chiếu.
index
để xem nếu một chuỗi là một chuỗi con của một chuỗi khác.
!=
và ne
không giống nhau, bởi vì !=
và ne
được định nghĩa là khác nhau. Khó đến thế sao?! Là một toán tử so sánh số, !=
chuyển đổi cả toán hạng của nó thành số perl -E 'say "equal" if not "a" != "b"'
.
cmp
Đối chiếu
'a' cmp 'b' # -1
'b' cmp 'a' # 1
'a' cmp 'a' # 0
eq
Tương đương với
'a' eq 'b' # 0
'b' eq 'a' # 0
'a' eq 'a' # 1
ne
Không bằng
'a' ne 'b' # 1
'b' ne 'a' # 1
'a' ne 'a' # 0
lt
Ít hơn
'a' lt 'b' # 1
'b' lt 'a' # 0
'a' lt 'a' # 0
le
Ít hơn hoặc bằng
'a' le 'b' # 1
'b' le 'a' # 0
'a' le 'a' # 1
gt
Lớn hơn
'a' gt 'b' # 0
'b' gt 'a' # 1
'a' gt 'a' # 0
ge
Lớn hơn hoặc bằng
'a' ge 'b' # 0
'b' ge 'a' # 1
'a' ge 'a' # 1
Xem perldoc perlop
để biết thêm thông tin.
(Tôi đơn giản hóa tất cả một chút nhưng cmp
trả về một giá trị vừa là chuỗi rỗng, vừa là giá trị số 0 thay vì 0
và giá trị là cả chuỗi '1'
và giá trị số 1
. Đây là những giá trị giống nhau bạn sẽ luôn luôn nhận được từ các toán tử boolean trong Perl. Bạn thực sự chỉ nên sử dụng các giá trị trả về cho các phép toán boolean hoặc số, trong trường hợp đó sự khác biệt không thực sự quan trọng.)
eq
, gt
, lt
vv là không đúng ... Họ trở về đúng hoặc sai. Chỉ cmp
trả về các giá trị số cụ thể.
leg
thay vì cmp
được sử dụng để so sánh chung thay thế.
Ngoài việc liệt kê toàn diện các toán tử so sánh chuỗi của Sinan, Perl 5.10 thêm toán tử khớp thông minh.
Toán tử kết hợp thông minh so sánh hai mục dựa trên loại của chúng. Xem biểu đồ bên dưới để biết hành vi 5.10 (Tôi tin rằng hành vi này sẽ thay đổi một chút trong 5.10.1):
perldoc perlsyn
"Kết hợp thông minh chi tiết" :Hành vi của một trận đấu thông minh phụ thuộc vào loại đối số của nó. Nó luôn luôn giao hoán, tức là
$a ~~ $b
hành xử giống như$b ~~ $a
. Hành vi được xác định bởi bảng sau: hàng đầu tiên áp dụng, theo thứ tự, xác định hành vi khớp.
$ a $ b Loại đối sánh Mã phù hợp ngụ ý ====== ===== ===================== ============= (quá tải tất cả mọi thứ) Mã [+] Mã [+] đẳng thức tham chiếu $ a == $ b Bất kỳ Mã [+] vô hướng phụ sự thật $ b -> ($ a) Hash Hash Các khóa băm giống hệt nhau [khóa sắp xếp% $ a] ~ ~ [khóa sắp xếp% $ b] Sự tồn tại của lát băm Hash Array grep {tồn tại $ a -> {$ _}} @ $ b Khóa băm băm Regex grep grep / $ b /, khóa% $ a Hash Bất kỳ tồn tại mục băm nào tồn tại $ a -> {$ b} Mảng mảng là giống hệt nhau [*] Mảng Regex mảng grep grep / $ b /, @ $ a Mảng số Num chứa số grep $ _ == $ b, @ $ a Mảng Bất kỳ mảng nào cũng chứa chuỗi grep $ _ eq $ b, @ $ a Bất kỳ định nghĩa không xác định! Xác định $ a Bất kỳ mẫu Regex nào khớp với $ a = ~ / $ b / Kết quả Code () Code () bằng $ a -> () eq $ b -> () Bất kỳ mã () sự thật đóng đơn giản $ b -> () # bỏ qua $ a Số bằng [!] Số đẳng thức $ a == $ b Bất kỳ chuỗi Str nào bằng $ a eq $ b Bất kỳ số đẳng thức số nào $ a == $ b Bất kỳ chuỗi bằng nào $ a eq $ b + - đây phải là tham chiếu mã có nguyên mẫu (nếu có) không phải là "" (phụ với nguyên mẫu "" được xử lý bằng mục nhập 'Code ()' xuống dưới) * - nghĩa là, mỗi phần tử khớp với phần tử của cùng một chỉ mục trong phần tử khác mảng. Nếu một tham chiếu tròn được tìm thấy, chúng ta sẽ quay trở lại tham chiếu bình đẳng. ! - hoặc là một số thực hoặc một chuỗi trông giống như một sốTất nhiên, "mã phù hợp" không đại diện cho mã phù hợp thực sự: nó chỉ ở đó để giải thích ý nghĩa dự định. Không giống như grep, toán tử kết hợp thông minh sẽ đoản mạch bất cứ khi nào có thể.
Kết hợp tùy chỉnh thông qua quá tải Bạn có thể thay đổi cách đối tượng được khớp bằng cách nạp chồng
~~
toán tử. Điều này hơn hẳn các ngữ nghĩa trận đấu thông minh thông thường. Xemoverload
.
print "Matched!\n" if ($str1 eq $str2)
Perl có các toán tử so sánh chuỗi và so sánh số riêng biệt để giúp gõ phím trong ngôn ngữ. Bạn nên đọc perlop cho tất cả các toán tử khác nhau.
Nội dung rõ ràng của câu hỏi này là:
Tại sao bạn không thể sử dụng
==
để kiểm tra xem hai chuỗi có giống nhau không?
Perl không có kiểu dữ liệu riêng biệt cho văn bản so với số. Cả hai đều được đại diện bởi loại "vô hướng" . Nói cách khác, chuỗi là số nếu bạn sử dụng chúng như vậy .
if ( 4 == "4" ) { print "true"; } else { print "false"; }
true
if ( "4" == "4.0" ) { print "true"; } else { print "false"; }
true
print "3"+4
7
Vì văn bản và số không được phân biệt bởi ngôn ngữ, chúng tôi không thể quá tải ==
toán tử để thực hiện đúng cho cả hai trường hợp. Do đó, Perl cung cấp eq
để so sánh các giá trị dưới dạng văn bản:
if ( "4" eq "4.0" ) { print "true"; } else { print "false"; }
false
if ( "4.0" eq "4.0" ) { print "true"; } else { print "false"; }
true
Nói ngắn gọn:
==
hoặc !=
, để so sánh hai toán hạng dưới dạng sốeq
hoặc ne
, để so sánh hai toán hạng dưới dạng văn bảnCó nhiều hàm và toán tử khác có thể được sử dụng để so sánh các giá trị vô hướng, nhưng biết phân biệt giữa hai dạng này là bước đầu tiên quan trọng.
Và nếu bạn muốn trích xuất sự khác biệt giữa hai chuỗi, bạn có thể sử dụng String :: Diff .