2012-02-07 7 views
8

निम्न स्क्रिप्ट स्मार्ट मैचों दो सरणी के स्लाइस। शुरुआत में, दोनों सरणी समान हैं और मुझे उचित परिणाम मिल रहे हैं। फिर मैं एक नए सरणी को बदलता हूं और दो नए स्लाइसों को स्मार्ट-मेल करता हूं, लेकिन यह अभी भी कहता है कि स्लाइस समान हैं। हालांकि, जब मैं सरणी को सरणी में कॉपी करता हूं, तो सरणी से मेल खाने वाले स्मार्ट दिखाते हैं कि वे वास्तव में अलग हैं।सरणी स्लाइस की तुलना करते समय स्मार्टमैच सही क्यों होता है जो अलग होना चाहिए?

स्क्रिप्ट:

#!/usr/bin/perl 
use warnings; 
use strict; 
use diagnostics; 

my @x = qw (one two); 
my @y = qw (one two); 
my @x_s; 
my @y_s; 

print "Before change: values are the same:\n"; 
@x_s = @x[0,1]; 
@y_s = @y[0,1]; 
print "\@x_s: @x_s\n"; 
print +(@x[0,1] ~~ @y[0,1]) ? "equal\n" : "not equal\n"; 
print +(@x_s ~~ @y_s) ? "equal\n" : "not equal\n"; 

$x[0]='three'; 

print "After change: values should be different:\n"; 
@x_s = @x[0,1]; 
@y_s = @y[0,1]; 
print "\@x_s: @x_s\n"; 
print +(@x[0,1] ~~ @y[0,1]) ? "equal\n" : "not equal\n"; 
print +(@x_s ~~ @y_s) ? "equal\n" : "not equal\n"; 

उत्पादन:

Before change: values are the same: 
@x_s: one two 
equal 
equal 
After change: values should be different: 
@x_s: three two 
equal 
not equal 

मैं पर्ल 5.10.1 का उपयोग कर रहा है, और यह दोनों सरणी स्लाइस और हैश स्लाइस के लिए होता है। ऐसा क्यों होता है?

+1

पर्ल का कौन सा संस्करण आप उपयोग कर रहे हैं? 'V5.14.2' के साथ मुझे' बराबर', 'बराबर' और 'बराबर नहीं' मिलता है, 'बराबर नहीं'। – flesk

उत्तर

5

स्मार्ट मिलान स्लाइस के साथ अदिश संदर्भ में काम करता है की तरह लग रहा।

निम्नलिखित कोड टुकड़े पर विचार करें:

आपका मामला:

#!/usr/bin/perl 

my @foo = (1,2); 
my @bar = (3,4); 
print @foo[1,2] ~~ @bar[1,2] ? "Equal\n" : "Not equal\n"; 

कि शायद तुम क्या जरूरत है:

#!/usr/bin/perl 

my @foo = (1,2); 
my @bar = (3,4); 
print [ @foo[1,2] ] ~~ [ @bar[1,2] ] ? "Equal\n" : "Not equal\n"; 
+0

यही है! अब यह काम करता है जैसा मैं चाहता था। धन्यवाद! – askucins

3

स्मार्ट मैच ऑपरेटर ~~ सूचियों के लिए नहीं, सरणी के लिए जादू करता है। एक सरणी टुकड़ा एक सूची है, एक सरणी नहीं है।

अद्यतन:

आप, बस कोष्ठक में अपने स्लाइस बंद करके इसे हल कर सकते क्योंकि स्मार्ट मैच स्वचालित रूप से dereferences:

print +([@x[0,1]] ~~ [@y[0,1]]) ? "equal\n" : "not equal\n"; 
+0

"एक सरणी टुकड़ा एक सूची है, एक सरणी नहीं है।" - क्या?! – JackTheRandom

+0

@ जैकथ्रैंडम: https://www.socialtext.net/perl5/array_vs_list – choroba

0

मूल रूप से askucins

मैं एक भागा तैनात कुई उस टेस्ट बनाम पर्ल संस्करण के विभिन्न व्यवहार से संबंधित पर्ल डॉक्स में सीके क्वेरी और मैंने पाया कि यह पर्ल 5.13.5 में तय किया गया था। perl5135delta में "सरणी स्लाइस के खिलाफ स्मार्ट मिलान" देखें:

इससे पहले, निम्नलिखित कोड एक सफल मैच में हुई:

my @a = qw(a y0 z); 
my @b = qw(a x0 z); 
@a[0 .. $#b] ~~ @b; 

यह अजीब व्यवहार अब तय किया गया है [perl #77468]।

संबंधित मुद्दे

 संबंधित मुद्दे