2009-05-04 13 views
8

私は別のプログラムを読み込むために使用できるテキストファイル(aptest.s)を作成する必要があります。私は仕事をする大きなリストがあるのでPerlを使っています。私のコードは以下の通りです(コードと実際の出力の後に表示されます)。どんな助けもありがとう。Perlで同時に複数のリストを反復処理するにはどうしたらいいですか?

#!/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"; 

あなたのバグがある可能性がある:より慎重ビットを探し

、変数である出力コードの1ビットだけがあります。

+0

感謝。私は自分のコードを読みやすくし、あなたの意見を高く評価しました。 – Krishnan

20

List::MoreUtilseach_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配列の各要素を持つ、別々のブロックを作成しようとしている考える

あなたが実際にブロック、各組み合わせlinklink1のための1を出力しているが。

代わりにしてみてください:

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

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

    ... 
} 
2

は、あなたの質問を読んで、あなたが本当に知りたいと思ったものを伝えることは困難でした。私はSinan Unurが正しいと思うし、2つの配列を同時に繰り返したいと思う。彼が言うように、List :: MoreUtilsは非常に便利なeach_array()関数を提供します。

インデックスで1つまたは複数の配列を反復することも簡単です。

通常のforループで使用するインデックスのリストを生成することができます。これは$#を使用して配列の最後の値のインデックスを取得します。

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

または、Cスタイルのforループを使用してインデックスを生成できます。これは、スカラーコンテキストで評価された配列が要素数を返すという事実を利用しています。

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

関連する問題