में XML :: Twig का उपयोग कर भ्रष्टाचार और गैर-मुद्रित वर्णों को स्ट्रिंग करना यह वास्तव में अजीब समस्या है। यह मुझे व्यावहारिक रूप से पूरे दिन ले जाता है ताकि इसे एक छोटी निष्पादन योग्य लिपि में घुमाया जा सके जो पूरी तरह से समस्या का प्रदर्शन करता है।Win32 पर्ल
समस्या का सारांश: मैं XML::Twig उपयोग कर रहा हूँ एक XML फ़ाइल से एक डेटा टुकड़ा खींचने के लिए, तो मैं चिपका रहा है कि डेटा डेटा का एक और टुकड़ा के बीच में स्निपेट के यह माता पिता डेटा फोन करते हैं। जब मैं शुरू करता हूं तो अभिभावक डेटा में इसकी शुरुआत में यह अजीब गैर-प्रिंट करने योग्य चरित्र होता है। यह विक्रेता डेटा प्रदान करता है, इसलिए मैं इसे नियंत्रित नहीं कर सकता। मेरी समस्या यह है कि जब मैं मूल डेटा के मध्य में डेटा स्निपेट चिपकता हूं, तो अंतिम उत्पाद में नया मूल रूप से शुरू होने वाले इसके अलावा इसकी शुरुआत में गैर-प्रिंट करने योग्य वर्ण होता है। यह नया गैर-प्रिंट करने योग्य चरित्र माता-पिता डेटा में नहीं था और न ही बाल डेटा स्निपेट में था। मुझे नहीं पता कि यह कहां से आ रहा है और न ही यह मेरे डेटा में कैसे हो रहा है।
मुझे संदेह है कि यह एक एक्सएमएल :: ट्विग बग है क्योंकि स्ट्रिंग भ्रष्टाचार थोड़ी देर में फ़ाइलहेडल से एक लाइन पढ़ने के दौरान होता है, लेकिन जब मैं एक्सएमएल को हटाता हूं तो मैं अपनी समस्या को पुनर्जीवित करने में असफल रहा हूं: : मेरी स्क्रिप्ट में ट्विग कोड इसलिए मुझे इसे छोड़ना पड़ा।
यह स्ट्रिंग्स में गैर-प्रिंट करने योग्य वर्णों के साथ मेरा पहला अनुभव है जिसे मैं संसाधित करने की कोशिश कर रहा हूं। क्या मुझे साधारण तारों या कुछ की तरह व्यवहार करने के बजाय कुछ खास करने की ज़रूरत है?
मैं एक्टिवस्टेट पर्ल 5.10.1 और एक्सएमएल :: ट्विग 3.32 (नवीनतम) और विंडोज एक्सपी पर ग्रहण 3.5.1 आईडीई का उपयोग कर रहा हूं।
ERROR: What happened?
ORIGINAL:
¿(*********************************************
Data-File-Header-Junk
**********************************************)
PROGRAM MainProgram()
END_PROGRAM
TASK SecondaryTask()
END_TASK
TASK MainTask()
MainProgram;
END_TASK
MODIFIED:
¿(*********************************************
Data-File-Header-Junk
**********************************************)
PROGRAM KurtsProgram()
END_PROGRAM
PROGRAM MainProgram()
END_PROGRAM
TASK SecondaryTask()
END_TASK
TASK MainTask()
MainProgram;
KurtsProgram;
END_TASK
आप अतिरिक्त चरित्र है कि में जोड़ा गया था देख सकते हैं:
use strict;
use warnings;
use XML::Twig;
my $FALSE = 0;
my $TRUE = 1;
my $name = 'KurtsProgram';
my $task = 'MainTask';
my $hidden_char = "\xBF";
my $data = $hidden_char .
'(*********************************************
Data-File-Header-Junk
**********************************************)
PROGRAM MainProgram()
END_PROGRAM
TASK SecondaryTask()
END_TASK
TASK MainTask()
MainProgram;
END_TASK
';
my $new_data = insertProgram($name, $task, $data);
# test to see if results start out as expected
if ($new_data =~ m/^\Q$hidden_char\E/) {
print "SUCCESS\n";
}
else {
print STDERR "ERROR: What happened?\n";
print STDERR "ORIGINAL: \n$data\n";
print STDERR "MODIFIED: \n$new_data\n";
}
sub insertProgram {
my ($local_name, $local_task, $local_data) = @_;
# get program section from XML template
my $twig = new XML::Twig;
$twig->parse('<?xml version="1.0"?>
<TemplateSet>
<PROGRAM>PROGRAM <Name>ProgramNameGoesHere</Name>()
END_PROGRAM</PROGRAM>
<TASK>TASK <Name>TaskNameGoesHere</Name>()
END_TASK</TASK>
</TemplateSet>
');
my $program = $twig->root->first_child('PROGRAM');
# replace program name in XML template
$program->first_child('Name')->set_text($local_name);
my $insert = $program->text();
# stick modified program into data
if ($local_data =~ s/(\s+PROGRAM\s+[^\s]+\s+\()/\n\n $insert $1/) {
# found it and inserted new program
}
else {
# not found
return;
}
# add program name to task list
my $added_program_to_task = $FALSE;
my $found_start = $FALSE;
my $found_end = $FALSE;
my $new_data = "";
# open string as a filehandle for line by line processing
my $filehandle;
open($filehandle, '<', \$local_data)
or die("Can't open string as a filehandle: $!");
while (defined (my $line = <$filehandle>)) {
# look for start of our task
if (
(!$found_start) &&
($line =~ m/\s+TASK\s+\Q$local_task\E\s+\(/)
) {
# found the task!
$found_start = $TRUE;
}
# look for end of our task
if (
($found_start) && (!$found_end) &&
($line =~ m/\s+END_TASK/)
)
{
# found the end tag for the task section!
$found_end = $TRUE;
# add the program name to the bottom of the list
$line = " " . $local_name . ";\n" . $line;
$added_program_to_task = $TRUE;
}
# compile new data from processed line or original line
$new_data = $new_data . $line;
}
close($filehandle);
if ($added_program_to_task) {
# success
}
else {
# unable to find task
return;
}
return $new_data;
}
जब मैं इस स्क्रिप्ट को चलाने, मैं निम्नलिखित उत्पादन प्राप्त करें:
यहाँ एक स्क्रिप्ट है कि समस्या को दर्शाता है है संशोधित एम के तहत सीधे डेटा के सामने।
डेटा एक विक्रेता के आवेदन में वापस जा रहा है, इसलिए डेटा के सामने विशेष गैर-प्रिंट करने योग्य चरित्र मूल रूप से बिल्कुल सही रहने की आवश्यकता है। –
उस स्थिति में 'keep_encoding' को नौकरी करना चाहिए। – mercator