| 導購 | 订阅 | 在线投稿
分享
 
 
當前位置: 王朝網路 >> perl >> 功能豐富的Perl:編寫說英語的Perl程序
 

功能豐富的Perl:編寫說英語的Perl程序

2008-05-19 06:25:54  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
 
  設計程序的用戶界面可能很困難而且耗時。Teodor Zlatanov 討論了如何使用 Parse::RecDescent 模塊來用簡單的英語創建用戶界面文法。他還展示了向程序添加功能或從程序除去功能時,更改文法是如何的方便。另外還與標准的 CLI 解析器和 GUI 進行了比較,討論了這種方法的優缺點。

  隨功能一起發展的很棒的用戶界面

  因爲用戶界面是程序最初的入口,所以它必須能夠用于多種目的。必須向用戶提供對程序所有功能的合適訪問。在向程序添加更多功能時(這幾乎是必然發生的情況),它必須是可擴展的。必須具備靈活性,可以接受常用命令的縮寫和快捷方式。它不應該有層疊的菜單或瀑布式單詞,這樣會讓用戶感到迷惑。無可否認,以上所有這些要求對程序員來說都是複雜的約束,對此沒有一種很好的解決方案能把它們全包括。許多軟件産品開發人員到最後再解決用戶界面問題,把它作爲一種事後來考慮的問題。另外一些開發人員則首先主要考慮用戶界面,讓功能僅僅成爲界面設計選擇的結果。這些都不是理想的方法。用戶界面(UI)應該隨著程序功能的發展而發展,兩者就象一枚硬幣的正反面。

  這裏我們將面向解析的方法用于用戶界面。雖然這種方法適合于 GUI 界面,但本文不討論 GUI 設計。我們將專門討論基于文本的 UI。首先,將簡要介紹標准的文本 UI 設計選擇,使您能熟悉該環境。然後,將展示 Parse::RecDescent 解決方案,事實證明它是靈活、直觀和易于編寫的!

  注:爲了運行我們所討論的某些程序,將需要 Parse::RecDescent CPAN 模塊。

  用傳統的 Unix 方式創建的簡單用戶界面

  Unix 用戶非常熟悉基于文本的 UI 模型。設想有一個 Perl 程序,讓我們先看一下這個模型用于該程序的簡單實現。標准的 Getopt::Std 模塊簡化了命令行參數的解析。這個程序僅僅爲了說明 Getopt::Std 模塊(沒有實際用途)。請參閱本文後面的參考資料。

  使用 Getopt::Std 的命令行開關

  #!/usr/bin/perl -w

  use strict;# always use strict, it's a good habit

  use Getopt::Std;# see "perldoc Getopt::Std"

  my %options;

  getopts('f:hl', \%options);# read the options with getopts

  # uncomment the following two lines to see what the options hash contains

  #use Data::Dumper;

  #print Dumper \%options;

  $options{h} && usage();# the -h switch

  # use the -f switch, if it's given, or use a default configuration filename

  my $config_file = $options{f} || 'first.conf';

  print "Configuration file is $config_file\n";

  # check for the -l switch

  if ($options{l})

  {

  system('/bin/ls -l');

  }

  else

  {

  system('/bin/ls');

  }

  # print out the help and exit

  sub usage

  {

  print

  first.pl [-l] [-h] [-f FILENAME]

  Lists the files in the current directory, using either /bin/ls or

  /bin/ls -l.

  The -f switch selects a different configuration file.

  The -h switch prints this help.

  EOHIPPUS

  exit;

  }

  簡單的事件循環

  當命令行參數不夠用時,下一步是編寫一個事件循環。在這種方案中,仍然可接受命令行參數,並且有時只使用命令行參數就足夠了。然而,事件循環支持用戶在不輸入任何參數的情形下調用程序,以及看到提示符。在此提示符下,通常可使用 help 命令,這將打印出更詳細的幫助。有時,這個 help 甚至可以是一個單獨的輸入提示符,有一個完整的軟件子系統來專門負責它。

  帶有命令行開關的事件循環

  #!/usr/bin/perl -w

  use strict; # always use strict, it's a good habit

  use Getopt::Std; # see "perldoc Getopt::Std"

  my %options;

  getopts('f:hl', \%options); # read the options with getopts

  # uncomment the following two lines to see what the options hash contains

  #use Data::Dumper;

  #print Dumper \%options;

  $options{h} && usage(1); # the -h switch, with exit option

  # use the -f switch, if it's given, or use a default configuration filename

  my $config_file = $options{f} || 'first.conf';

  print "Configuration file is $config_file\n";

  # check for the -l switch

  if ($options{l})

  {

  system('/bin/ls -l');

  }

  else

  {

  my $input; # a variable to hold user input

  do

  {

  print "Type 'help' for help, or 'quit' to quit\n- ";

  $input = ;

  print "You entered $input\n"; # let the user know what we got

  # note that 'listlong' matches /list/, so listlong has to come first

  # also, the i switch is used so upper/lower case makes no difference

  if ($input =~ /listlong/i)

  {

  system('/bin/ls -l');

  }

  elsif ($input =~ /list/i)

  {

  system('/bin/ls');

  }

  elsif ($input =~ /help/i)

  {

  usage();

  }

  elsif ($input =~ /quit/i)

  {

  exit;

  }

  }

  while (1); # only 'quit' or ^C can exit the loop

  }

  exit; # implicit exit here anyway

  # print out the help and exit

  sub usage

  {

  my $exit = shift @_ || 0; # don't exit unless explicitly told so

  print

  first.pl [-l] [-h] [-f FILENAME]

  The -l switch lists the files in the current directory, using /bin/ls -l.

  The -f switch selects a different configuration file.

  The -h

  switch prints this help.

  Without the -l or -h arguments, will show

  a command prompt.

  Commands you can use at the prompt:

  list:

  list the files in the current directory

  listlong:

  list the files in the current directory in long format

  help:

  print out this help

  quit:

  quit the program

  EOHIPPUS

  exit if $exit;

  }

  這裏,通常會有三種選擇:

  由于可能會有多個開關組合,所以程序的 UI 會複雜到不可忍受的程度。

  UI 將發展爲 GUI。

  從頭重新開發 UI,使其至少帶有一些解析功能。

  第一種選擇太可怕,難以去想象。這裏不討論第二種選擇,但它的確在向後兼容性和靈活性方面提出了有趣的挑戰。第三種選擇是本文下面要討論的內容。

  Parse::RecDescent 的快速教程

  Parse::RecDescent 是一個用于解析文本的模塊。通過幾個簡單構造就可以用它完成幾乎所有的解析任務。更高級的文法構造可能會讓人望而生畏,不過在大多數用途中不需要這麽高級的文法。

  Parse::RecDescent 是一個面向對象的模塊。它圍繞著文法創建解析器對象。文法(grammar)是一組以文本形式表示的規則。下面這個示例是一條匹配單詞的規則:

  word 規則

  word: /\w+/

  這條規則一次或多次匹配字符(\w)。跟在冒號後的部分稱爲産品(production)。一條規則必須包含至少一個産品。一個産品可以包含其它規則或直接要匹配的內容。下面這個示例是一條規則,它可以匹配一個單詞、另一條規則(non-word)或一個錯誤(如果其它兩個都失敗):

  另一些産品

  token: word | non-word |

  word: /\w+/

  non-word: /\W+/

  每個産品也可以包含一個用花括號括起的操作:

  産品中的操作

  print: /print/i { print_function(); }

  如果操作是産品中的最後一項,則操作的返回碼決定産品是否成功。該操作是一種空産品,它將總是會匹配,除非它返回 0。

  可以用 (s) 修飾符指定多個標記(token):

  一個産品中帶一個或多個標記

  word: letter(s)

  letter: /\w/

  也可以將 (?)(0 或 1)和 (s?)(0 到 N)修飾符作爲可選關鍵字來使用。

  可以通過 $item[position] 或 $item{name} 機制來訪問産品中的任何內容。請注意,在第二種情形中,兩個單詞的名稱是相同的,所以必須使用位置查找。在第三種情形中,單詞數組以數組引用的形式存儲在 $item{word} 中。如果在産品中使用可選項,則數組定位方案將肯定無法很好地工作。一般來說,無論如何都應避免使用這種方案,因爲通過名稱查找的方式總是更方便更簡單:

  使用 %item 和 @item 變量

  print: /print/i word { print_function($item{word}); }

  print2: /print2/i word word { print_function($item[1], $item[2]); }

  print3: /print3/i w

  
 
 
 
上一篇《功能豐富的Perl:用Perl讀寫Excel文件》
下一篇《功能豐富的Perl:xinetd程序用于系統管理》
 
 
 
 
 
 
日版寵物情人插曲《Winding Road》歌詞

日版寵物情人2017的插曲,很帶節奏感,日語的,女生唱的。 最後聽見是在第8集的時候女主手割傷了,然後男主用嘴幫她吸了一下,插曲就出來了。 歌手:Def...

兄弟共妻,我成了他們夜裏的美食

老鍾家的兩個兒子很特別,就是跟其他的人不太一樣,魔一般的執著。兄弟倆都到了要結婚的年齡了,不管自家老爹怎麽磨破嘴皮子,兄弟倆說不娶就不娶,老父母爲兄弟兩操碎了心...

如何磨出破洞牛仔褲?牛仔褲怎麽剪破洞?

把牛仔褲磨出有線的破洞 1、具體工具就是磨腳石,下面墊一個硬物,然後用磨腳石一直磨一直磨,到把那塊磨薄了,用手撕開就好了。出來的洞啊很自然的。需要貓須的話調幾...

我就是掃描下圖得到了敬業福和愛國福

先來看下敬業福和愛國福 今年春節,支付寶再次推出了“五福紅包”活動,表示要“把欠大家的敬業福都還給大家”。 今天該活動正式啓動,和去年一樣,需要收集“五福”...

冰箱異味産生的原因和臭味去除的方法

有時候我們打開冰箱就會聞到一股異味,冰箱裏的這種異味是因爲一些物質發出的氣味的混合體,聞起來讓人惡心。 産生這些異味的主要原因有以下幾點。 1、很多人有這種習...

《極品家丁》1-31集大結局分集劇情介紹

簡介 《極品家丁》講述了現代白領林晚榮無意回到古代金陵,並追隨蕭二小姐化名“林三”進入蕭府,不料卻陰差陽錯上演了一出低級家丁拼搏上位的“林三升職記”。...

李溪芮《極品家丁》片尾曲《你就是我最愛的寶寶》歌詞

你就是我最愛的寶寶 - 李溪芮 (電視劇《極品家丁》片尾曲) 作詞:常馨內 作曲:常馨內 你的眉 又鬼馬的挑 你的嘴 又壞壞的笑 上一秒吵鬧 下...

烏梅的功效與作用以及烏梅的食用禁忌有哪些?

烏梅,又稱春梅,中醫認爲,烏梅味酸,性溫,無毒,具有安心、除熱、下氣、祛痰、止渴調中、殺蟲的功效,治肢體痛、肺痨病。烏梅泡水喝能治傷寒煩熱、止吐瀉,與幹姜一起制...

什麽是脂肪粒?如何消除臉部脂肪粒?

什麽是脂肪粒 在我們的臉上總會長一個個像脂肪的小顆粒,弄也弄不掉,而且顔色還是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。 脂肪粒雖然也是由油脂...

網絡安全治理:國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰受害者

來源:中國青年報 新的攻擊方法不斷湧現,黑客幾乎永遠占據網絡攻擊的上風,我們不可能通過技術手段杜絕網絡攻擊。國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰...

河南夫妻在溫嶺網絡直播“造人”內容涉黃被刑事拘留

夫妻網絡直播“造人”爆紅   1月9日,溫嶺城北派出所接到南京警方的協查通告,他們近期打掉了一個涉黃直播APP平台。而根據掌握的線索,其中有一對涉案的夫妻主播...

如何防止牆紙老化?牆紙變舊變黃怎麽辦?

如何防止牆紙老化? (1)選擇透氣性好的牆紙 市場上牆紙的材質分無紡布的、木纖維的、PVC的、玻璃纖維基材的、布面的等,相對而言,PVC材質的牆紙最不透氣...

鮮肌之謎非日本生産VS鮮肌之謎假日貨是謠言

觀點一:破日本銷售量的“鮮肌之謎” 非日本生産 近一段時間,淘寶上架了一款名爲“鮮肌之謎的” 鲑魚卵巢美容液,號稱是最近日本的一款推出的全新護膚品,産品本身所...

中國最美古詩詞精選摘抄

系腰裙(北宋詞人 張先) 惜霜蟾照夜雲天,朦胧影、畫勾闌。人情縱似長情月,算一年年。又能得、幾番圓。 欲寄西江題葉字,流不到、五亭前。東池始有荷新綠,尚小如...

關于女人的經典語句

關于女人的經典語句1、【做一個獨立的女人】 思想獨立:有主見、有自己的人生觀、價值觀。有上進心,永遠不放棄自己的理想,做一份自己喜愛的事業,擁有快樂和成就...

未來我們可以和性愛機器人結婚嗎?

你想體驗機器人性愛嗎?你想和性愛機器人結婚嗎?如果你想,機器人有拒絕你的權利嗎? 近日,第二屆“國際人類-機器人性愛研討會”大會在倫敦金史密斯大學落下帷幕。而...

全球最變態的十個地方

10.土耳其地下洞穴城市 變態指數:★★☆☆☆ 這是土耳其卡帕多西亞的一個著名景點,傳說是當年基督教徒們爲了躲避戰爭而在此修建。裏面曾住著20000人,...

科學家稱,人類死亡後意識將在另外一個宇宙中繼續存活

據英國《每日快報》報道,一位科學家兼理論家Robert Lanza博士宣稱,世界上並不存在人類死亡,死亡的只是身體。他認爲我們的意識借助我們體內的能量生存,而且...

《屏裏狐》片頭曲《我愛狐狸精》歌詞是什麽?

《我愛狐狸精》 - 劉馨棋   (電視劇《屏裏狐》主題曲)   作詞:金十三&李旦   作曲:劉嘉   狐狸精 狐狸仙   千年修...

 
 
 
  設計程序的用戶界面可能很困難而且耗時。Teodor Zlatanov 討論了如何使用 Parse::RecDescent 模塊來用簡單的英語創建用戶界面文法。他還展示了向程序添加功能或從程序除去功能時,更改文法是如何的方便。另外還與標准的 CLI 解析器和 GUI 進行了比較,討論了這種方法的優缺點。   隨功能一起發展的很棒的用戶界面   因爲用戶界面是程序最初的入口,所以它必須能夠用于多種目的。必須向用戶提供對程序所有功能的合適訪問。在向程序添加更多功能時(這幾乎是必然發生的情況),它必須是可擴展的。必須具備靈活性,可以接受常用命令的縮寫和快捷方式。它不應該有層疊的菜單或瀑布式單詞,這樣會讓用戶感到迷惑。無可否認,以上所有這些要求對程序員來說都是複雜的約束,對此沒有一種很好的解決方案能把它們全包括。許多軟件産品開發人員到最後再解決用戶界面問題,把它作爲一種事後來考慮的問題。另外一些開發人員則首先主要考慮用戶界面,讓功能僅僅成爲界面設計選擇的結果。這些都不是理想的方法。用戶界面(UI)應該隨著程序功能的發展而發展,兩者就象一枚硬幣的正反面。   這裏我們將面向解析的方法用于用戶界面。雖然這種方法適合于 GUI 界面,但本文不討論 GUI 設計。我們將專門討論基于文本的 UI。首先,將簡要介紹標准的文本 UI 設計選擇,使您能熟悉該環境。然後,將展示 Parse::RecDescent 解決方案,事實證明它是靈活、直觀和易于編寫的!   注:爲了運行我們所討論的某些程序,將需要 Parse::RecDescent CPAN 模塊。   用傳統的 Unix 方式創建的簡單用戶界面   Unix 用戶非常熟悉基于文本的 UI 模型。設想有一個 Perl 程序,讓我們先看一下這個模型用于該程序的簡單實現。標准的 Getopt::Std 模塊簡化了命令行參數的解析。這個程序僅僅爲了說明 Getopt::Std 模塊(沒有實際用途)。請參閱本文後面的參考資料。   使用 Getopt::Std 的命令行開關   #!/usr/bin/perl -w   use strict; # always use strict, it's a good habit   use Getopt::Std; # see "perldoc Getopt::Std"   my %options;   getopts('f:hl', \%options); # read the options with getopts   # uncomment the following two lines to see what the options hash contains   #use Data::Dumper;   #print Dumper \%options;   $options{h} && usage(); # the -h switch   # use the -f switch, if it's given, or use a default configuration filename   my $config_file = $options{f} || 'first.conf';   print "Configuration file is $config_file\n";   # check for the -l switch   if ($options{l})   {   system('/bin/ls -l');   }   else   {   system('/bin/ls');   }   # print out the help and exit   sub usage   {   print   first.pl [-l] [-h] [-f FILENAME]   Lists the files in the current directory, using either /bin/ls or   /bin/ls -l.   The -f switch selects a different configuration file.   The -h switch prints this help.   EOHIPPUS   exit;   }   簡單的事件循環   當命令行參數不夠用時,下一步是編寫一個事件循環。在這種方案中,仍然可接受命令行參數,並且有時只使用命令行參數就足夠了。然而,事件循環支持用戶在不輸入任何參數的情形下調用程序,以及看到提示符。在此提示符下,通常可使用 help 命令,這將打印出更詳細的幫助。有時,這個 help 甚至可以是一個單獨的輸入提示符,有一個完整的軟件子系統來專門負責它。   帶有命令行開關的事件循環   #!/usr/bin/perl -w   use strict; # always use strict, it's a good habit   use Getopt::Std; # see "perldoc Getopt::Std"   my %options;   getopts('f:hl', \%options); # read the options with getopts   # uncomment the following two lines to see what the options hash contains   #use Data::Dumper;   #print Dumper \%options;   $options{h} && usage(1); # the -h switch, with exit option   # use the -f switch, if it's given, or use a default configuration filename   my $config_file = $options{f} || 'first.conf';   print "Configuration file is $config_file\n";   # check for the -l switch   if ($options{l})   {   system('/bin/ls -l');   }   else   {   my $input; # a variable to hold user input   do   {   print "Type 'help' for help, or 'quit' to quit\n- ";   $input = ;   print "You entered $input\n"; # let the user know what we got   # note that 'listlong' matches /list/, so listlong has to come first   # also, the i switch is used so upper/lower case makes no difference   if ($input =~ /listlong/i)   {   system('/bin/ls -l');   }   elsif ($input =~ /list/i)   {   system('/bin/ls');   }   elsif ($input =~ /help/i)   {   usage();   }   elsif ($input =~ /quit/i)   {   exit;   }   }   while (1); # only 'quit' or ^C can exit the loop   }   exit; # implicit exit here anyway   # print out the help and exit   sub usage   {   my $exit = shift @_ || 0; # don't exit unless explicitly told so   print   first.pl [-l] [-h] [-f FILENAME]   The -l switch lists the files in the current directory, using /bin/ls -l.   The -f switch selects a different configuration file.   The -h   switch prints this help.   Without the -l or -h arguments, will show   a command prompt.   Commands you can use at the prompt:   list:   list the files in the current directory   listlong:   list the files in the current directory in long format   help:   print out this help   quit:   quit the program   EOHIPPUS   exit if $exit;   }   這裏,通常會有三種選擇:   由于可能會有多個開關組合,所以程序的 UI 會複雜到不可忍受的程度。   UI 將發展爲 GUI。   從頭重新開發 UI,使其至少帶有一些解析功能。   第一種選擇太可怕,難以去想象。這裏不討論第二種選擇,但它的確在向後兼容性和靈活性方面提出了有趣的挑戰。第三種選擇是本文下面要討論的內容。   Parse::RecDescent 的快速教程   Parse::RecDescent 是一個用于解析文本的模塊。通過幾個簡單構造就可以用它完成幾乎所有的解析任務。更高級的文法構造可能會讓人望而生畏,不過在大多數用途中不需要這麽高級的文法。   Parse::RecDescent 是一個面向對象的模塊。它圍繞著文法創建解析器對象。文法(grammar)是一組以文本形式表示的規則。下面這個示例是一條匹配單詞的規則:   word 規則   word: /\w+/   這條規則一次或多次匹配字符(\w)。跟在冒號後的部分稱爲産品(production)。一條規則必須包含至少一個産品。一個産品可以包含其它規則或直接要匹配的內容。下面這個示例是一條規則,它可以匹配一個單詞、另一條規則(non-word)或一個錯誤(如果其它兩個都失敗):   另一些産品   token: word | non-word |   word: /\w+/   non-word: /\W+/   每個産品也可以包含一個用花括號括起的操作:   産品中的操作   print: /print/i { print_function(); }   如果操作是産品中的最後一項,則操作的返回碼決定産品是否成功。該操作是一種空産品,它將總是會匹配,除非它返回 0。   可以用 (s) 修飾符指定多個標記(token):   一個産品中帶一個或多個標記   word: letter(s)   letter: /\w/   也可以將 (?)(0 或 1)和 (s?)(0 到 N)修飾符作爲可選關鍵字來使用。   可以通過 $item[position] 或 $item{name} 機制來訪問産品中的任何內容。請注意,在第二種情形中,兩個單詞的名稱是相同的,所以必須使用位置查找。在第三種情形中,單詞數組以數組引用的形式存儲在 $item{word} 中。如果在産品中使用可選項,則數組定位方案將肯定無法很好地工作。一般來說,無論如何都應避免使用這種方案,因爲通過名稱查找的方式總是更方便更簡單:   使用 %item 和 @item 變量   print: /print/i word { print_function($item{word}); }   print2: /print2/i word word { print_function($item[1], $item[2]); }   print3: /print3/i w   
󰈣󰈤
 
 
 
  免責聲明:本文僅代表作者個人觀點,與王朝網路無關。王朝網路登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
完美絕倫_秀色可餐
無懈可擊的優美線條
純美秀氣_楚楚動人
纖發盡顯_玲珑女生
痞子的甘南日記
疑是銀河落九天
雪域壩上四——純美色
冬日戀歌——西城楊柳弄輕柔
 
>>返回首頁<<
 
 熱帖排行
 
 
 
 
© 2005- 王朝網路 版權所有