2013-07-08 67 views
0

我想寫一個perl腳本,它允許編輯一個單獨的問題和答案文件。我似乎無法弄清楚一些看起來效果不錯的東西,而沒有寫出荒謬,低效的代碼。用Perl和html編輯一個問題和答案的文件

我希望它能夠爲文件添加全新的問題/答案,以及編輯已有的問題/答案。有關如何使這項工作的任何建議?

編輯:說我有一個textarea。我可以製作一個按鈕,從相關文件中刪除在textarea中輸入的文本嗎?一個文本區域,當你輸入一個問題時,你可以選擇按下「刪除」按鈕,如果該問題存在於.txt文件中,請將其從文件中刪除?

這是腳本:

if($newquestion != $oldquestion and $newanswer != $oldanswer) { 
      print $ANS "$newquestion\t$newanswer\n"; 
     } else { 
      if($newquestion != $oldquestion and $newanswer == $oldanswer) { 
       print $ANS "$newquestion\t$newanswer\n"; 
      } elsif($newquestion == $oldquestion and $newanswer != $oldanswer) { 
       print $ANS "$oldquestion\t$newquestion\n"; 
      } 
     } 
    } 

這是HTML:

<html> 
    <body> 
     Edit Questions and Answers!<br><br> 
     Type the question in the first area, and the answer to it in the other<br> 
     ~answerlist~<br><br> 
     <form action="viewquestions.dhtml" method="post"> 
      Questions and Answers:<br> 
      <textarea rows="1" cols="25" name="newquestion">Question 
      </textarea> 
      <textarea rows="1" cols="25" name="newanswer">Answer 
      </textarea> 
      <input type="submit" value="submit"/> 
      <input type="hidden" name="site" value="~site~"/> 
      <input type="hidden" name="xs" value="~xs~"/> 
      <input type="hidden" name="username" value="~username~"/> 
     </form> 
     <a href="/client_homepage.dhtml~useridtext~&frompage=View and Answer Questions">Return to home page</a><br> 
    </body> 
</html> 
+0

您是否有現有的HTML文件,您可以添加或創建新的問題,並在需要時提供整個服務?有點像stackoverflow?您可能會考慮將文件保存爲XML,因爲有許多用於處理XML的包。然後您可以使用XSLT包將其轉換爲HTML。 – KeepCalmAndCarryOn

+0

如果您要比較字符串,則必須使用'eq'和'ne'。 '=='和'!='用於比較數字。 –

回答

0

因爲你缺乏基本面,get a book or two about beginner Web programming你產生不好的代碼。

您將問題/答案放入數據庫而不是文本文件。這可以確保在編寫多個併發數據集時更新不會丟失。

echo 'create table qa(id integer primary key autoincrement, question text, answer text);' | sqlite3 qa.sqlite 

爲方便起見,使用ORM訪問數據庫(3-5行)。您的Web應用程序需要單頁「猴子窗體」:

use 5.010; 
use strictures; 
use DBIx::Class::Schema::Loader qw(); 
DBIx::Class::Schema::Loader->naming({ALL => 'preserve'}); 
my $table = DBIx::Class::Schema::Loader->connect('dbi:SQLite:dbname=qa.sqlite')->resultset('Qa'); 

use Text::Xslate qw(); 
my $tt = Text::Xslate->new(syntax => 'TTerse'); 
my $template = <<''; 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <title>Edit Questions and Answers!</title> 
     <style> 
      textarea { width: 25em; height: 1em; } 
     </style> 
    </head> 
    <body> 
     <h1>existing questions and answers</h1> 
     [% FOR pair IN qa %] 
     <form action="[% action %]" method="POST"> 
      <input type="hidden" name="id" value="[% pair.id %]" /> 
      <textarea name="question">[% pair.question %]</textarea> 
      <textarea name="answer">[% pair.answer %]</textarea> 
      <input type="submit" name="update" value="update" /> 
      <input type="submit" name="delete" value="delete" /> 
     </form> 
     [% END %] 
     <h1>new question and answer</h1> 
     <form action="[% action %]" method="POST"> 
      <label for="question">Question:</label> 
      <textarea name="question" id="question"></textarea> 
      <label for="answer">Answer:</label> 
      <textarea name="answer"></textarea> 
      <input type="submit" name="create" value="create" /> 
     </form> 
    </body> 
</html> 

use Plack::Request qw(); 
my $app = sub { 
    my $req = Plack::Request->new(shift); 
    my $op = delete $req->body_parameters->{delete} // 
      delete $req->body_parameters->{update} // 
      delete $req->body_parameters->{create}; 
    if ('POST' eq $req->method) { 
     if ('delete' eq $op) { 
      $table->find($req->body_parameters->{id})->delete; 
     } else { 
      $table->update_or_create($req->body_parameters->as_hashref); 
     } 
    } 
    return $req->new_response(
     200, 
     ['Content-Type' => 'application/xhtml+xml'], 
     [$tt->render_string($template, { action => $req->uri, qa => [$table->all] })] 
    )->finalize; 
}; 

這就是整個代碼。用plackup運行該程序。