निम्नलिखित कोड क्यों चेतावनी देता है? $ मैच को ब्लॉक के दौरान स्कॉप्ड किया गया है और ब्लॉक के दौरान युक्त नहीं है।मुझे if/elsif पेड़ में एक ही स्कोप चेतावनी में डुप्लिकेट घोषणा क्यों मिलती है?
use strict;
use warnings;
use 5.012;
use IO::All;
my $file = io($ARGV[0])->tie;
my $regex = qr//;
while (my $line = <$file>) {
if (my ($match) = $line =~ $regex) {
...
}
elsif (my ($match) = $line =~ $regex) {
...
}
say $match;
}
C:\>perl testwarn.pl test.log
"my" variable $match masks earlier declaration in same scope at testwarn.pl line 15.
Global symbol "$match" requires explicit package name at testwarn.pl line 18.
Execution of testwarn.pl aborted due to compilation errors.
जैसी उम्मीद थी, यह शिकायत है कि $ मैच लाइन 18 पर परिभाषित नहीं है, लेकिन यह भी अगर ब्लॉकों में $ मैच की पुन: घोषणा के बारे में शिकायत। संस्करण थोड़ा पुराना है लेकिन बहुत गंभीर नहीं है; और यह हाल ही में स्ट्राबेरी संस्करण है:
This is perl 5, version 12, subversion 3 (v5.12.3) built for MSWin32-x86-multi-thread
ब्लॉक से पहले आप अपने $ मिलान चर को परिभाषित क्यों नहीं कर सकते? –
क्योंकि मैं चाहता हूं कि यह ब्लॉक के लिए स्कॉप्ड हो, न कि ब्लॉक के लिए। यह एक साथ शिकायत कर रहा है कि मैं इसे (अगर) में फिर से परिभाषित कर रहा हूं जो बताता है कि यह समय {} ब्लॉक को परिभाषित किया गया है; जबकि मैं शिकायत करता हूं कि अगर मैं इसे बाद में ब्लॉक में उपयोग करने का प्रयास करता हूं। बस यह सुनिश्चित करने की कोशिश कर रहा हूं कि मैं आंतरिक रूप से आंतरिक समझता हूं। – Oesor