दो अलग हैश एक सूची में संदर्भित अंदर एक precompiled regex लाना:पर्ल सूचियों के अंदर संदर्भ क्यों संकलित किए गए हैं?
my @list =();
my $regex = qr/ABC/;
push @list, { 'one' => $regex };
push @list, { 'two' => $regex };
use Data::Dumper;
print Dumper(\@list);
मैं उम्मीद थी:
$VAR1 = [
{
'one' => qr/(?-xism:ABC)/
},
{
'two' => qr/(?-xism:ABC)/
}
];
लेकिन बजाय हम एक परिपत्र संदर्भ मिलता है:
$VAR1 = [
{
'one' => qr/(?-xism:ABC)/
},
{
'two' => $VAR1->[0]{'one'}
}
];
यह अनिश्चित काल तक नेस्टेड हैश संदर्भों के साथ होगा और उथल-पुथल $regex
की प्रतिलिपि बनाई जाएगी।
मुझे लगता है कि मूल कारण यह है कि प्रीकंपिल्ड रेगेक्स वास्तव में संदर्भ हैं, और उसी सूची संरचना के अंदर संदर्भ एक अनुकूलन के रूप में संकलित किए जाते हैं (\ $ स्केलर वैसे ही व्यवहार करता है)। मैं पूरी तरह से ऐसा करने की उपयोगिता को पूरी तरह से नहीं देखता (संभवतः किसी संदर्भ के संदर्भ में एक ही स्मृति पदचिह्न है), लेकिन हो सकता है कि आंतरिक प्रतिनिधित्व
पर आधारित कोई कारण है, क्या यह सही व्यवहार है? क्या मैं इसे होने से रोक सकता हूं? शायद जीसी को और अधिक कठिन बनाने के अलावा, इन परिपत्र संरचनाएं गंभीर गंभीर सिरदर्द बनाती हैं। उदाहरण के लिए, कभी-कभी एक ही नियमित अभिव्यक्ति वाले प्रश्नों की सूची में पुनरावृत्ति करने से मोंगोडीबी चालक को एक बुरा सीगफॉल्ट (https://rt.cpan.org/Public/Bug/Display.html?id=58500 देखें)
यह परिपत्र कैसा है? – Ether
qr/$ regex/एक नया बना देगा, जैसा कि Storable :: dclone होगा। – ysth
ईथर: मैं डेटा :: डम्पर आउटपुट की गलत व्याख्या कर रहा था क्योंकि समानांतर (और वास्तविक) परिपत्र संदर्भ त्रुटि आई थी, उपरोक्त सीपीएन थ्रेड –