| 導購 | 订阅 | 在线投稿
分享
 
 
當前位置: 王朝網路 >> perl >> 功能豐富的Perl:用Perl保存
 

功能豐富的Perl:用Perl保存

2008-05-19 06:25:45  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
 
  數據存儲是計算機編程中常見的問題。CPAN Persistent 類通過一個簡化數據創建、檢索和管理的通用接口,使數據存儲變得簡單。通過面向對象的方法,可以在項目中將 Persistent 類作爲自己的數據類的父類透明地使用。

  持久性介紹

  所有程序員都有必須解決數據持久性問題的經曆。例如,對于如將文檔存入文件和將事務存入數據庫等任務,即使最簡單的應用程序也需要大量工作。可以將數據持久性定義爲程序和存儲設備之間達成的契約,該契約指定如何存儲和檢索數據。

  CPAN 定義:

  「CPAN 是綜合 Perl 檔案網絡。綜合:其目的是包含可能需要的所有 Perl 資料。檔案:從 1999 年 9 月至今,已有 760 兆字節。網絡:全世界有超過一百個 CPAN 鏡像站點。」

  本文集中講述在作者和讀者事先都知道對象屬性的情況下,如何使對象屬性持久。本文不討論動態發現對象屬性和存儲屬性以外的特性(如行爲)的主題,因爲需要很多篇幅才能把這些主題講清楚。

  熟悉面向對象編程、數據庫、Perl 和 Perl 繼承將對閱讀本文有幫助。

  使對象屬性持久只是軟件開發過程的一小部分。首先,必須確定持久性的需求。需要保存什麽?需要恢複什麽?在恢複存儲的數據之前,需要手工編輯嗎?諸如此類的問題將確定軟件如何將持久數據歸檔。不幸地是,沒有一份調查表可以確定項目確切的持久性需要。軟件設計師必須通過智能設計,定義並滿足項目需求。很重要的一點是,最後的解決方案要確實是問題的解決方案,而不只是時髦的行業詞語。例如,XML 解決數據持久性問題的能力比只用磚頭來建造房屋好不到哪裏。

  持久數據示例

  Perl 文件 simple 顯示了預定義的關鍵字集合如何能夠實現簡單的持久性。這種方法有很多問題:文件格式是任意的,只保存一個關鍵字集合,根本沒有對象、數據值限制到一行文本等等。

  Persistent 類的簡單使用:Persistent::File

  Persistent 類旨在使數據持久性變得簡單。爲此,您必須閱讀文檔。對于掌握處理持久數據的方便的預制類而言,這只是很小的代價。所以,先花上幾分鍾或幾小時來做這件事,以後將節省您的時間。有關文檔和示例,請參閱 Persistent 類主頁(請參閱參考資料)。

  第一個示例 first 將基于 Persistent::File 模塊文檔中給出的 simple 示例,並將描述達到持久性的步驟。

  清單 1:定義數據

  my %problems = (

  'Homework 1, Problem 1' = [0,5,2],

  'Homework 1, Problem 2' = [1,8,5],

  'Homework 1, Problem 3' = [2,2,4],

  'Homework 1, Problem 4' = [3,0,3],

  'Homework 1, Problem 5' = [4,1,2],

  );

  首先,定義要存儲在數據存儲器中的數據。在 Persistent 類中,數據存儲器是抽象存儲設備,例如,它可以是文件或數據庫。該例是自包容的,但是數據也可能來自別處。

  清單 2:使用 eval 來捕獲錯誤

  use English;

  eval

  {

  };

  print "An error occurred: $EVAL_ERROR\n" if $EVAL_ERROR;

  因爲不希望程序在出現執行錯誤時終止,所以將所有操作放在 eval 語句中。English 模塊使我們可以使用 $EVAL_ERROR 、而不是 $@ 來表示錯誤消息。

  清單 3:定義數據存儲器

  # 從文件創建持久對象

  my $equation = new Persistent::File('variables.txt');

  我們在這裏創建了新的 Persistent::File 對象,其內容將存儲在文件 variables.txt 中。

  清單 4:定義屬性

  $equation-add_attribute('name', 'ID', 'VarChar', undef, 80);

  $equation-add_attribute('x', 'Persistent', 'Number', 0, 10);

  $equation-add_attribute('y', 'Persistent', 'Number', 0, 10);

  $equation-add_attribute('z', 'Persistent', 'Number', 0, 10);

  $equation-add_attribute('answer', 'Transient', 'Number', undef, 10);

  我們創建了五個屬性:一個唯一標識、三個持久數據成員和一個非持久(暫時)數據成員。Persistent 類將自動創建必要的函數(例如,$equation-answer())來訪問數據成員。

  清單 5:清除數據存儲器

  $equation-restore_all();

  $equation-delete while $equation-restore_next();

  restore_all 方法檢索整個數據存儲器的內容。restore_where 和 restore 方法分別用來選擇符合某些標准的對象和單一對象。delete 方法除去當前等式,restore_next 方法移至下一個恢複的對象。

  清單 6:存儲對象數據

  # 現在將問題存儲到數據存儲器

  foreach my $key (keys %problems)

  {

  $equation-clear;

  $equation-name($key);

  $equation-x($problems{$key}-[0]);

  $equation-y($problems{$key}-[1]);

  $equation-z($problems{$key}-[2]);

  $equation-save;

  }

  我們清除舊屬性,設置新屬性,並將對象存儲到數據存儲器。因爲剛剛清除過數據存儲器,所以我們知道,不會有 name 鍵沖突,但是,通常要進行檢查,以便在用 save 方法試圖重寫現有鍵時不會導致異常。

  清單 7:檢索 homework 1 等式

  # 在數據存儲器中查詢 homework 1 中的等式

  $equation-restore_where(qq{name =~ 'Homework 1'});

  while ($equation-restore_next())

  {

  # do something with each equation

  }

  最後,遍曆數據存儲器,查找那些 name 鍵包含字符串 'Homework 1' 的對象,然後對這些對象中的每一個執行操作。

  這個例子本身並不使人難忘,但是,請考慮:

  現在可以將任何數量的屬性添加到持久對象

  可以有選擇地檢索任何存儲的對象

  任何知道對象屬性的其它程序都可以使用同樣的數據存儲器(這方面的詳細信息在「從 Persistent 類繼承」中)。

  通過使用預制的模塊,我們已經用簡單的方法解決了棘手的問題。這很有趣。

  使用 Persistent::DBI

  請閱讀 Persistent::DBI 文檔,來獲得有關 Persistent::DBI 和 Persistent::Base 類之間區別的最新討論。基本上,Persistent::DBI 允許我們連接到數據庫,並在建立連接之後,象其它 Persistent::Base 類那樣操作。可以將清單 3 中顯示的代碼行用以下替代:

  清單 8:定義要作爲數據庫的數據存儲器

  my $database = 'test_database';

  my $host

  = 'db_host';

  my $user

  = 'dali';

  my $password = 'MeltingClocks';

  my $table

  = 'persistence_test_table';

  my $equation = new Persistent::MySQL(

  "DBI:mysql:database=$database;host=$hostname",

  $user,

  $password,

  $table);

  請注意,Persistent::MySQL 是 Persistent::DBI 的子類。只使用 Persistent::DBI 本身沒什麽用,必須使用特定于我們數據庫的模塊。令人欣慰的是,除了通過名稱來引用 Persistent::MySQL 之外(例如 use 語句和 new 語句),在切換數據庫時不需要更改代碼。有關通過使用繼承來將程序與數據庫選項隔離的方法,請參閱「從 Persistent 類繼承」。

  清單 9:不同的查詢語法

  # 在數據存儲器中查詢 homework 1 中的等式

  $equation-restore_where(qq{name LIKE '%Homework 1%'});

  因爲現在使用的是 SQL SELECT 語句,所以 restore_where 自變量從 Perl 模式匹配改成 SQL WHERE 子句。

  表必須事先存在,Persistent::MySQL 將不創建表。編寫一個單獨的程序來創建表,或者繼承時在類中添加必需的功能。

  表必需與屬性定義匹配,例如,等式表的主數據庫鍵必須也是 Persistent 類的主鍵。(這是在實現工作之前必須有良好設計的情況。)

  清單 8 和清單 9 只顯示了爲使用 SQL 而必須在 first 中做的更改。腳本 second 包含這些更改。

  從 Persistent 類繼承

  文件 Equation.pm 包含從 Persistent::DBI 類繼承所需的所有代碼。很簡單,不是嗎?基本上,在本地 initialize 方法中執行 add_attribute 調用。在這裏還可以做更多操作:例如,如果數據庫中不存在表,則創建表。但是,基本方法很簡單。

  安全性注意事項:

  通常,只有數據庫中的特權用戶才能創建表,所以最好與數據庫管理員討論表的創建,以確保不會因爲安全性策略而導致您辛苦創建的表無法工作。

  清單 10:Equation.pm 模塊,擴展 Persistent::MySQL

  #! /usr/bin/perl -w

  package Equation;

  @ISA = qw(Persistent::MySQL);

  use strict;

  use Persistent::MySQL;

  sub initialize

  {

  my $self = shift;

  $self-SUPER::initialize(@_);

  # define attributes of the object (the contract)

  # this is the primary object identifier key, a 10-character name

  $self-add_attribute('name', 'ID', 'VarChar', undef, 80);

  # x, y, and z are persistent numbers with default values of 0 and length of 10

  
 
 
 
上一篇《功能豐富的Perl:用于系統管理》
下一篇《利用Perl列出系統環境變量清單範例》
 
 
 
 
 
 
日版寵物情人插曲《Winding Road》歌詞

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

中國最美古詩詞精選摘抄

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

關于女人的經典語句

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

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

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

全球最變態的十個地方

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

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

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

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

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

 
 
 
  數據存儲是計算機編程中常見的問題。CPAN Persistent 類通過一個簡化數據創建、檢索和管理的通用接口,使數據存儲變得簡單。通過面向對象的方法,可以在項目中將 Persistent 類作爲自己的數據類的父類透明地使用。   持久性介紹   所有程序員都有必須解決數據持久性問題的經曆。例如,對于如將文檔存入文件和將事務存入數據庫等任務,即使最簡單的應用程序也需要大量工作。可以將數據持久性定義爲程序和存儲設備之間達成的契約,該契約指定如何存儲和檢索數據。   CPAN 定義:   「CPAN 是綜合 Perl 檔案網絡。綜合:其目的是包含可能需要的所有 Perl 資料。檔案:從 1999 年 9 月至今,已有 760 兆字節。網絡:全世界有超過一百個 CPAN 鏡像站點。」   本文集中講述在作者和讀者事先都知道對象屬性的情況下,如何使對象屬性持久。本文不討論動態發現對象屬性和存儲屬性以外的特性(如行爲)的主題,因爲需要很多篇幅才能把這些主題講清楚。   熟悉面向對象編程、數據庫、Perl 和 Perl 繼承將對閱讀本文有幫助。   使對象屬性持久只是軟件開發過程的一小部分。首先,必須確定持久性的需求。需要保存什麽?需要恢複什麽?在恢複存儲的數據之前,需要手工編輯嗎?諸如此類的問題將確定軟件如何將持久數據歸檔。不幸地是,沒有一份調查表可以確定項目確切的持久性需要。軟件設計師必須通過智能設計,定義並滿足項目需求。很重要的一點是,最後的解決方案要確實是問題的解決方案,而不只是時髦的行業詞語。例如,XML 解決數據持久性問題的能力比只用磚頭來建造房屋好不到哪裏。   持久數據示例   Perl 文件 simple 顯示了預定義的關鍵字集合如何能夠實現簡單的持久性。這種方法有很多問題:文件格式是任意的,只保存一個關鍵字集合,根本沒有對象、數據值限制到一行文本等等。   Persistent 類的簡單使用:Persistent::File   Persistent 類旨在使數據持久性變得簡單。爲此,您必須閱讀文檔。對于掌握處理持久數據的方便的預制類而言,這只是很小的代價。所以,先花上幾分鍾或幾小時來做這件事,以後將節省您的時間。有關文檔和示例,請參閱 Persistent 類主頁(請參閱參考資料)。   第一個示例 first 將基于 Persistent::File 模塊文檔中給出的 simple 示例,並將描述達到持久性的步驟。   清單 1:定義數據   my %problems = (   'Homework 1, Problem 1' = [0,5,2],   'Homework 1, Problem 2' = [1,8,5],   'Homework 1, Problem 3' = [2,2,4],   'Homework 1, Problem 4' = [3,0,3],   'Homework 1, Problem 5' = [4,1,2],   );   首先,定義要存儲在數據存儲器中的數據。在 Persistent 類中,數據存儲器是抽象存儲設備,例如,它可以是文件或數據庫。該例是自包容的,但是數據也可能來自別處。   清單 2:使用 eval 來捕獲錯誤   use English;   eval   {   };   print "An error occurred: $EVAL_ERROR\n" if $EVAL_ERROR;   因爲不希望程序在出現執行錯誤時終止,所以將所有操作放在 eval 語句中。English 模塊使我們可以使用 $EVAL_ERROR 、而不是 $@ 來表示錯誤消息。   清單 3:定義數據存儲器   # 從文件創建持久對象   my $equation = new Persistent::File('variables.txt');   我們在這裏創建了新的 Persistent::File 對象,其內容將存儲在文件 variables.txt 中。   清單 4:定義屬性   $equation-add_attribute('name', 'ID', 'VarChar', undef, 80);   $equation-add_attribute('x', 'Persistent', 'Number', 0, 10);   $equation-add_attribute('y', 'Persistent', 'Number', 0, 10);   $equation-add_attribute('z', 'Persistent', 'Number', 0, 10);   $equation-add_attribute('answer', 'Transient', 'Number', undef, 10);   我們創建了五個屬性:一個唯一標識、三個持久數據成員和一個非持久(暫時)數據成員。Persistent 類將自動創建必要的函數(例如,$equation-answer())來訪問數據成員。   清單 5:清除數據存儲器   $equation-restore_all();   $equation-delete while $equation-restore_next();   restore_all 方法檢索整個數據存儲器的內容。restore_where 和 restore 方法分別用來選擇符合某些標准的對象和單一對象。delete 方法除去當前等式,restore_next 方法移至下一個恢複的對象。   清單 6:存儲對象數據   # 現在將問題存儲到數據存儲器   foreach my $key (keys %problems)   {   $equation-clear;   $equation-name($key);   $equation-x($problems{$key}-[0]);   $equation-y($problems{$key}-[1]);   $equation-z($problems{$key}-[2]);   $equation-save;   }   我們清除舊屬性,設置新屬性,並將對象存儲到數據存儲器。因爲剛剛清除過數據存儲器,所以我們知道,不會有 name 鍵沖突,但是,通常要進行檢查,以便在用 save 方法試圖重寫現有鍵時不會導致異常。   清單 7:檢索 homework 1 等式   # 在數據存儲器中查詢 homework 1 中的等式   $equation-restore_where(qq{name =~ 'Homework 1'});   while ($equation-restore_next())   {   # do something with each equation   }   最後,遍曆數據存儲器,查找那些 name 鍵包含字符串 'Homework 1' 的對象,然後對這些對象中的每一個執行操作。   這個例子本身並不使人難忘,但是,請考慮:   現在可以將任何數量的屬性添加到持久對象   可以有選擇地檢索任何存儲的對象   任何知道對象屬性的其它程序都可以使用同樣的數據存儲器(這方面的詳細信息在「從 Persistent 類繼承」中)。   通過使用預制的模塊,我們已經用簡單的方法解決了棘手的問題。這很有趣。   使用 Persistent::DBI   請閱讀 Persistent::DBI 文檔,來獲得有關 Persistent::DBI 和 Persistent::Base 類之間區別的最新討論。基本上,Persistent::DBI 允許我們連接到數據庫,並在建立連接之後,象其它 Persistent::Base 類那樣操作。可以將清單 3 中顯示的代碼行用以下替代:   清單 8:定義要作爲數據庫的數據存儲器   my $database = 'test_database';   my $host   = 'db_host';   my $user   = 'dali';   my $password = 'MeltingClocks';   my $table   = 'persistence_test_table';   my $equation = new Persistent::MySQL(   "DBI:mysql:database=$database;host=$hostname",   $user,   $password,   $table);   請注意,Persistent::MySQL 是 Persistent::DBI 的子類。只使用 Persistent::DBI 本身沒什麽用,必須使用特定于我們數據庫的模塊。令人欣慰的是,除了通過名稱來引用 Persistent::MySQL 之外(例如 use 語句和 new 語句),在切換數據庫時不需要更改代碼。有關通過使用繼承來將程序與數據庫選項隔離的方法,請參閱「從 Persistent 類繼承」。   清單 9:不同的查詢語法   # 在數據存儲器中查詢 homework 1 中的等式   $equation-restore_where(qq{name LIKE '%Homework 1%'});   因爲現在使用的是 SQL SELECT 語句,所以 restore_where 自變量從 Perl 模式匹配改成 SQL WHERE 子句。   表必須事先存在,Persistent::MySQL 將不創建表。編寫一個單獨的程序來創建表,或者繼承時在類中添加必需的功能。   表必需與屬性定義匹配,例如,等式表的主數據庫鍵必須也是 Persistent 類的主鍵。(這是在實現工作之前必須有良好設計的情況。)   清單 8 和清單 9 只顯示了爲使用 SQL 而必須在 first 中做的更改。腳本 second 包含這些更改。   從 Persistent 類繼承   文件 Equation.pm 包含從 Persistent::DBI 類繼承所需的所有代碼。很簡單,不是嗎?基本上,在本地 initialize 方法中執行 add_attribute 調用。在這裏還可以做更多操作:例如,如果數據庫中不存在表,則創建表。但是,基本方法很簡單。   安全性注意事項:   通常,只有數據庫中的特權用戶才能創建表,所以最好與數據庫管理員討論表的創建,以確保不會因爲安全性策略而導致您辛苦創建的表無法工作。   清單 10:Equation.pm 模塊,擴展 Persistent::MySQL   #! /usr/bin/perl -w   package Equation;   @ISA = qw(Persistent::MySQL);   use strict;   use Persistent::MySQL;   sub initialize   {   my $self = shift;   $self-SUPER::initialize(@_);   # define attributes of the object (the contract)   # this is the primary object identifier key, a 10-character name   $self-add_attribute('name', 'ID', 'VarChar', undef, 80);   # x, y, and z are persistent numbers with default values of 0 and length of 10   
󰈣󰈤
 
 
 
  免責聲明:本文僅代表作者個人觀點,與王朝網路無關。王朝網路登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
小龍女彤彤之情溢皇都
龔潔
智能手機形象美女
崔潔彤
回家的路上----
中國一站(哈爾濱)
清明植物園的花。
桃花堤印象之豎版
 
>>返回首頁<<
 
 熱帖排行
 
 
 
 
© 2005- 王朝網路 版權所有