2009-05-04 16 views
8

मुझे एक टेक्स्ट फ़ाइल (aptest.s) बनाने की आवश्यकता है जिसे मैं किसी अन्य प्रोग्राम में पढ़ने के लिए उपयोग कर सकता हूं। मैं पर्ल का उपयोग कर रहा हूं क्योंकि मेरे पास काम करने के लिए एक बड़ी सूची है। मेरा कोड निम्नानुसार है (जो वांछित आउटपुट नहीं देता है - कोड और वास्तविक आउटपुट के बाद दिखाया गया है)। किसी भी सहायता की सराहना की जाएगी।मैं पर्ल में एक ही समय में एकाधिक सूचियों पर कैसे पुन: प्रयास कर सकता हूं?

#!/usr/bin/perl -w 
chdir("D://projects//SW Model ODME"); 
@link = ("319-116264||319-118664","320-116380||320-116846","321-119118||321-119119","322-115298||322-119087"); 
@link1 = ("116264-319||118664-319","116380-320||116846-320","119118-321||119119-321","115298-322||119087-322"); 
open (FSAS, ">>aptest.s"); 
foreach $link (@link) { 
    foreach $link1 (@link1){ 
    print FSAS "other code \n"; 
    print FSAS "PATHLOAD SELECTLINK=(Link=".$link."), VOL[2]=MW[1] \n"; 
    print FSAS "PATHLOAD SELECTLINK=(Link=".$link1."), VOL[3]=MW[2] \n"; 
    print FSAS "other code \n"; 
} 
} 

वास्तविक उत्पादन:

other output 
PATHLOAD SELECTLINK=(Link=319-116264||319-118664), VOL[2]=MW[1] 
PATHLOAD SELECTLINK=(Link=116264-319||118664-319), VOL[3]=MW[2] 
other output 

other output 
PATHLOAD SELECTLINK=(Link=**319-116264||319-118664**), VOL[2]=MW[1] 
PATHLOAD SELECTLINK=(Link=**116380-320||116846-320**),  VOL[3]=MW[2] 
other output 

वांछित आउटपुट

other output 
PATHLOAD SELECTLINK=(Link=319-116264||319-118664), VOL[2]=MW[1] 
PATHLOAD SELECTLINK=(Link=116264-319||118664-319), VOL[3]=MW[2] 
other output 

other output 
PATHLOAD SELECTLINK=(Link=**320-116380||320-116846**), VOL[2]=MW[1] 
PATHLOAD SELECTLINK=(Link=**116380-320||116846-320**), VOL[3]=MW[2] 
other output 

उत्तर

0

आप अपने कोड और उदाहरण डेटा के आकार को कम कर सकते हैं, जबकि अभी भी त्रुटि के पुनरुत्पादन? मैं तुरंत वास्तविक और अपेक्षित आउटपुट के बीच अंतर नहीं देख सकता।

कभी-कभी, समस्या का कारण बनने वाले कोड और डेटा का एक न्यूनतम सेट समाधान समाधान को स्पष्ट कर देगा।

print FSAS "PATHLOAD PATH=TIME, MW[1]=MI.1.1, SELECTLINK=(Link=".$link."), VOL[2]=MW[1] \n"; 
print FSAS "PATHLOAD PATH=TIME, MW[2]=MI.1.1, SELECTLINK=(Link=".$link1."), VOL[3]=MW[2] \n"; 

आपका बग वहाँ होने की संभावना है:

में थोड़ा और अधिक ध्यान से देख रहे हैं, वहाँ उत्पादन कोड का केवल एक सा है कि चर रहा है है।

+0

आपकी टिप्पणियों और सुझावों के लिए हर किसी के लिए धन्यवाद। मैंने अपना कोड अधिक पठनीय बना दिया है और आपके इनपुट की सराहना की है। – Krishnan

20

List::MoreUtils में each_array देखें:

#!/usr/bin/perl 

use strict; 
use warnings; 

use List::MoreUtils qw(each_array); 

my @x = qw(A B C D E F); 
my @y = (10, 11, 12, 13, 14, 15); 

my $it = each_array(@x, @y); 
while (my ($x, $y) = $it->()) { 
    print "$x = $y\n"; 
} 
__END__ 
+0

हां। शायद यही प्रश्नकर्ता की जरूरत है। –

4

मैं लगता आप चार अलग ब्लॉक बनाने के लिए कोशिश कर रहे हैं, link2 सरणी से इसी तत्व से संबंधित link सरणी से प्रत्येक तत्व के साथ ?

हालांकि आप वास्तव में सोलह ब्लॉक, प्रत्येक संयोजन link और link1 की के लिए एक outputting रहे हैं।

इसके बजाय का प्रयास करें:

foreach $i (0 .. $#link) { 

    $link = $link[$i]; 
    $link1 = $link1[$i]; 

    ... 
} 
2

अपने प्रश्न पढ़ना, यह बताने के लिए क्या तुम सच में जानना चाहता था मुश्किल था। मेरा मानना ​​है कि सीनान यूनूर सही है, और आप दो सरणीओं पर एक साथ फिर से शुरू करना चाहते हैं। जैसा कि वह कहता है, सूची :: MoreUtils बहुत आसान each_array() फ़ंक्शन प्रदान करता है।

इंडेक्स द्वारा एक या अधिक सरणी को फिर से शुरू करना भी आसान है।

आप लूप के लिए सामान्य के साथ उपयोग के लिए इंडेक्स की एक सूची उत्पन्न कर सकते हैं। सरणी में अंतिम मान की अनुक्रमणिका प्राप्त करने के लिए यह $# का उपयोग करता है।

for (0..$#array) { ... } 

या आप अपनी अनुक्रमणिका उत्पन्न करने के लिए लूप के लिए सी-शैली का उपयोग कर सकते हैं। यह इस तथ्य का उपयोग करता है कि स्केलर संदर्भ में मूल्यांकन किया गया एक सरणी तत्वों की संख्या देता है।

for (my $i=0; $i<@array; $i++) { ... } 

यह भी $# का उपयोग कर लिखा जा सकता है:

for (my $i=0; $i<=$#array; $i++) { ... } 

अपने कोड को पढ़ने के बाद, यह स्पष्ट था कि आप Perl's quoting operators से परिचित नहीं हैं। उनका उपयोग करके प्रभावी ढंग से लिखना और पढ़ना आपकी स्क्रिप्ट को अधिक आसान बनाता है।

एक दोस्ताना भावना में, मुझे अपनी स्क्रिप्ट साफ करने की अनुमति दें:

#!/usr/bin/perl 

# Always: 
use strict; 
use warnings; 

#my $TARGET_DIR = 'D://projects//SW Model ODME'; 
my $TARGET_DIR = '.'; 

my $TARGET_FILE = 'aptest.s'; 

# Using qw() makes long lists of 
# literals easier to type and read. 
# Consider finding better names than link and link1. 
# Something that describes the relationship between 
# the two arrays. 
my @link = qw(
    319-116264||319-118664 
    320-116380||320-116846 
    321-119118||321-119119 
    322-115298||322-119087 
); 

my @link1 = qw(
    116264-319||118664-319 
    116380-320||116846-320 
    119118-321||119119-321 
    115298-322||119087-322 
); 

# check the results of chdir. 
chdir($TARGET_DIR) 
    or die "Unable to enter $TARGET_DIR - $!\n"; 

# Use a lexical filehandle. 
# Use 3 arg open 
# Check the results of open - you need to know if it fails. 
open (my $fsas, '>>', $TARGET_FILE) 
    or die "Unable to open $TARGET_FILE - $!\n"; 

# Verify that the link arrays are both sized appropriately. 
die "Link arrays are not the same size." 
    unless @link == @link1; 

# Loop over the indexes of the array. 
# For very (very) large arrays it is 
# more efficient to use a C-style for loop: 
# for(my $i = 0; $i < @link; $i++) { 
foreach my $i (0..$#link) { 
    my $link = $link[$i]; 
    my $link1 = $link1[$i]; 

    print $fsas Get_Link_Text($link, $link1); 
} 

# Broke out your formatting code into a routine for readability. 
# Used a heredoc to make the formatting easier to read. 
# Also, took advantage of variable interpolation in the heredoc to further 
# improve readability. 
# I preserved the whitespace at the end of lines, is it really necessary? 
sub Get_Link_Text { 
    my $link = shift; 
    my $link1 = shift; 

    return <<"--END_TEXT--"; 
RUN PGM=HWYLOAD 
MATI=daily_trucks.MAT 
NETI=FAF_Network_V11.net 
NETO=MiamiDade.NET 
PARAMETERS MAXITERS=1, GAP=0.001, COMBINE=EQUI 
FUNCTION { 
TC[1] = T0*(1+0.15*(V/100)^(4))}  
FUNCTION V = (VOL[1]) 
PHASE=ILOOP 
PATHLOAD PATH=TIME, MW[1]=MI.1.1, SELECTLINK=(Link=$link), VOL[2]=MW[1] 
PATHLOAD PATH=TIME, MW[2]=MI.1.1, SELECTLINK=(Link=$link1), VOL[3]=MW[2] 
ENDPHASE 
ENDRUN 


--END_TEXT-- 
} 
+0

इसे और अधिक पठनीय और उपयोगी बनाने के लिए सुझावों और कोड के लिए धन्यवाद। – Krishnan

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

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