2013-12-12 139 views
2

我遇到了一個相當奇怪的問題。我只是試圖通過循環存儲輸入名稱的數組以及與該名稱關聯的註釋來顯示用戶輸入的註釋。Perl CGI打印格式

#Check through each name 
     for (my $i = 0; $i < scalar @$namesRef; $i++) 
     { 
      #Display the comment to the user 
      print @$namesRef[$i].": "[email protected]$commentsRef[$i], p; 
     } 

在顯示評論的頁面上,而不是像'John:comment'那樣顯示它,它顯示爲'Johncomment:'。另外,',p'不包括在內,所以下一條評論不會換成新的一行。

我會提出了一個圖像,以便更好地說明問題的是什麼,但我沒有足夠的代表尚未:/

編輯:@ -signs在那裏,因爲這些都是這個之外數組引用子程序。

編輯:初始數組在這個子例程中聲明。

sub buildForm { my $ form = shift; #檢查哪個按鈕被按下。

my $daysOld = 0; #Holds how many days old the user is. 
my $commentErrors = 0; 

my @names =(); 
my @comments =(); #Array to store the user's comments. 
my @errorMessages =(); #Array to store the error messages for the current form. 

以下是其中的註釋的形式調用子程序:

elsif ($form == 3) 
{ 
    &readComments(\@comments, \@names, \@errorMessages); #Read in the comments. 
    #Initial build - Can't have any errors. 
    &build3(\@comments,\@names, \@errorMessages, $commentErrors, param('name'), param('comment')); 
} 
elsif ($form == 4) 
{ 
    $commentErrors = &commentFormErrorCheck(param('name'), param('comment'), \@errorMessages); #Check for an errors. 
    &build3(\@comments,\@names, \@errorMessages, $commentErrors, param('name'), param('comment')); 
} 
+0

在這種情況下,你不需要'''在你的子呼叫之前。 – codnodder

回答

2

的主要問題是在打印語句中使用的@ -signs的。

假設@names@comments是平行排列,顯示演示使用一個完整簡單的例子:

build3(\@comments, \@names); 

sub build3 { 
    my $comments = shift; 
    my $names = shift; 
    for (my $i = 0; $i < @$names; $i++) { 
     print $names->[$i].": ".$comments->[$i], p; 
    } 
} 

這就是說,你可能想看看printf,使該行更易讀。

此外,不要忘記HTML轉義。

編輯:

使用HTML逸出和printf()添加的例子。

use CGI qw/escapeHTML p/; 

printf("%s: %s%s\n", escapeHTML($names->[$i]), escapeHTML($comments->[$i]), p); 
+0

應該是'$ namesRef - > [$ i],$ commentsRef - > [$ i]'對嗎? – chrsblck

+0

對不起,我應該提到這些是對子程序之外的數組的引用。這就是爲什麼@符號在那裏。 – Shaun

+0

@chrblck是的謝謝 – codnodder