diff mayachemtools/docs/modules/html/code/FingerprintsFPFileIO.html @ 0:73ae111cf86f draft

Uploaded
author deepakjadmin
date Wed, 20 Jan 2016 11:55:01 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mayachemtools/docs/modules/html/code/FingerprintsFPFileIO.html	Wed Jan 20 11:55:01 2016 -0500
@@ -0,0 +1,1575 @@
+<html>
+<head>
+<title>MayaChemTools:Code:FileIO::FingerprintsFPFileIO.pm</title>
+<meta http-equiv="content-type" content="text/html;charset=utf-8">
+<link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css">
+</head>
+<body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10">
+<br/>
+<center>
+<a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a>
+</center>
+<br/>
+<pre>
+<a name="package-FileIO::FingerprintsFPFileIO-"></a>   1 <span class="k">package </span><span class="i">FileIO::FingerprintsFPFileIO</span><span class="sc">;</span>
+   2 <span class="c">#</span>
+   3 <span class="c"># $RCSfile: FingerprintsFPFileIO.pm,v $</span>
+   4 <span class="c"># $Date: 2015/02/28 20:48:43 $</span>
+   5 <span class="c"># $Revision: 1.19 $</span>
+   6 <span class="c">#</span>
+   7 <span class="c"># Author: Manish Sud &lt;msud@san.rr.com&gt;</span>
+   8 <span class="c">#</span>
+   9 <span class="c"># Copyright (C) 2015 Manish Sud. All rights reserved.</span>
+  10 <span class="c">#</span>
+  11 <span class="c"># This file is part of MayaChemTools.</span>
+  12 <span class="c">#</span>
+  13 <span class="c"># MayaChemTools is free software; you can redistribute it and/or modify it under</span>
+  14 <span class="c"># the terms of the GNU Lesser General Public License as published by the Free</span>
+  15 <span class="c"># Software Foundation; either version 3 of the License, or (at your option) any</span>
+  16 <span class="c"># later version.</span>
+  17 <span class="c">#</span>
+  18 <span class="c"># MayaChemTools is distributed in the hope that it will be useful, but without</span>
+  19 <span class="c"># any warranty; without even the implied warranty of merchantability of fitness</span>
+  20 <span class="c"># for a particular purpose.  See the GNU Lesser General Public License for more</span>
+  21 <span class="c"># details.</span>
+  22 <span class="c">#</span>
+  23 <span class="c"># You should have received a copy of the GNU Lesser General Public License</span>
+  24 <span class="c"># along with MayaChemTools; if not, see &lt;http://www.gnu.org/licenses/&gt; or</span>
+  25 <span class="c"># write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,</span>
+  26 <span class="c"># Boston, MA, 02111-1307, USA.</span>
+  27 <span class="c">#</span>
+  28 
+  29 <span class="k">use</span> <span class="w">strict</span><span class="sc">;</span>
+  30 <span class="k">use</span> <span class="w">Carp</span><span class="sc">;</span>
+  31 <span class="k">use</span> <span class="w">Exporter</span><span class="sc">;</span>
+  32 <span class="k">use</span> <span class="w">Scalar::Util</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  33 <span class="k">use</span> <span class="w">TextUtil</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  34 <span class="k">use</span> <span class="w">FileUtil</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  35 <span class="k">use</span> <span class="w">TimeUtil</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  36 <span class="k">use</span> <span class="w">Fingerprints::FingerprintsStringUtil</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  37 <span class="k">use</span> <span class="w">PackageInfo</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  38 <span class="k">use</span> <span class="w">FileIO::FileIO</span><span class="sc">;</span>
+  39 
+  40 <span class="k">use</span> <span class="w">vars</span> <span class="q">qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS)</span><span class="sc">;</span>
+  41 
+  42 <span class="i">@ISA</span> = <span class="q">qw(FileIO::FileIO Exporter)</span><span class="sc">;</span>
+  43 <span class="i">@EXPORT</span> = <span class="q">qw()</span><span class="sc">;</span>
+  44 <span class="i">@EXPORT_OK</span> = <span class="q">qw(IsFingerprintsFPFile)</span><span class="sc">;</span>
+  45 
+  46 <span class="i">%EXPORT_TAGS</span> = <span class="s">(</span><span class="w">all</span>  <span class="cm">=&gt;</span> <span class="s">[</span><span class="i">@EXPORT</span><span class="cm">,</span> <span class="i">@EXPORT_OK</span><span class="s">]</span><span class="s">)</span><span class="sc">;</span>
+  47 
+  48 <span class="c"># Setup class variables...</span>
+  49 <span class="k">my</span><span class="s">(</span><span class="i">$ClassName</span><span class="s">)</span><span class="sc">;</span>
+  50 <span class="i">_InitializeClass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  51 
+  52 <span class="c"># Class constructor...</span>
+<a name="new-"></a>  53 <span class="k">sub </span><span class="m">new</span> <span class="s">{</span>
+  54   <span class="k">my</span><span class="s">(</span><span class="i">$Class</span><span class="cm">,</span> <span class="i">%NamesAndValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+  55 
+  56   <span class="c"># Initialize object...</span>
+  57   <span class="k">my</span> <span class="i">$This</span> = <span class="i">$Class</span><span class="i">-&gt;SUPER::new</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  58   <span class="k">bless</span> <span class="i">$This</span><span class="cm">,</span> <span class="k">ref</span><span class="s">(</span><span class="i">$Class</span><span class="s">)</span> || <span class="i">$Class</span><span class="sc">;</span>
+  59   <span class="i">$This</span><span class="i">-&gt;_InitializeFingerprintsFPFileIO</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  60 
+  61   <span class="i">$This</span><span class="i">-&gt;_InitializeFingerprintsFPFileIOProperties</span><span class="s">(</span><span class="i">%NamesAndValues</span><span class="s">)</span><span class="sc">;</span>
+  62 
+  63   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+  64 <span class="s">}</span>
+  65 
+  66 <span class="c"># Initialize object data...</span>
+  67 <span class="c">#</span>
+<a name="_InitializeFingerprintsFPFileIO-"></a>  68 <span class="k">sub </span><span class="m">_InitializeFingerprintsFPFileIO</span> <span class="s">{</span>
+  69   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+  70 
+  71   <span class="c"># Fingerprints string data format during read/write...</span>
+  72   <span class="c">#</span>
+  73   <span class="c"># For file read:</span>
+  74   <span class="c">#</span>
+  75   <span class="c"># AutoDetect  - automatically detect format of fingerprints string</span>
+  76   <span class="c"># FingerprintsBitVectorString - Bit vector fingerprints string format</span>
+  77   <span class="c"># FingerprintsVectorString - Vector fingerprints string format</span>
+  78   <span class="c">#</span>
+  79   <span class="c"># Default value: AutoDetect</span>
+  80   <span class="c">#</span>
+  81   <span class="c"># For file write:</span>
+  82   <span class="c">#</span>
+  83   <span class="c"># FingerprintsBitVectorString - Bit vector fingerprints string format</span>
+  84   <span class="c"># FingerprintsVectorString - Vector fingerprints string format</span>
+  85   <span class="c">#</span>
+  86   <span class="c"># Default value: undef</span>
+  87   <span class="c">#</span>
+  88   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsStringMode</span>} = <span class="k">undef</span><span class="sc">;</span>
+  89 
+  90   <span class="c"># For file read:</span>
+  91   <span class="c">#</span>
+  92   <span class="c">#   o Fingerprints bit-vector and vector object for current fingerprints string</span>
+  93   <span class="c">#</span>
+  94   <span class="c"># For file write:</span>
+  95   <span class="c">#</span>
+  96   <span class="c">#   o Fingerprints bit-vector and vector object for current fingerprints string</span>
+  97   <span class="c">#   o Any supported fingerprints object: PathLengthFingerprints, ExtendedConnectivity, and so on.</span>
+  98   <span class="c">#</span>
+  99   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsObject</span>} = <span class="k">undef</span><span class="sc">;</span>
+ 100 
+ 101   <span class="c"># Fingeprints string for current line during read/write...</span>
+ 102   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>} = <span class="k">undef</span><span class="sc">;</span>
+ 103 
+ 104   <span class="c"># Partial fingeprints string corresponding to what&#39;s on the current line for current</span>
+ 105   <span class="c"># line during read/write...</span>
+ 106   <span class="i">$This</span>-&gt;{<span class="w">PartialFingerprintsString</span>} = <span class="k">undef</span><span class="sc">;</span>
+ 107 
+ 108   <span class="c"># Required header data keys and values during read/write...</span>
+ 109   <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeys</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 110   <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 111 
+ 112   <span class="c"># First data line read/write...</span>
+ 113   <span class="i">$This</span>-&gt;{<span class="w">FirstDataLineIO</span>} = <span class="n">1</span><span class="sc">;</span>
+ 114 
+ 115   <span class="c"># Current fingerprints string data line number during read/write...</span>
+ 116   <span class="i">$This</span>-&gt;{<span class="w">LineNum</span>} = <span class="n">0</span><span class="sc">;</span>
+ 117 
+ 118   <span class="c"># FP line data during read/write...</span>
+ 119   <span class="i">$This</span>-&gt;{<span class="w">DataLine</span>} = <span class="k">undef</span><span class="sc">;</span>
+ 120 
+ 121   <span class="c"># Initialize parameters for read...</span>
+ 122   <span class="i">$This</span><span class="i">-&gt;_InitializeFingerprintsFPFileIORead</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 123 
+ 124   <span class="c"># Initialize parameters for write...</span>
+ 125   <span class="i">$This</span><span class="i">-&gt;_InitializeFingerprintsFPFileIOWrite</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 126 
+ 127   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 128 <span class="s">}</span>
+ 129 
+ 130 <span class="c"># Initialize class ...</span>
+<a name="_InitializeClass-"></a> 131 <span class="k">sub </span><span class="m">_InitializeClass</span> <span class="s">{</span>
+ 132   <span class="c">#Class name...</span>
+ 133   <span class="i">$ClassName</span> = <span class="w">__PACKAGE__</span><span class="sc">;</span>
+ 134 
+ 135 <span class="s">}</span>
+ 136 
+ 137 <span class="c"># Initialize object data for reading fingerprints FP file...</span>
+ 138 <span class="c">#</span>
+<a name="_InitializeFingerprintsFPFileIORead-"></a> 139 <span class="k">sub </span><span class="m">_InitializeFingerprintsFPFileIORead</span> <span class="s">{</span>
+ 140   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 141 
+ 142   <span class="c"># Header data keys and values...</span>
+ 143   <span class="c">#</span>
+ 144   <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">HeaderDataKeys</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 145   <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">HeaderDataKeysAndValues</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 146   <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">CannonicalHeaderDataKeysAndValues</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 147 
+ 148   <span class="c"># By default, the fingerprints data is assumed to be valid and no validation is</span>
+ 149   <span class="c"># performed before generating fingerprints objects...</span>
+ 150   <span class="c">#</span>
+ 151   <span class="i">$This</span>-&gt;{<span class="w">ValidateData</span>} = <span class="n">1</span><span class="sc">;</span>
+ 152 
+ 153   <span class="c"># Level of detail to print during validation of data for invalid or missing data...</span>
+ 154   <span class="i">$This</span>-&gt;{<span class="w">DetailLevel</span>} = <span class="n">1</span><span class="sc">;</span>
+ 155 
+ 156   <span class="c"># Number of missing and invalid fingerprints string data lines...</span>
+ 157   <span class="i">$This</span>-&gt;{<span class="w">NumOfLinesWithMissingData</span>} = <span class="n">0</span><span class="sc">;</span>
+ 158   <span class="i">$This</span>-&gt;{<span class="w">NumOfLinesWithInvalidData</span>} = <span class="n">0</span><span class="sc">;</span>
+ 159 
+ 160   <span class="c"># Compound ID for current fingerprints string...</span>
+ 161   <span class="i">$This</span>-&gt;{<span class="w">CompoundID</span>} = <span class="k">undef</span><span class="sc">;</span>
+ 162 
+ 163   <span class="c"># Status of data in fingerprints FP file...</span>
+ 164   <span class="i">$This</span>-&gt;{<span class="w">ValidFileData</span>} = <span class="n">0</span><span class="sc">;</span>
+ 165   <span class="i">$This</span>-&gt;{<span class="w">ValidRequiredHeaderDataKeys</span>} = <span class="n">0</span><span class="sc">;</span>
+ 166   <span class="i">$This</span>-&gt;{<span class="w">ValidFingerprintsStringMode</span>} = <span class="n">0</span><span class="sc">;</span>
+ 167 
+ 168   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 169 <span class="s">}</span>
+ 170 
+ 171 <span class="c"># Initialize object data for writing fingerprints FP file...</span>
+ 172 <span class="c">#</span>
+<a name="_InitializeFingerprintsFPFileIOWrite-"></a> 173 <span class="k">sub </span><span class="m">_InitializeFingerprintsFPFileIOWrite</span> <span class="s">{</span>
+ 174   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 175 
+ 176   <span class="c"># Fingerprints bit vector string format...</span>
+ 177   <span class="c">#</span>
+ 178   <span class="c"># Possible values: BinaryString or HexadecimalString [Default]</span>
+ 179   <span class="c">#</span>
+ 180   <span class="c"># Default BitStringFormat is set during first write using Fingerprints::FingerprintsStringUtil::GetDefaultBitStringFormat.</span>
+ 181   <span class="c">#</span>
+ 182   <span class="i">$This</span>-&gt;{<span class="w">BitStringFormat</span>} = <span class="k">undef</span><span class="sc">;</span>
+ 183 
+ 184   <span class="c"># Bits order in fingerprints bit vector string...</span>
+ 185   <span class="c">#</span>
+ 186   <span class="c"># Ascending - First bit in each byte as the lowest bit [Default]</span>
+ 187   <span class="c"># Descending - First bit in each byte as the highest bit</span>
+ 188   <span class="c">#</span>
+ 189   <span class="c"># Default BitsOrder is set during first write using Fingerprints::FingerprintsStringUtil::GetDefaultBitsOrder.</span>
+ 190   <span class="c">#</span>
+ 191   <span class="i">$This</span>-&gt;{<span class="w">BitsOrder</span>} = <span class="k">undef</span><span class="sc">;</span>
+ 192 
+ 193   <span class="c"># Fingerprints vector string format...</span>
+ 194   <span class="c">#</span>
+ 195   <span class="c"># Possible values: IDsAndValuesString, IDsAndValuesPairsString, ValuesAndIDsString, ValuesAndIDsPairsString, ValuesString</span>
+ 196   <span class="c">#</span>
+ 197   <span class="c"># Default VectorStringFormat is set during first write using Fingerprints::FingerprintsStringUtil::GetDefaultVectorStringFormat.</span>
+ 198   <span class="c"># For fingerprints vector object containing vector NumericalValues, it corresponds to IDsAndValuesString; otherwise,</span>
+ 199   <span class="c"># it&#39;s set to ValuesString.</span>
+ 200   <span class="c">#</span>
+ 201   <span class="i">$This</span>-&gt;{<span class="w">VectorStringFormat</span>} = <span class="k">undef</span><span class="sc">;</span>
+ 202 
+ 203   <span class="c"># Overwriting existing file...</span>
+ 204   <span class="i">$This</span>-&gt;{<span class="w">Overwrite</span>} = <span class="n">0</span><span class="sc">;</span>
+ 205 
+ 206   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 207 <span class="s">}</span>
+ 208 
+ 209 <span class="c"># Initialize object values...</span>
+<a name="_InitializeFingerprintsFPFileIOProperties-"></a> 210 <span class="k">sub </span><span class="m">_InitializeFingerprintsFPFileIOProperties</span> <span class="s">{</span>
+ 211   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">%NamesAndValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 212 
+ 213   <span class="c"># All other property names and values along with all Set/Get&lt;PropertyName&gt; methods</span>
+ 214   <span class="c"># are implemented on-demand using ObjectProperty class.</span>
+ 215 
+ 216   <span class="k">my</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$MethodName</span><span class="s">)</span><span class="sc">;</span>
+ 217   <span class="k">while</span> <span class="s">(</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="k">each</span>  <span class="i">%NamesAndValues</span><span class="s">)</span> <span class="s">{</span>
+ 218     <span class="i">$MethodName</span> = <span class="q">&quot;Set${Name}&quot;</span><span class="sc">;</span>
+ 219     <span class="i">$This</span><span class="i">-&gt;$MethodName</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
+ 220   <span class="s">}</span>
+ 221 
+ 222   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$NamesAndValues</span>{<span class="w">Name</span>}<span class="s">)</span> <span class="s">{</span>
+ 223     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;New: Object can&#39;t be instantiated without specifying file name...&quot;</span><span class="sc">;</span>
+ 224   <span class="s">}</span>
+ 225 
+ 226   <span class="c"># Make sure it&#39;s a fingerprints file...</span>
+ 227   <span class="i">$Name</span> = <span class="i">$NamesAndValues</span>{<span class="w">Name</span>}<span class="sc">;</span>
+ 228   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsFingerprintsFPFile</span><span class="s">(</span><span class="i">$Name</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 229     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;New: Object can&#39;t be instantiated: File, $Name, doesn&#39;t appear to be fingerprints format...&quot;</span><span class="sc">;</span>
+ 230   <span class="s">}</span>
+ 231 
+ 232   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetMode</span><span class="s">(</span><span class="s">)</span> =~ <span class="q">/^Read$/i</span><span class="s">)</span> <span class="s">{</span>
+ 233     <span class="i">$This</span><span class="i">-&gt;_InitializeFingerprintsFPFileIOReadProperties</span><span class="s">(</span><span class="i">%NamesAndValues</span><span class="s">)</span><span class="sc">;</span>
+ 234   <span class="s">}</span>
+ 235   <span class="k">elsif</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetMode</span><span class="s">(</span><span class="s">)</span> =~ <span class="q">/^(Write|Append)$/i</span><span class="s">)</span> <span class="s">{</span>
+ 236     <span class="i">$This</span><span class="i">-&gt;_InitializeFingerprintsFPFileIOWriteProperties</span><span class="s">(</span><span class="i">%NamesAndValues</span><span class="s">)</span><span class="sc">;</span>
+ 237   <span class="s">}</span>
+ 238 
+ 239   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 240 <span class="s">}</span>
+ 241 
+ 242 <span class="c"># Initialize object properties for reading fingerprints FP file...</span>
+ 243 <span class="c">#</span>
+<a name="_InitializeFingerprintsFPFileIOReadProperties-"></a> 244 <span class="k">sub </span><span class="m">_InitializeFingerprintsFPFileIOReadProperties</span> <span class="s">{</span>
+ 245   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">%NamesAndValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 246 
+ 247   <span class="c"># Set default value for FingerprintsStringMode...</span>
+ 248   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>-&gt;{<span class="w">FingerprintsStringMode</span>}<span class="s">)</span> <span class="s">{</span>
+ 249     <span class="i">$This</span>-&gt;{<span class="w">FingerprintsStringMode</span>} = <span class="q">&#39;AutoDetect&#39;</span><span class="sc">;</span>
+ 250   <span class="s">}</span>
+ 251 
+ 252   <span class="i">$This</span><span class="i">-&gt;_PrepareForReadingFingerprintsFPFileData</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 253 
+ 254   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 255 <span class="s">}</span>
+ 256 
+ 257 <span class="c"># Initialize object properties for writing fingerprints FP file...</span>
+ 258 <span class="c">#</span>
+<a name="_InitializeFingerprintsFPFileIOWriteProperties-"></a> 259 <span class="k">sub </span><span class="m">_InitializeFingerprintsFPFileIOWriteProperties</span> <span class="s">{</span>
+ 260   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">%NamesAndValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 261 
+ 262   <span class="c"># Check FingerprintsStringMode value...</span>
+ 263   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$NamesAndValues</span>{<span class="w">FingerprintsStringMode</span>}<span class="s">)</span> <span class="s">{</span>
+ 264     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;New: Object can&#39;t be instantiated without specifying FingerprintsStringMode...&quot;</span><span class="sc">;</span>
+ 265   <span class="s">}</span>
+ 266 
+ 267   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsStringMode</span>} !~ <span class="q">/^(FingerprintsBitVectorString|FingerprintsVectorString)$/i</span><span class="s">)</span> <span class="s">{</span>
+ 268     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;New: Object can&#39;t be instantiated: FingerprintsStringMode value, $This-&gt;{FingerprintsStringMode}, is not valid; Supported values for write/append: FingerprintsBitVectorString or FingerprintsVectorString...&quot;</span><span class="sc">;</span>
+ 269   <span class="s">}</span>
+ 270 
+ 271   <span class="i">$This</span><span class="i">-&gt;_PrepareForWritingFingerprintsFPFileData</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 272 
+ 273   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 274 <span class="s">}</span>
+ 275 
+ 276 <span class="c"># Set FingerprintsStringMode...</span>
+ 277 <span class="c">#</span>
+<a name="SetFingerprintsStringMode-"></a> 278 <span class="k">sub </span><span class="m">SetFingerprintsStringMode</span> <span class="s">{</span>
+ 279   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 280 
+ 281   <span class="c"># AutoDetect - automatically detect format of fingerprints string</span>
+ 282   <span class="c"># FingerprintsBitVectorString - Bit vector fingerprints string format</span>
+ 283   <span class="c"># FingerprintsVectorString - Vector fingerprints string format</span>
+ 284 
+ 285   <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> !~ <span class="q">/^(AutoDetect|FingerprintsBitVectorString|FingerprintsVectorString)$/i</span><span class="s">)</span> <span class="s">{</span>
+ 286     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetFingerprintsStringMode: FingerprintsStringMode value, $Value, is not valid; Supported values: AutoDetect, FingerprintsBitVectorString or FingerprintsVectorString...&quot;</span><span class="sc">;</span>
+ 287   <span class="s">}</span>
+ 288 
+ 289   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsStringMode</span>} = <span class="i">$Value</span><span class="sc">;</span>
+ 290 
+ 291   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 292 <span class="s">}</span>
+ 293 
+ 294 <span class="c"># Set DetailLevel...</span>
+ 295 <span class="c">#</span>
+<a name="SetDetailLevel-"></a> 296 <span class="k">sub </span><span class="m">SetDetailLevel</span> <span class="s">{</span>
+ 297   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 298 
+ 299   <span class="k">if</span> <span class="s">(</span>!<span class="i">TextUtil::IsPositiveInteger</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 300     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetDetailLevel: DetailLevel value, $Value, is not valid; Supported values: &gt; 0...&quot;</span><span class="sc">;</span>
+ 301   <span class="s">}</span>
+ 302 
+ 303   <span class="i">$This</span>-&gt;{<span class="w">DetailLevel</span>} = <span class="i">$Value</span><span class="sc">;</span>
+ 304 
+ 305   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 306 <span class="s">}</span>
+ 307 
+ 308 <span class="c"># Set BitStringFormat...</span>
+ 309 <span class="c">#</span>
+<a name="SetBitStringFormat-"></a> 310 <span class="k">sub </span><span class="m">SetBitStringFormat</span> <span class="s">{</span>
+ 311   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 312 
+ 313   <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> !~ <span class="q">/^(BinaryString|HexadecimalString)$/i</span><span class="s">)</span> <span class="s">{</span>
+ 314     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetBitStringFormat: BitStringFormat value, $Value, is not valid; Supported values: BinaryString or HexadecimalString...&quot;</span><span class="sc">;</span>
+ 315   <span class="s">}</span>
+ 316 
+ 317   <span class="i">$This</span>-&gt;{<span class="w">BitStringFormat</span>} = <span class="i">$Value</span><span class="sc">;</span>
+ 318 
+ 319   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 320 <span class="s">}</span>
+ 321 
+ 322 <span class="c"># Set BitsOrder...</span>
+ 323 <span class="c">#</span>
+<a name="SetBitsOrder-"></a> 324 <span class="k">sub </span><span class="m">SetBitsOrder</span> <span class="s">{</span>
+ 325   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 326 
+ 327   <span class="c"># Ascending - First bit in each byte as the lowest bit</span>
+ 328   <span class="c"># Descending - First bit in each byte as the highest bit</span>
+ 329   <span class="c">#</span>
+ 330   <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> !~ <span class="q">/^(Ascending|Descending)$/i</span><span class="s">)</span> <span class="s">{</span>
+ 331     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetBitsOrder: FingerprintsStringMode value, $Value, is not valid; Supported values: Ascending or Descending...&quot;</span><span class="sc">;</span>
+ 332   <span class="s">}</span>
+ 333 
+ 334   <span class="i">$This</span>-&gt;{<span class="w">BitsOrder</span>} = <span class="i">$Value</span><span class="sc">;</span>
+ 335 
+ 336   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 337 <span class="s">}</span>
+ 338 
+ 339 <span class="c"># Set compound ID...</span>
+ 340 <span class="c">#</span>
+<a name="SetCompoundID-"></a> 341 <span class="k">sub </span><span class="m">SetCompoundID</span> <span class="s">{</span>
+ 342   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 343 
+ 344   <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> =~ <span class="q">/ /</span><span class="s">)</span> <span class="s">{</span>
+ 345     <span class="i">$Value</span> =~ <span class="q">s/ //g</span><span class="sc">;</span>
+ 346     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetCompoundID: Spaces are not allowed in compound ID; They have been removed...&quot;</span><span class="sc">;</span>
+ 347   <span class="s">}</span>
+ 348 
+ 349   <span class="i">$This</span>-&gt;{<span class="w">CompoundID</span>} = <span class="i">$Value</span><span class="sc">;</span>
+ 350 
+ 351   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 352 <span class="s">}</span>
+ 353 
+ 354 <span class="c"># Set VectorStringFormat...</span>
+ 355 <span class="c">#</span>
+<a name="SetVectorStringFormat-"></a> 356 <span class="k">sub </span><span class="m">SetVectorStringFormat</span> <span class="s">{</span>
+ 357   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 358 
+ 359   <span class="c"># Possible values: IDsAndValuesString, IDsAndValuesPairsString, ValuesAndIDsString, ValuesAndIDsPairsString</span>
+ 360 
+ 361   <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> !~ <span class="q">/^(IDsAndValuesString|IDsAndValuesPairsString|ValuesAndIDsString|ValuesAndIDsPairsString|ValuesString)$/i</span><span class="s">)</span> <span class="s">{</span>
+ 362     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetVectorStringFormat: FingerprintsStringMode value, $Value, is not valid; Supported values: IDsAndValuesString, IDsAndValuesPairsString, ValuesAndIDsString, ValuesAndIDsPairsString, or ValuesString...&quot;</span><span class="sc">;</span>
+ 363   <span class="s">}</span>
+ 364 
+ 365   <span class="i">$This</span>-&gt;{<span class="w">VectorStringFormat</span>} = <span class="i">$Value</span><span class="sc">;</span>
+ 366 
+ 367   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 368 <span class="s">}</span>
+ 369 
+ 370 <span class="c"># Get header data keys or number of header data keys in header data block...</span>
+ 371 <span class="c">#</span>
+<a name="GetHeaderDataKeys-"></a> 372 <span class="k">sub </span><span class="m">GetHeaderDataKeys</span> <span class="s">{</span>
+ 373   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 374 
+ 375   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">HeaderDataKeys</span>}} <span class="co">:</span> <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">HeaderDataKeys</span>}}<span class="sc">;</span>
+ 376 <span class="s">}</span>
+ 377 
+ 378 <span class="c"># Set header data keys...</span>
+ 379 <span class="c">#</span>
+<a name="SetHeaderDataKeys-"></a> 380 <span class="k">sub </span><span class="m">SetHeaderDataKeys</span> <span class="s">{</span>
+ 381   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Keys</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 382 
+ 383   <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetHeaderDataKeys: Can&#39;t set HeaderDataKeys: Not allowed...&quot;</span><span class="sc">;</span>
+ 384 
+ 385   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 386 <span class="s">}</span>
+ 387 
+ 388 <span class="c"># Get header data keys and values hash...</span>
+ 389 <span class="c">#</span>
+<a name="GetHeaderDataKeysAndValues-"></a> 390 <span class="k">sub </span><span class="m">GetHeaderDataKeysAndValues</span> <span class="s">{</span>
+ 391   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 392 
+ 393   <span class="k">return</span> <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">HeaderDataKeysAndValues</span>}}<span class="sc">;</span>
+ 394 <span class="s">}</span>
+ 395 
+ 396 <span class="c"># Set header data keys and values hash...</span>
+ 397 <span class="c">#</span>
+<a name="SetHeaderDataKeysAndValues-"></a> 398 <span class="k">sub </span><span class="m">SetHeaderDataKeysAndValues</span> <span class="s">{</span>
+ 399   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">%KeysAndValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 400 
+ 401   <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetHeaderDataKeysAndValues: Can&#39;t set HeaderDataKeysAndValues: Not allowed...&quot;</span><span class="sc">;</span>
+ 402 
+ 403   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 404 <span class="s">}</span>
+ 405 
+ 406 <span class="c"># Get required header data keys or number of header data keys in header data block...</span>
+ 407 <span class="c">#</span>
+<a name="GetRequiredHeaderDataKeys-"></a> 408 <span class="k">sub </span><span class="m">GetRequiredHeaderDataKeys</span> <span class="s">{</span>
+ 409   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 410 
+ 411   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeys</span>}} <span class="co">:</span> <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeys</span>}}<span class="sc">;</span>
+ 412 <span class="s">}</span>
+ 413 
+ 414 <span class="c"># Set required header data keys...</span>
+ 415 <span class="c">#</span>
+<a name="SetRequiredHeaderDataKeys-"></a> 416 <span class="k">sub </span><span class="m">SetRequiredHeaderDataKeys</span> <span class="s">{</span>
+ 417   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Keys</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 418 
+ 419   <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetRequiredHeaderDataKeys: Can&#39;t set RequiredHeaderDataKeys: Not allowed...&quot;</span><span class="sc">;</span>
+ 420 
+ 421   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 422 <span class="s">}</span>
+ 423 
+ 424 <span class="c"># Get required header data keys and values hash...</span>
+ 425 <span class="c">#</span>
+<a name="GetRequiredHeaderDataKeysAndValues-"></a> 426 <span class="k">sub </span><span class="m">GetRequiredHeaderDataKeysAndValues</span> <span class="s">{</span>
+ 427   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 428 
+ 429   <span class="k">return</span> <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}}<span class="sc">;</span>
+ 430 <span class="s">}</span>
+ 431 
+ 432 <span class="c"># Set required header data keys and values hash...</span>
+ 433 <span class="c">#</span>
+<a name="SetRequiredHeaderDataKeysAndValues-"></a> 434 <span class="k">sub </span><span class="m">SetRequiredHeaderDataKeysAndValues</span> <span class="s">{</span>
+ 435   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">%KeysAndValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 436 
+ 437   <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetRequiredHeaderDataKeysAndValues: Can&#39;t set RequiredHeaderDataKeysAndValues: Not allowed...&quot;</span><span class="sc">;</span>
+ 438 
+ 439   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 440 <span class="s">}</span>
+ 441 
+ 442 <span class="c"># Get fingerprints object for current data line...</span>
+ 443 <span class="c">#</span>
+<a name="GetFingerprints-"></a> 444 <span class="k">sub </span><span class="m">GetFingerprints</span> <span class="s">{</span>
+ 445   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 446 
+ 447   <span class="k">return</span> <span class="i">$This</span>-&gt;{<span class="w">FingerprintsObject</span>}<span class="sc">;</span>
+ 448 <span class="s">}</span>
+ 449 
+ 450 <span class="c"># Set fingerprints object for current data line...</span>
+ 451 <span class="c">#</span>
+<a name="SetFingerprints-"></a> 452 <span class="k">sub </span><span class="m">SetFingerprints</span> <span class="s">{</span>
+ 453   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$FingerprintsObject</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 454 
+ 455   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsObject</span>} = <span class="i">$FingerprintsObject</span><span class="sc">;</span>
+ 456 
+ 457   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 458 <span class="s">}</span>
+ 459 
+ 460 <span class="c"># Get fingerprints string  for current data line...</span>
+ 461 <span class="c">#</span>
+<a name="GetFingerprintsString-"></a> 462 <span class="k">sub </span><span class="m">GetFingerprintsString</span> <span class="s">{</span>
+ 463   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 464 
+ 465   <span class="k">return</span> <span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>} ? <span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>} <span class="co">:</span> <span class="q">&#39;None&#39;</span><span class="sc">;</span>
+ 466 <span class="s">}</span>
+ 467 
+ 468 <span class="c"># Set fingerprints string for current data line...</span>
+ 469 <span class="c">#</span>
+<a name="SetFingerprintsString-"></a> 470 <span class="k">sub </span><span class="m">SetFingerprintsString</span> <span class="s">{</span>
+ 471   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$FingerprintsString</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 472 
+ 473   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>} = <span class="i">$FingerprintsString</span><span class="sc">;</span>
+ 474 
+ 475   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 476 <span class="s">}</span>
+ 477 
+ 478 <span class="c"># Get partial fingerprints string  for current data line...</span>
+ 479 <span class="c">#</span>
+<a name="GetPartialFingerprintsString-"></a> 480 <span class="k">sub </span><span class="m">GetPartialFingerprintsString</span> <span class="s">{</span>
+ 481   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 482 
+ 483   <span class="k">return</span> <span class="i">$This</span>-&gt;{<span class="w">PartialFingerprintsString</span>} ? <span class="i">$This</span>-&gt;{<span class="w">PartialFingerprintsString</span>} <span class="co">:</span> <span class="q">&#39;None&#39;</span><span class="sc">;</span>
+ 484 <span class="s">}</span>
+ 485 
+ 486 <span class="c"># Set partial fingerprints string for current data line...</span>
+ 487 <span class="c">#</span>
+<a name="SetPartialFingerprintsString-"></a> 488 <span class="k">sub </span><span class="m">SetPartialFingerprintsString</span> <span class="s">{</span>
+ 489   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$PartialFingerprintsString</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 490 
+ 491   <span class="i">$This</span>-&gt;{<span class="w">PartialFingerprintsString</span>} = <span class="i">$PartialFingerprintsString</span><span class="sc">;</span>
+ 492 
+ 493   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 494 <span class="s">}</span>
+ 495 
+ 496 <span class="c"># Does fingerprints FP file contain valid data?</span>
+ 497 <span class="c">#</span>
+<a name="IsFingerprintsFileDataValid-"></a> 498 <span class="k">sub </span><span class="m">IsFingerprintsFileDataValid</span> <span class="s">{</span>
+ 499   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 500 
+ 501   <span class="k">return</span> <span class="i">$This</span>-&gt;{<span class="w">ValidFileData</span>} ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+ 502 <span class="s">}</span>
+ 503 
+ 504 <span class="c"># Does current data line contains valid fingerprints object data?</span>
+ 505 <span class="c">#</span>
+<a name="IsFingerprintsDataValid-"></a> 506 <span class="k">sub </span><span class="m">IsFingerprintsDataValid</span> <span class="s">{</span>
+ 507   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 508 
+ 509   <span class="k">return</span> <span class="k">defined</span> <span class="i">$This</span>-&gt;{<span class="w">FingerprintsObject</span>} ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+ 510 <span class="s">}</span>
+ 511 
+ 512 <span class="c"># Check presence of a header data key...</span>
+ 513 <span class="c">#</span>
+<a name="IsHeaderDataKeyPresent-"></a> 514 <span class="k">sub </span><span class="m">IsHeaderDataKeyPresent</span> <span class="s">{</span>
+ 515   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Key</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 516   <span class="k">my</span><span class="s">(</span><span class="i">$CannonicalKey</span><span class="s">)</span><span class="sc">;</span>
+ 517 
+ 518   <span class="i">$CannonicalKey</span> = <span class="k">lc</span> <span class="i">$Key</span><span class="sc">;</span>
+ 519 
+ 520   <span class="k">return</span> <span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">CannonicalHeaderDataKeysAndValues</span>}{<span class="i">$CannonicalKey</span>} ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+ 521 <span class="s">}</span>
+ 522 
+ 523 <span class="c"># Get value of header data key...</span>
+ 524 <span class="c">#</span>
+<a name="GetHeaderDataKeyValue-"></a> 525 <span class="k">sub </span><span class="m">GetHeaderDataKeyValue</span> <span class="s">{</span>
+ 526   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Key</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 527   <span class="k">my</span><span class="s">(</span><span class="i">$CannonicalKey</span><span class="s">)</span><span class="sc">;</span>
+ 528 
+ 529   <span class="i">$CannonicalKey</span> = <span class="k">lc</span> <span class="i">$Key</span><span class="sc">;</span>
+ 530 
+ 531   <span class="k">return</span> <span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">CannonicalHeaderDataKeysAndValues</span>}{<span class="i">$CannonicalKey</span>} ?  <span class="i">$This</span>-&gt;{<span class="w">CannonicalHeaderDataKeysAndValues</span>}{<span class="i">$CannonicalKey</span>} <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span>
+ 532 <span class="s">}</span>
+ 533 
+ 534 <span class="c">#</span>
+ 535 <span class="c"># Read next available fingerprints line, process it and generate appropriate fingerprints</span>
+ 536 <span class="c"># objects...</span>
+ 537 <span class="c">#</span>
+<a name="Read-"></a> 538 <span class="k">sub </span><span class="m">Read</span> <span class="s">{</span>
+ 539   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 540 
+ 541   <span class="c"># Read data line...</span>
+ 542   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;_ReadDataLine</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 543     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 544   <span class="s">}</span>
+ 545 
+ 546   <span class="c"># No need to process invalid FP file with invalid data...</span>
+ 547   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>-&gt;{<span class="w">ValidFileData</span>}<span class="s">)</span> <span class="s">{</span>
+ 548     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">ValidateData</span>}<span class="s">)</span> <span class="s">{</span>
+ 549       <span class="i">$This</span>-&gt;{<span class="w">NumOfLinesWithMissingData</span>} += <span class="n">1</span><span class="sc">;</span>
+ 550     <span class="s">}</span>
+ 551     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 552   <span class="s">}</span>
+ 553 
+ 554   <span class="c"># Perform data validation...</span>
+ 555   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">ValidateData</span>}<span class="s">)</span> <span class="s">{</span>
+ 556     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;_ValidateReadDataLine</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 557       <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 558     <span class="s">}</span>
+ 559   <span class="s">}</span>
+ 560 
+ 561   <span class="c"># Check again to handle problematic data for non-validated data lines...</span>
+ 562   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>}<span class="s">)</span> <span class="s">{</span>
+ 563     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 564   <span class="s">}</span>
+ 565 
+ 566   <span class="c"># Generate fingeprints object...</span>
+ 567   <span class="i">$This</span><span class="i">-&gt;_GenerateFingerprintsObject</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 568 
+ 569   <span class="c"># Setup fingerprints compound ID for fingerprints string...</span>
+ 570   <span class="i">$This</span><span class="i">-&gt;_GenerateCompoundID</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 571 
+ 572   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 573 <span class="s">}</span>
+ 574 
+ 575 <span class="c"># Read next available fingerprints line, process it and generate appropriate fingerprints</span>
+ 576 <span class="c"># objects...</span>
+ 577 <span class="c">#</span>
+<a name="Next-"></a> 578 <span class="k">sub </span><span class="m">Next</span> <span class="s">{</span>
+ 579   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 580 
+ 581   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;Read</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 582 <span class="s">}</span>
+ 583 
+ 584 <span class="c"># Read fingerprints data line line...</span>
+ 585 <span class="c">#</span>
+<a name="_ReadDataLine-"></a> 586 <span class="k">sub </span><span class="m">_ReadDataLine</span> <span class="s">{</span>
+ 587   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 588 
+ 589   <span class="c"># Initialize data for current line...</span>
+ 590   <span class="i">$This</span><span class="i">-&gt;_InitializeReadDataLine</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 591 
+ 592   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FirstDataLineIO</span>}<span class="s">)</span> <span class="s">{</span>
+ 593     <span class="c"># Get first data line...</span>
+ 594     <span class="i">$This</span><span class="i">-&gt;_ProcessFirstDataLineRead</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 595   <span class="s">}</span>
+ 596   <span class="k">else</span> <span class="s">{</span>
+ 597     <span class="c"># Get next data line...</span>
+ 598     <span class="i">$This</span>-&gt;{<span class="w">LineNum</span>} += <span class="n">1</span><span class="sc">;</span>
+ 599     <span class="i">$This</span>-&gt;{<span class="w">DataLine</span>} = <span class="i">TextUtil::GetTextLine</span><span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FileHandle</span>}<span class="s">)</span><span class="sc">;</span>
+ 600   <span class="s">}</span>
+ 601 
+ 602   <span class="c"># Is it end of file?</span>
+ 603   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>-&gt;{<span class="w">DataLine</span>}<span class="s">)</span> <span class="s">{</span>
+ 604     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 605   <span class="s">}</span>
+ 606 
+ 607   <span class="c"># Process data line to retrieve compound ID and fingerprints string information...</span>
+ 608   <span class="i">$This</span><span class="i">-&gt;_ProcessDataLineRead</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 609 
+ 610   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+ 611 <span class="s">}</span>
+ 612 
+ 613 <span class="c"># Process data line to retrieve compound ID and fingerprints string information...</span>
+ 614 <span class="c">#</span>
+<a name="_ProcessDataLineRead-"></a> 615 <span class="k">sub </span><span class="m">_ProcessDataLineRead</span> <span class="s">{</span>
+ 616   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 617   <span class="k">my</span><span class="s">(</span><span class="i">$CompoundID</span><span class="cm">,</span> <span class="i">$PartialFingerprintsString</span><span class="s">)</span><span class="sc">;</span>
+ 618 
+ 619   <span class="s">(</span><span class="i">$CompoundID</span><span class="cm">,</span> <span class="i">$PartialFingerprintsString</span><span class="s">)</span> = <span class="i">$This</span>-&gt;{<span class="w">DataLine</span>} =~ <span class="q">/^(.*?)[ ]+(.*?)$/</span><span class="sc">;</span>
+ 620 
+ 621   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$CompoundID</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$PartialFingerprintsString</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 622     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 623   <span class="s">}</span>
+ 624 
+ 625   <span class="i">$This</span>-&gt;{<span class="w">CompoundID</span>} = <span class="i">$CompoundID</span><span class="sc">;</span>
+ 626   <span class="i">$This</span>-&gt;{<span class="w">PartialFingerprintsString</span>} = <span class="i">$PartialFingerprintsString</span><span class="sc">;</span>
+ 627 
+ 628   <span class="c"># Set up fingerprints string...</span>
+ 629   <span class="i">$This</span><span class="i">-&gt;_GenerateFingerprintsStringFromPartialFingerprintsString</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 630 
+ 631   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 632 <span class="s">}</span>
+ 633 
+ 634 <span class="c"># Initialize data line for reading...</span>
+ 635 <span class="c">#</span>
+<a name="_InitializeReadDataLine-"></a> 636 <span class="k">sub </span><span class="m">_InitializeReadDataLine</span> <span class="s">{</span>
+ 637   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 638 
+ 639   <span class="i">$This</span>-&gt;{<span class="w">CompoundID</span>} = <span class="k">undef</span><span class="sc">;</span>
+ 640   <span class="i">$This</span>-&gt;{<span class="w">DataLine</span>} = <span class="k">undef</span><span class="sc">;</span>
+ 641 
+ 642   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsObject</span>} = <span class="k">undef</span><span class="sc">;</span>
+ 643 
+ 644   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>} = <span class="k">undef</span><span class="sc">;</span>
+ 645   <span class="i">$This</span>-&gt;{<span class="w">PartialFingerprintsString</span>} = <span class="k">undef</span><span class="sc">;</span>
+ 646 
+ 647   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 648 <span class="s">}</span>
+ 649 
+ 650 <span class="c"># Validate fingerprints string data line...</span>
+ 651 <span class="c">#</span>
+<a name="_ValidateReadDataLine-"></a> 652 <span class="k">sub </span><span class="m">_ValidateReadDataLine</span> <span class="s">{</span>
+ 653   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 654 
+ 655   <span class="c"># Check for missing data...</span>
+ 656   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">CompoundID</span>} &amp;&amp; <span class="i">$This</span>-&gt;{<span class="w">PartialFingerprintsString</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 657     <span class="c"># Missing data...</span>
+ 658     <span class="i">$This</span>-&gt;{<span class="w">NumOfLinesWithMissingData</span>} += <span class="n">1</span><span class="sc">;</span>
+ 659     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">DetailLevel</span>} &gt;= <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
+ 660       <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_ValidateReadDataLine: Data line number $This-&gt;{LineNum} contains no fingerprints data: $This-&gt;{DataLine}...&quot;</span><span class="sc">;</span>
+ 661     <span class="s">}</span>
+ 662     <span class="k">elsif</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">DetailLevel</span>} &gt;= <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+ 663       <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_ValidateReadDataLine: Data line number $This-&gt;{LineNum} contains no fingerprints data...&quot;</span><span class="sc">;</span>
+ 664     <span class="s">}</span>
+ 665     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 666   <span class="s">}</span>
+ 667 
+ 668   <span class="c"># Check for invalid data...</span>
+ 669   <span class="k">my</span><span class="s">(</span><span class="i">$InvalidFingerprintsData</span><span class="s">)</span><span class="sc">;</span>
+ 670 
+ 671   <span class="i">$InvalidFingerprintsData</span> = <span class="n">0</span><span class="sc">;</span>
+ 672   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>}<span class="s">)</span> <span class="s">{</span>
+ 673     <span class="i">$InvalidFingerprintsData</span> = <span class="i">Fingerprints::FingerprintsStringUtil::AreFingerprintsStringValuesValid</span><span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>}<span class="s">)</span> ? <span class="n">0</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span>
+ 674   <span class="s">}</span>
+ 675   <span class="k">else</span> <span class="s">{</span>
+ 676     <span class="i">$InvalidFingerprintsData</span> = <span class="n">1</span><span class="sc">;</span>
+ 677   <span class="s">}</span>
+ 678 
+ 679   <span class="k">if</span> <span class="s">(</span><span class="i">$InvalidFingerprintsData</span><span class="s">)</span> <span class="s">{</span>
+ 680     <span class="i">$This</span>-&gt;{<span class="w">NumOfLinesWithInvalidData</span>} += <span class="n">1</span><span class="sc">;</span>
+ 681     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">DetailLevel</span>} &gt;= <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
+ 682       <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_ValidateReadDataLine: Data line number $This-&gt;{LineNum} contains invalid fingerprints data: $This-&gt;{DataLine}...&quot;</span><span class="sc">;</span>
+ 683     <span class="s">}</span>
+ 684     <span class="k">elsif</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">DetailLevel</span>} &gt;= <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+ 685       <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_ValidateReadDataLine: Data line number $This-&gt;{LineNum} contains invalid fingerprints data...&quot;</span><span class="sc">;</span>
+ 686     <span class="s">}</span>
+ 687     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 688   <span class="s">}</span>
+ 689 
+ 690   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+ 691 <span class="s">}</span>
+ 692 
+ 693 <span class="c"># Setup fingerprints compound ID for fingerprints string...</span>
+<a name="_GenerateCompoundID-"></a> 694 <span class="k">sub </span><span class="m">_GenerateCompoundID</span> <span class="s">{</span>
+ 695   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 696 
+ 697   <span class="c"># Set fingerprints ID...</span>
+ 698   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsObject</span>}<span class="s">)</span> <span class="s">{</span>
+ 699     <span class="i">$This</span>-&gt;{<span class="w">FingerprintsObject</span>}<span class="i">-&gt;SetID</span><span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">CompoundID</span>}<span class="s">)</span><span class="sc">;</span>
+ 700   <span class="s">}</span>
+ 701 
+ 702   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 703 <span class="s">}</span>
+ 704 
+ 705 <span class="c"># Process first read...</span>
+ 706 <span class="c">#</span>
+<a name="_ProcessFirstDataLineRead-"></a> 707 <span class="k">sub </span><span class="m">_ProcessFirstDataLineRead</span> <span class="s">{</span>
+ 708   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 709   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span><span class="sc">;</span>
+ 710 
+ 711   <span class="i">$This</span>-&gt;{<span class="w">FirstDataLineIO</span>} = <span class="n">0</span><span class="sc">;</span>
+ 712 
+ 713   <span class="c"># Skip over header data lines and collect first data line...</span>
+ 714 
+ 715   <span class="j">LINE:</span> <span class="k">while</span> <span class="s">(</span><span class="i">$Line</span> = <span class="i">TextUtil::GetTextLine</span><span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FileHandle</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 716     <span class="i">$This</span>-&gt;{<span class="w">LineNum</span>} += <span class="n">1</span><span class="sc">;</span>
+ 717 
+ 718     <span class="c"># Is it a header data line?</span>
+ 719     <span class="k">if</span> <span class="s">(</span><span class="i">$Line</span> =~ <span class="q">/^#/</span><span class="s">)</span> <span class="s">{</span>
+ 720       <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span>
+ 721     <span class="s">}</span>
+ 722     <span class="i">$This</span>-&gt;{<span class="w">DataLine</span>} = <span class="i">$Line</span><span class="sc">;</span>
+ 723     <span class="k">last</span> <span class="j">LINE</span><span class="sc">;</span>
+ 724   <span class="s">}</span>
+ 725 
+ 726   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 727 <span class="s">}</span>
+ 728 
+ 729 <span class="c"># Get ready for reading fingerprints FP file...</span>
+ 730 <span class="c">#</span>
+<a name="_PrepareForReadingFingerprintsFPFileData-"></a> 731 <span class="k">sub </span><span class="m">_PrepareForReadingFingerprintsFPFileData</span> <span class="s">{</span>
+ 732   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 733 
+ 734   <span class="c"># Retrieve FP file data headers information....</span>
+ 735   <span class="i">$This</span><span class="i">-&gt;_RetrieveFPFileDataHeaders</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 736 
+ 737   <span class="c"># Validate header data keys and values information...</span>
+ 738   <span class="i">$This</span><span class="i">-&gt;_ValidateReadHeaderDataKeysAndValues</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 739 
+ 740   <span class="c"># Validate fingeprints string mode information...</span>
+ 741   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">ValidRequiredHeaderDataKeys</span>}<span class="s">)</span> <span class="s">{</span>
+ 742     <span class="i">$This</span><span class="i">-&gt;_ValidateReadFingerprintsStringMode</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 743   <span class="s">}</span>
+ 744 
+ 745   <span class="c"># Set status of FP file data...</span>
+ 746   <span class="i">$This</span>-&gt;{<span class="w">ValidFileData</span>} = <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">ValidRequiredHeaderDataKeys</span>} &amp;&amp; <span class="i">$This</span>-&gt;{<span class="w">ValidFingerprintsStringMode</span>}<span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+ 747 
+ 748   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 749 <span class="s">}</span>
+ 750 
+ 751 <span class="c"># Retrieve information about fingerprints date header in FP file...</span>
+ 752 <span class="c">#</span>
+<a name="_RetrieveFPFileDataHeaders-"></a> 753 <span class="k">sub </span><span class="m">_RetrieveFPFileDataHeaders</span> <span class="s">{</span>
+ 754   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 755   <span class="k">my</span><span class="s">(</span><span class="i">$FPFile</span><span class="cm">,</span> <span class="i">$Line</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">$KeyValuePair</span><span class="cm">,</span> <span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$KeyValueDelimiter</span><span class="cm">,</span> <span class="i">$KeyValuePairDelimiter</span><span class="cm">,</span> <span class="i">@LineKeyValuePairs</span><span class="s">)</span><span class="sc">;</span>
+ 756 
+ 757   <span class="i">$FPFile</span> = <span class="i">$This</span>-&gt;{<span class="w">Name</span>}<span class="sc">;</span>
+ 758 
+ 759   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">-e</span> <span class="i">$FPFile</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 760     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_RetrieveFPFileDataHeaders: File, $FPFile, doesn&#39;t exist...&quot;</span><span class="sc">;</span>
+ 761   <span class="s">}</span>
+ 762 
+ 763   <span class="k">if</span> <span class="s">(</span>!<span class="k">open</span> <span class="w">FPFILE</span><span class="cm">,</span> <span class="q">&quot;$FPFile&quot;</span><span class="s">)</span> <span class="s">{</span>
+ 764     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_RetrieveFPFileDataHeaders: Couldn&#39;t open input FP file $FPFile: $! ...&quot;</span><span class="sc">;</span>
+ 765   <span class="s">}</span>
+ 766 
+ 767   <span class="c"># Process header key/value pair data...</span>
+ 768   <span class="c">#</span>
+ 769   <span class="i">$KeyValueDelimiter</span> = <span class="q">&#39;=&#39;</span><span class="sc">;</span>
+ 770   <span class="i">$KeyValuePairDelimiter</span> = <span class="q">&#39;;&#39;</span><span class="sc">;</span>
+ 771 
+ 772   <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">HeaderDataKeys</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 773   <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">HeaderDataKeysAndValues</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 774   <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">CannonicalHeaderDataKeysAndValues</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 775 
+ 776   <span class="j">LINE:</span> <span class="k">while</span> <span class="s">(</span><span class="i">$Line</span> = <span class="i">TextUtil::GetTextLine</span><span class="s">(</span>\<span class="i">*FPFILE</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 777     <span class="c"># Is it a key/value pairs line?</span>
+ 778     <span class="k">if</span> <span class="s">(</span><span class="i">$Line</span> !~ <span class="q">/^#/</span><span class="s">)</span> <span class="s">{</span>
+ 779       <span class="k">last</span> <span class="j">LINE</span><span class="sc">;</span>
+ 780     <span class="s">}</span>
+ 781 
+ 782     <span class="c"># Take out starting hash mark before processing key/value pairs...</span>
+ 783     <span class="i">$Line</span> =~ <span class="q">s/^#//</span><span class="sc">;</span>
+ 784     <span class="k">if</span> <span class="s">(</span><span class="i">TextUtil::IsEmpty</span><span class="s">(</span><span class="i">$Line</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 785       <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span>
+ 786     <span class="s">}</span>
+ 787 
+ 788     <span class="i">@LineKeyValuePairs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 789 
+ 790     <span class="k">for</span> <span class="i">$KeyValuePair</span> <span class="s">(</span><span class="k">split</span> <span class="q">&quot;$KeyValuePairDelimiter&quot;</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span> <span class="s">{</span>
+ 791       <span class="s">(</span><span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="k">split</span> <span class="q">&quot;$KeyValueDelimiter&quot;</span><span class="cm">,</span> <span class="i">$KeyValuePair</span><span class="sc">;</span>
+ 792 
+ 793       <span class="i">$Key</span> = <span class="k">defined</span><span class="s">(</span><span class="i">$Key</span><span class="s">)</span> ? <span class="i">TextUtil::RemoveLeadingAndTrailingWhiteSpaces</span><span class="s">(</span><span class="i">$Key</span><span class="s">)</span> <span class="co">:</span> <span class="q">&#39;&#39;</span><span class="sc">;</span>
+ 794       <span class="i">$Value</span> = <span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> ? <span class="i">TextUtil::RemoveLeadingAndTrailingWhiteSpaces</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> <span class="co">:</span> <span class="q">&#39;&#39;</span><span class="sc">;</span>
+ 795 
+ 796       <span class="k">if</span> <span class="s">(</span><span class="i">TextUtil::IsEmpty</span><span class="s">(</span><span class="i">$Key</span><span class="s">)</span> || <span class="i">TextUtil::IsEmpty</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 797         <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_RetrieveFPFileDataHeaders: Data header line containing \&quot;Key = Value\&quot; pairs is not valid: It must contain even number of \&quot;Key = Value\&quot; pairs with valid values. Ignoring data header line: \&quot;$Line\&quot;...&quot;</span><span class="sc">;</span>
+ 798         <span class="k">next</span> <span class="j">LINE</span><span class="sc">;</span>
+ 799       <span class="s">}</span>
+ 800       <span class="k">push</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">HeaderDataKeys</span>}}<span class="cm">,</span> <span class="i">$Key</span><span class="sc">;</span>
+ 801       <span class="k">push</span> <span class="i">@LineKeyValuePairs</span><span class="cm">,</span> <span class="s">(</span><span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
+ 802     <span class="s">}</span>
+ 803 
+ 804     <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#LineKeyValuePairs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+ 805       <span class="i">$Key</span> = <span class="i">$LineKeyValuePairs</span>[<span class="i">$Index</span>]<span class="sc">;</span> <span class="i">$Value</span> = <span class="i">$LineKeyValuePairs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
+ 806 
+ 807       <span class="i">$This</span>-&gt;{<span class="w">HeaderDataKeysAndValues</span>}{<span class="i">$Key</span>} = <span class="i">$Value</span><span class="sc">;</span>
+ 808       <span class="i">$This</span>-&gt;{<span class="w">CannonicalHeaderDataKeysAndValues</span>}{<span class="k">lc</span><span class="s">(</span><span class="i">$Key</span><span class="s">)</span>} = <span class="i">$Value</span><span class="sc">;</span>
+ 809     <span class="s">}</span>
+ 810   <span class="s">}</span>
+ 811   <span class="k">close</span> <span class="w">FPFILE</span><span class="sc">;</span>
+ 812 
+ 813   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 814 <span class="s">}</span>
+ 815 
+ 816 <span class="c"># Validate header data and keys...</span>
+ 817 <span class="c">#</span>
+<a name="_ValidateReadHeaderDataKeysAndValues-"></a> 818 <span class="k">sub </span><span class="m">_ValidateReadHeaderDataKeysAndValues</span> <span class="s">{</span>
+ 819   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 820   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsStringType</span><span class="cm">,</span> <span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">@RequiredHeaderDataKeys</span><span class="s">)</span><span class="sc">;</span>
+ 821 
+ 822   <span class="i">$This</span>-&gt;{<span class="w">ValidRequiredHeaderDataKeys</span>} = <span class="n">0</span><span class="sc">;</span>
+ 823   <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeys</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 824 
+ 825   <span class="c"># Is FingerprintsStringType key is present?</span>
+ 826   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsHeaderDataKeyPresent</span><span class="s">(</span><span class="q">&#39;FingerprintsStringType&#39;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 827     <span class="w">carp</span> <span class="q">&quot;carp: ${ClassName}-&gt;_ValidateReadHeaderDataKeysAndValues: FingerprintsStringType data header key is missing in fingerprints file...&quot;</span><span class="sc">;</span>
+ 828     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 829   <span class="s">}</span>
+ 830   <span class="i">$FingerprintsStringType</span> = <span class="i">$This</span><span class="i">-&gt;GetHeaderDataKeyValue</span><span class="s">(</span><span class="q">&#39;FingerprintsStringType&#39;</span><span class="s">)</span><span class="sc">;</span>
+ 831 
+ 832   <span class="c"># Are all required data header keys present?</span>
+ 833   <span class="c">#</span>
+ 834   <span class="i">@RequiredHeaderDataKeys</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 835 
+ 836   <span class="k">if</span> <span class="s">(</span><span class="i">$FingerprintsStringType</span> =~ <span class="q">/^(FingerprintsBitVector|FingerprintsVector)$/i</span><span class="s">)</span> <span class="s">{</span>
+ 837     <span class="k">push</span> <span class="i">@RequiredHeaderDataKeys</span><span class="cm">,</span> <span class="i">$This</span><span class="i">-&gt;_GetRequiredHeaderDataKeys</span><span class="s">(</span><span class="i">$FingerprintsStringType</span><span class="s">)</span><span class="sc">;</span>
+ 838   <span class="s">}</span>
+ 839   <span class="k">else</span> <span class="s">{</span>
+ 840     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_ValidateReadHeaderDataKeysAndValues: FingerprintsStringType data header key value, $FingerprintsStringType, is not valid. SUpported values: FingerprintsBitVector or FingerprintsVector...&quot;</span><span class="sc">;</span>
+ 841     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 842   <span class="s">}</span>
+ 843 
+ 844   <span class="k">for</span> <span class="i">$Key</span> <span class="s">(</span><span class="i">@RequiredHeaderDataKeys</span><span class="s">)</span> <span class="s">{</span>
+ 845     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsHeaderDataKeyPresent</span><span class="s">(</span><span class="i">$Key</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 846       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_ValidateReadHeaderDataKeysAndValues: Requires data header key, $Key, is missing in fingerprints file...&quot;</span><span class="sc">;</span>
+ 847     <span class="s">}</span>
+ 848   <span class="s">}</span>
+ 849 
+ 850   <span class="k">push</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeys</span>}}<span class="cm">,</span> <span class="i">@RequiredHeaderDataKeys</span><span class="sc">;</span>
+ 851 
+ 852   <span class="c"># Are all required data header key values valid?</span>
+ 853   <span class="c">#</span>
+ 854   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;_ValidateRequiredHeaderDataKeyValues</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 855     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 856   <span class="s">}</span>
+ 857 
+ 858   <span class="c"># Process required header key values...</span>
+ 859   <span class="c">#</span>
+ 860   <span class="i">$This</span><span class="i">-&gt;_ProcessRequiredHeaderDataKeyValues</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 861 
+ 862   <span class="i">$This</span>-&gt;{<span class="w">ValidRequiredHeaderDataKeys</span>} = <span class="n">1</span><span class="sc">;</span>
+ 863 
+ 864   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+ 865 <span class="s">}</span>
+ 866 
+ 867 <span class="c"># Validate data header key values....</span>
+ 868 <span class="c">#</span>
+<a name="_ValidateRequiredHeaderDataKeyValues-"></a> 869 <span class="k">sub </span><span class="m">_ValidateRequiredHeaderDataKeyValues</span> <span class="s">{</span>
+ 870   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 871   <span class="k">my</span><span class="s">(</span><span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
+ 872 
+ 873   <span class="k">for</span> <span class="i">$Key</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeys</span>}}<span class="s">)</span> <span class="s">{</span>
+ 874     <span class="i">$Value</span> = <span class="i">$This</span><span class="i">-&gt;GetHeaderDataKeyValue</span><span class="s">(</span><span class="i">$Key</span><span class="s">)</span><span class="sc">;</span>
+ 875     <span class="j">KEY:</span> <span class="s">{</span>
+ 876       <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> =~ <span class="q">/^FingerprintsStringType$/i</span><span class="s">)</span> <span class="s">{</span>
+ 877         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> !~ <span class="q">/^(FingerprintsBitVector|FingerprintsVector)$/i</span><span class="s">)</span> <span class="s">{</span>
+ 878           <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_ValidateRequiredHeaderDataKeyValues: Required $Key data header key value, $Value, is not valid. Supported values: FingerprintsBitVector or FingerprintsVector...&quot;</span><span class="sc">;</span>
+ 879           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 880         <span class="s">}</span>
+ 881         <span class="k">last</span> <span class="j">KEY</span><span class="sc">;</span>
+ 882       <span class="s">}</span>
+ 883       <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> =~ <span class="q">/^Size$/i</span><span class="s">)</span> <span class="s">{</span>
+ 884         <span class="k">if</span> <span class="s">(</span>!<span class="i">TextUtil::IsPositiveInteger</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 885           <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_ValidateRequiredHeaderDataKeyValues: Required $Key data header key value, $Value, is not valid. Supported values: &gt; 0...&quot;</span><span class="sc">;</span>
+ 886           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 887         <span class="s">}</span>
+ 888         <span class="k">last</span> <span class="j">KEY</span><span class="sc">;</span>
+ 889       <span class="s">}</span>
+ 890       <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> =~ <span class="q">/^BitStringFormat$/i</span><span class="s">)</span> <span class="s">{</span>
+ 891         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> !~ <span class="q">/^(BinaryString|HexadecimalString)$/i</span><span class="s">)</span> <span class="s">{</span>
+ 892           <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_ValidateRequiredHeaderDataKeyValues: Required $Key data header key value, $Value, is not valid. Supported values: BinaryString or HexadecimalString ...&quot;</span><span class="sc">;</span>
+ 893           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 894         <span class="s">}</span>
+ 895         <span class="k">last</span> <span class="j">KEY</span><span class="sc">;</span>
+ 896       <span class="s">}</span>
+ 897       <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> =~ <span class="q">/^BitsOrder$/i</span><span class="s">)</span> <span class="s">{</span>
+ 898         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> !~ <span class="q">/^(Ascending|Descending)$/i</span><span class="s">)</span> <span class="s">{</span>
+ 899           <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_ValidateRequiredHeaderDataKeyValues: Required $Key data header key value, $Value, is not valid. Supported values: Ascending or Descending...&quot;</span><span class="sc">;</span>
+ 900           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 901         <span class="s">}</span>
+ 902         <span class="k">last</span> <span class="j">KEY</span><span class="sc">;</span>
+ 903       <span class="s">}</span>
+ 904       <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> =~ <span class="q">/^VectorStringFormat$/i</span><span class="s">)</span> <span class="s">{</span>
+ 905         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> !~ <span class="q">/^(IDsAndValuesString|IDsAndValuesPairsString|ValuesAndIDsString|ValuesAndIDsPairsString|ValuesString)$/i</span><span class="s">)</span> <span class="s">{</span>
+ 906           <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_ValidateRequiredHeaderDataKeyValues: Required $Key data header key value, $Value, is not valid. Supported values: IDsAndValuesString, IDsAndValuesPairsString, ValuesAndIDsString, ValuesAndIDsPairsString, or ValuesString ...&quot;</span><span class="sc">;</span>
+ 907           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 908         <span class="s">}</span>
+ 909         <span class="k">last</span> <span class="j">KEY</span><span class="sc">;</span>
+ 910       <span class="s">}</span>
+ 911       <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> =~ <span class="q">/^VectorValuesType$/i</span><span class="s">)</span> <span class="s">{</span>
+ 912         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> !~ <span class="q">/^(OrderedNumericalValues|NumericalValues|AlphaNumericalValues)$/i</span><span class="s">)</span> <span class="s">{</span>
+ 913           <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_ValidateRequiredHeaderDataKeyValues: Required $Key data header key value, $Value, is not valid. Supported values: OrderedNumericalValues, NumericalValues or AlphaNumericalValues...&quot;</span><span class="sc">;</span>
+ 914           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 915         <span class="s">}</span>
+ 916         <span class="k">last</span> <span class="j">KEY</span><span class="sc">;</span>
+ 917       <span class="s">}</span>
+ 918       <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> =~ <span class="q">/^Description$/i</span><span class="s">)</span> <span class="s">{</span>
+ 919         <span class="k">if</span> <span class="s">(</span><span class="i">TextUtil::IsEmpty</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 920           <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_ValidateRequiredHeaderDataKeyValues: Required $Key data header key value is not valid. Supported value: A no-empty text string...&quot;</span><span class="sc">;</span>
+ 921           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 922         <span class="s">}</span>
+ 923         <span class="k">last</span> <span class="j">KEY</span><span class="sc">;</span>
+ 924       <span class="s">}</span>
+ 925       <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_ValidateRequiredHeaderDataKeyValues: Required $Key data header key is not not supported...&quot;</span><span class="sc">;</span>
+ 926       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 927     <span class="s">}</span>
+ 928   <span class="s">}</span>
+ 929 
+ 930   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+ 931 <span class="s">}</span>
+ 932 
+ 933 <span class="c"># Process required header key valeues for access during complete fingerprints</span>
+ 934 <span class="c"># string generation from a partial fingerprints string specified on fingerprints</span>
+ 935 <span class="c"># line...</span>
+ 936 <span class="c">#</span>
+<a name="_ProcessRequiredHeaderDataKeyValues-"></a> 937 <span class="k">sub </span><span class="m">_ProcessRequiredHeaderDataKeyValues</span> <span class="s">{</span>
+ 938   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 939   <span class="k">my</span><span class="s">(</span><span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">@Keys</span><span class="s">)</span><span class="sc">;</span>
+ 940 
+ 941   <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 942 
+ 943   <span class="k">for</span> <span class="i">$Key</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeys</span>}}<span class="s">)</span> <span class="s">{</span>
+ 944     <span class="i">$Value</span> = <span class="i">$This</span><span class="i">-&gt;GetHeaderDataKeyValue</span><span class="s">(</span><span class="i">$Key</span><span class="s">)</span><span class="sc">;</span>
+ 945     <span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}{<span class="i">$Key</span>} = <span class="i">$Value</span><span class="sc">;</span>
+ 946   <span class="s">}</span>
+ 947 
+ 948   <span class="c"># Setup prefixes for generating fingerprints strings...</span>
+ 949   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsBitVectorStringPrefix</span>} = <span class="q">&#39;&#39;</span><span class="sc">;</span>
+ 950   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsVectorStringPrefix1</span>} = <span class="q">&#39;&#39;</span><span class="sc">;</span>
+ 951   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsVectorStringPrefix2</span>} = <span class="q">&#39;&#39;</span><span class="sc">;</span>
+ 952 
+ 953   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}{<span class="w">FingerprintsStringType</span>} =~ <span class="q">/^FingerprintsBitVector$/i</span><span class="s">)</span> <span class="s">{</span>
+ 954     <span class="i">@Keys</span> = <span class="q">qw(FingerprintsStringType Description Size BitStringFormat BitsOrder)</span><span class="sc">;</span>
+ 955     <span class="i">$This</span>-&gt;{<span class="w">FingerprintsBitVectorStringPrefix</span>} = <span class="i">$This</span><span class="i">-&gt;_GenerateFingerprintsPrefixUsingKeys</span><span class="s">(</span><span class="i">@Keys</span><span class="s">)</span><span class="sc">;</span>
+ 956   <span class="s">}</span>
+ 957   <span class="k">elsif</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}{<span class="w">FingerprintsStringType</span>} =~ <span class="q">/^FingerprintsVector$/i</span><span class="s">)</span> <span class="s">{</span>
+ 958     <span class="i">@Keys</span> = <span class="q">qw(FingerprintsStringType Description)</span><span class="sc">;</span>
+ 959     <span class="i">$This</span>-&gt;{<span class="w">FingerprintsVectorStringPrefix1</span>} = <span class="i">$This</span><span class="i">-&gt;_GenerateFingerprintsPrefixUsingKeys</span><span class="s">(</span><span class="i">@Keys</span><span class="s">)</span><span class="sc">;</span>
+ 960 
+ 961     <span class="i">@Keys</span> = <span class="q">qw(VectorValuesType VectorStringFormat)</span><span class="sc">;</span>
+ 962     <span class="i">$This</span>-&gt;{<span class="w">FingerprintsVectorStringPrefix2</span>} = <span class="i">$This</span><span class="i">-&gt;_GenerateFingerprintsPrefixUsingKeys</span><span class="s">(</span><span class="i">@Keys</span><span class="s">)</span><span class="sc">;</span>
+ 963   <span class="s">}</span>
+ 964 
+ 965   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 966 <span class="s">}</span>
+ 967 
+ 968 <span class="c"># Generate fingerprints prefix using header keys data...</span>
+ 969 <span class="c">#</span>
+<a name="_GenerateFingerprintsPrefixUsingKeys-"></a> 970 <span class="k">sub </span><span class="m">_GenerateFingerprintsPrefixUsingKeys</span> <span class="s">{</span>
+ 971   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Keys</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 972   <span class="k">my</span><span class="s">(</span><span class="i">$Delimiter</span><span class="cm">,</span> <span class="i">$Key</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
+ 973 
+ 974   <span class="i">$Delimiter</span> = <span class="i">Fingerprints::FingerprintsStringUtil::GetFingeprintsStringDelimiter</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 975 
+ 976   <span class="i">@Values</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 977   <span class="k">for</span> <span class="i">$Key</span> <span class="s">(</span><span class="i">@Keys</span><span class="s">)</span> <span class="s">{</span>
+ 978     <span class="k">push</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}{<span class="i">$Key</span>}<span class="sc">;</span>
+ 979   <span class="s">}</span>
+ 980 
+ 981   <span class="k">return</span> <span class="k">join</span><span class="s">(</span><span class="i">$Delimiter</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span>
+ 982 <span class="s">}</span>
+ 983 
+ 984 <span class="c"># Get required header data keys...</span>
+ 985 <span class="c">#</span>
+<a name="_GetRequiredHeaderDataKeys-"></a> 986 <span class="k">sub </span><span class="m">_GetRequiredHeaderDataKeys</span> <span class="s">{</span>
+ 987   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$FingerprintsStringType</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 988   <span class="k">my</span><span class="s">(</span><span class="i">@RequiredKeys</span><span class="s">)</span><span class="sc">;</span>
+ 989 
+ 990   <span class="i">@RequiredKeys</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 991 
+ 992   <span class="k">if</span> <span class="s">(</span><span class="i">$FingerprintsStringType</span> =~ <span class="q">/FingerprintsBitVector$/i</span><span class="s">)</span> <span class="s">{</span>
+ 993     <span class="k">push</span> <span class="i">@RequiredKeys</span><span class="cm">,</span> <span class="q">qw(FingerprintsStringType Description Size BitStringFormat BitsOrder)</span><span class="sc">;</span>
+ 994   <span class="s">}</span>
+ 995   <span class="k">elsif</span> <span class="s">(</span><span class="i">$FingerprintsStringType</span> =~ <span class="q">/^FingerprintsVector/i</span><span class="s">)</span> <span class="s">{</span>
+ 996     <span class="k">push</span> <span class="i">@RequiredKeys</span><span class="cm">,</span> <span class="q">qw(FingerprintsStringType Description VectorStringFormat VectorValuesType)</span><span class="sc">;</span>
+ 997   <span class="s">}</span>
+ 998   <span class="k">else</span> <span class="s">{</span>
+ 999     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;GetRequiredHeaderDataKeys: FingerprintsStringType value, $FingerprintsStringType, is not valid. Supported values: FingerprintsBitVector or FingerprintsVector...&quot;</span><span class="sc">;</span>
+1000   <span class="s">}</span>
+1001 
+1002   <span class="k">return</span> <span class="i">@RequiredKeys</span><span class="sc">;</span>
+1003 <span class="s">}</span>
+1004 
+1005 <span class="c"># Validate fingerprints string mode information...</span>
+1006 <span class="c">#</span>
+<a name="_ValidateReadFingerprintsStringMode-"></a>1007 <span class="k">sub </span><span class="m">_ValidateReadFingerprintsStringMode</span> <span class="s">{</span>
+1008   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1009   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsStringType</span><span class="cm">,</span> <span class="i">$FingerprintsStringDescription</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorStringMode</span><span class="cm">,</span> <span class="i">$FingerprintsVectorStringMode</span><span class="cm">,</span> <span class="i">$FirstFingerprintsStringType</span><span class="cm">,</span> <span class="i">$FirstFingerprintsStringDescription</span><span class="s">)</span><span class="sc">;</span>
+1010 
+1011   <span class="i">$This</span>-&gt;{<span class="w">ValidFingerprintsStringMode</span>} = <span class="n">0</span><span class="sc">;</span>
+1012   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsBitVectorStringMode</span>} = <span class="n">0</span><span class="sc">;</span>
+1013   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsVectorStringMode</span>} = <span class="n">0</span><span class="sc">;</span>
+1014 
+1015   <span class="i">$This</span>-&gt;{<span class="w">FirstFingerprintsStringType</span>} = <span class="q">&#39;&#39;</span><span class="sc">;</span>
+1016   <span class="i">$This</span>-&gt;{<span class="w">FirstFingerprintsStringDescription</span>} = <span class="q">&#39;&#39;</span><span class="sc">;</span>
+1017 
+1018   <span class="i">$FingerprintsBitVectorStringMode</span> = <span class="n">0</span><span class="sc">;</span>
+1019   <span class="i">$FingerprintsVectorStringMode</span> = <span class="n">0</span><span class="sc">;</span>
+1020 
+1021   <span class="i">$FirstFingerprintsStringType</span> = <span class="q">&#39;&#39;</span><span class="sc">;</span>
+1022   <span class="i">$FirstFingerprintsStringDescription</span> = <span class="q">&#39;&#39;</span><span class="sc">;</span>
+1023 
+1024   <span class="i">$FingerprintsStringType</span> = <span class="i">$This</span><span class="i">-&gt;GetHeaderDataKeyValue</span><span class="s">(</span><span class="q">&#39;FingerprintsStringType&#39;</span><span class="s">)</span><span class="sc">;</span>
+1025   <span class="i">$FingerprintsStringDescription</span> = <span class="i">$This</span><span class="i">-&gt;GetHeaderDataKeyValue</span><span class="s">(</span><span class="q">&#39;Description&#39;</span><span class="s">)</span><span class="sc">;</span>
+1026 
+1027   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsStringMode</span>} =~ <span class="q">/^FingerprintsBitVectorString$/i</span><span class="s">)</span> <span class="s">{</span>
+1028     <span class="k">if</span> <span class="s">(</span><span class="i">$FingerprintsStringType</span> !~ <span class="q">/^FingerprintsBitVector$/i</span><span class="s">)</span> <span class="s">{</span>
+1029       <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_ValidateReadFingerprintsStringMode: Fingerprints string data type, $FingerprintsStringType, doesn&#39;t correspond to, FingerprintsBitVectorString, specified using \&quot;FingerprintsStringMode\&quot;...&quot;</span><span class="sc">;</span>
+1030       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1031     <span class="s">}</span>
+1032     <span class="i">$FingerprintsBitVectorStringMode</span> = <span class="n">1</span><span class="sc">;</span>
+1033     <span class="i">$FirstFingerprintsStringType</span> = <span class="q">&#39;FingerprintsBitVector&#39;</span><span class="sc">;</span>
+1034     <span class="i">$FirstFingerprintsStringDescription</span> = <span class="i">$FingerprintsStringDescription</span><span class="sc">;</span>
+1035   <span class="s">}</span>
+1036   <span class="k">elsif</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsStringMode</span>} =~ <span class="q">/^FingerprintsVectorString$/i</span><span class="s">)</span> <span class="s">{</span>
+1037     <span class="k">if</span> <span class="s">(</span><span class="i">$FingerprintsStringType</span> !~ <span class="q">/^FingerprintsVector$/i</span><span class="s">)</span> <span class="s">{</span>
+1038       <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_ValidateReadFingerprintsStringMode: Fingerprints string data type, $FingerprintsStringType, doesn&#39;t correspond to, FingerprintsVectorString, specified using \&quot;FingerprintsStringMode\&quot;...&quot;</span><span class="sc">;</span>
+1039       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1040     <span class="s">}</span>
+1041     <span class="i">$FingerprintsVectorStringMode</span> = <span class="n">1</span><span class="sc">;</span>
+1042     <span class="i">$FirstFingerprintsStringType</span> = <span class="q">&#39;FingerprintsVector&#39;</span><span class="sc">;</span>
+1043     <span class="i">$FirstFingerprintsStringDescription</span> = <span class="i">$FingerprintsStringDescription</span><span class="sc">;</span>
+1044   <span class="s">}</span>
+1045   <span class="k">else</span> <span class="s">{</span>
+1046     <span class="c"># AutoDetect mode...</span>
+1047     <span class="k">if</span> <span class="s">(</span><span class="i">$FingerprintsStringType</span> =~ <span class="q">/^FingerprintsBitVector$/i</span><span class="s">)</span> <span class="s">{</span>
+1048       <span class="i">$FingerprintsBitVectorStringMode</span> = <span class="n">1</span><span class="sc">;</span>
+1049     <span class="s">}</span>
+1050     <span class="k">elsif</span> <span class="s">(</span><span class="i">$FingerprintsStringType</span> =~ <span class="q">/^FingerprintsVector$/i</span><span class="s">)</span> <span class="s">{</span>
+1051       <span class="i">$FingerprintsVectorStringMode</span> = <span class="n">1</span><span class="sc">;</span>
+1052     <span class="s">}</span>
+1053     <span class="k">else</span> <span class="s">{</span>
+1054       <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_ValidateReadFingerprintsStringMode: Fingerprints string data type, $FingerprintsStringType, identified during, AutoDetect, value of \&quot;FingerprintsStringMode\&quot; is not valid; Supported fingerprints types: FingerprintBitVector or FingerprintsVector...&quot;</span><span class="sc">;</span>
+1055       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1056     <span class="s">}</span>
+1057     <span class="i">$FirstFingerprintsStringType</span> = <span class="i">$FingerprintsStringType</span><span class="sc">;</span>
+1058     <span class="i">$FirstFingerprintsStringDescription</span> = <span class="i">$FingerprintsStringDescription</span><span class="sc">;</span>
+1059   <span class="s">}</span>
+1060 
+1061   <span class="i">$This</span>-&gt;{<span class="w">ValidFingerprintsStringMode</span>} = <span class="n">1</span><span class="sc">;</span>
+1062 
+1063   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsBitVectorStringMode</span>} = <span class="i">$FingerprintsBitVectorStringMode</span><span class="sc">;</span>
+1064   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsVectorStringMode</span>} = <span class="i">$FingerprintsVectorStringMode</span><span class="sc">;</span>
+1065 
+1066   <span class="i">$This</span>-&gt;{<span class="w">FirstFingerprintsStringType</span>} = <span class="i">$FirstFingerprintsStringType</span><span class="sc">;</span>
+1067   <span class="i">$This</span>-&gt;{<span class="w">FirstFingerprintsStringDescription</span>} = <span class="i">$FirstFingerprintsStringDescription</span><span class="sc">;</span>
+1068 
+1069   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1070 <span class="s">}</span>
+1071 
+1072 <span class="c"># Write fingerprints string generated from specified fingerprints - fingerprints-bit vector or</span>
+1073 <span class="c"># fingerprints vector - object and other data to FP file...</span>
+1074 <span class="c">#</span>
+<a name="WriteFingerprints-"></a>1075 <span class="k">sub </span><span class="m">WriteFingerprints</span> <span class="s">{</span>
+1076   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$FingerprintsObject</span><span class="cm">,</span> <span class="i">$CompoundID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1077 
+1078   <span class="c"># Initialize data for current line...</span>
+1079   <span class="i">$This</span><span class="i">-&gt;_InitializeWriteDataLine</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1080 
+1081   <span class="c"># Set fingerprints object and compound ID...</span>
+1082   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsObject</span>} = <span class="i">$FingerprintsObject</span><span class="sc">;</span>
+1083   <span class="i">$This</span><span class="i">-&gt;SetCompoundID</span><span class="s">(</span><span class="i">$CompoundID</span><span class="s">)</span><span class="sc">;</span>
+1084 
+1085   <span class="c"># Generate fingerprints string...</span>
+1086   <span class="i">$This</span><span class="i">-&gt;_GenerateFingerprintsString</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1087 
+1088   <span class="c"># Generate partial fingerprints string...</span>
+1089   <span class="i">$This</span><span class="i">-&gt;_GeneratePartialFingerprintsStringFromFingerprintsString</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1090 
+1091   <span class="c"># Write data line..</span>
+1092   <span class="i">$This</span><span class="i">-&gt;_WriteDataLine</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1093 
+1094   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1095 <span class="s">}</span>
+1096 
+1097 <span class="c"># Write fingerprints string and other data to FP file...</span>
+1098 <span class="c">#</span>
+1099 <span class="c"># Notes:</span>
+1100 <span class="c">#   o FingerprintsStringMode, BitStringFormat, BitsOrder, VectorStringFormat values</span>
+1101 <span class="c">#     are ignored during writing of fingerprints and it&#39;s written to the file as it is.</span>
+1102 <span class="c">#   o FingerprintsString is a regular fingerprints string as oppose to a partial fingerprints</span>
+1103 <span class="c">#     string.</span>
+1104 <span class="c">#</span>
+<a name="WriteFingerprintsString-"></a>1105 <span class="k">sub </span><span class="m">WriteFingerprintsString</span> <span class="s">{</span>
+1106   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$FingerprintsString</span><span class="cm">,</span> <span class="i">$CompoundID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1107 
+1108   <span class="c"># Initialize data for current line...</span>
+1109   <span class="i">$This</span><span class="i">-&gt;_InitializeWriteDataLine</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1110 
+1111   <span class="c"># Set fingerprints string and compound ID...</span>
+1112   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>} = <span class="i">$FingerprintsString</span><span class="sc">;</span>
+1113   <span class="i">$This</span><span class="i">-&gt;SetCompoundID</span><span class="s">(</span><span class="i">$CompoundID</span><span class="s">)</span><span class="sc">;</span>
+1114 
+1115   <span class="c"># Generate fingerprints object...</span>
+1116   <span class="i">$This</span><span class="i">-&gt;_GenerateFingerprintsObject</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1117 
+1118   <span class="c"># Generate partial fingerprints string...</span>
+1119   <span class="i">$This</span><span class="i">-&gt;_GeneratePartialFingerprintsStringFromFingerprintsString</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1120 
+1121   <span class="c"># Write data line..</span>
+1122   <span class="i">$This</span><span class="i">-&gt;_WriteDataLine</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1123 
+1124   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1125 <span class="s">}</span>
+1126 
+1127 <span class="c"># Initialize data line for reading...</span>
+1128 <span class="c">#</span>
+<a name="_InitializeWriteDataLine-"></a>1129 <span class="k">sub </span><span class="m">_InitializeWriteDataLine</span> <span class="s">{</span>
+1130   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1131 
+1132   <span class="i">$This</span>-&gt;{<span class="w">DataLine</span>} = <span class="k">undef</span><span class="sc">;</span>
+1133   <span class="i">$This</span>-&gt;{<span class="w">CompoundID</span>} = <span class="k">undef</span><span class="sc">;</span>
+1134 
+1135   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsObject</span>} = <span class="k">undef</span><span class="sc">;</span>
+1136 
+1137   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>} = <span class="k">undef</span><span class="sc">;</span>
+1138   <span class="i">$This</span>-&gt;{<span class="w">PartialFingerprintsString</span>} = <span class="k">undef</span><span class="sc">;</span>
+1139 
+1140   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1141 <span class="s">}</span>
+1142 
+1143 <span class="c"># Write fingerprints data line line...</span>
+1144 <span class="c">#</span>
+<a name="_WriteDataLine-"></a>1145 <span class="k">sub </span><span class="m">_WriteDataLine</span> <span class="s">{</span>
+1146   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1147   <span class="k">my</span><span class="s">(</span><span class="i">$FileHandle</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span>
+1148 
+1149   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FirstDataLineIO</span>}<span class="s">)</span> <span class="s">{</span>
+1150     <span class="i">$This</span><span class="i">-&gt;_ProcessFirstDataLineWrite</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1151   <span class="s">}</span>
+1152 
+1153   <span class="c"># Write data compound ID along with partial fingerprints string...</span>
+1154   <span class="i">$Line</span> = <span class="i">$This</span>-&gt;{<span class="w">CompoundID</span>} . <span class="q">&#39; &#39;</span> . <span class="i">$This</span>-&gt;{<span class="w">PartialFingerprintsString</span>}<span class="sc">;</span>
+1155 
+1156   <span class="i">$This</span>-&gt;{<span class="w">LineNum</span>} += <span class="n">1</span><span class="sc">;</span>
+1157   <span class="i">$FileHandle</span> = <span class="i">$This</span>-&gt;{<span class="w">FileHandle</span>}<span class="sc">;</span>
+1158   <span class="k">print</span> <span class="i">$FileHandle</span> <span class="q">&quot;$Line\n&quot;</span><span class="sc">;</span>
+1159 
+1160   <span class="i">$This</span>-&gt;{<span class="w">DataLine</span>} = <span class="i">$Line</span><span class="sc">;</span>
+1161 
+1162   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1163 <span class="s">}</span>
+1164 
+1165 <span class="c"># Process first write...</span>
+1166 <span class="c">#</span>
+<a name="_ProcessFirstDataLineWrite-"></a>1167 <span class="k">sub </span><span class="m">_ProcessFirstDataLineWrite</span> <span class="s">{</span>
+1168   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1169   <span class="k">my</span><span class="s">(</span><span class="i">$Line</span><span class="cm">,</span> <span class="i">$FileHandle</span><span class="s">)</span><span class="sc">;</span>
+1170 
+1171   <span class="i">$This</span>-&gt;{<span class="w">FirstDataLineIO</span>} = <span class="n">0</span><span class="sc">;</span>
+1172 
+1173   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetMode</span><span class="s">(</span><span class="s">)</span> =~ <span class="q">/^Write$/i</span><span class="s">)</span> <span class="s">{</span>
+1174     <span class="c"># Skip it for append mode...</span>
+1175     <span class="i">$This</span><span class="i">-&gt;_WritePackageAndTimeStampHeaderKeys</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1176     <span class="i">$This</span><span class="i">-&gt;_WriteRequiredHeaderDataKeys</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1177   <span class="s">}</span>
+1178 
+1179   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1180 <span class="s">}</span>
+1181 
+1182 <span class="c"># Write out package and time stamp information...</span>
+1183 <span class="c">#</span>
+<a name="_WritePackageAndTimeStampHeaderKeys-"></a>1184 <span class="k">sub </span><span class="m">_WritePackageAndTimeStampHeaderKeys</span> <span class="s">{</span>
+1185   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1186   <span class="k">my</span><span class="s">(</span><span class="i">$FileHandle</span><span class="cm">,</span> <span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
+1187 
+1188   <span class="i">$FileHandle</span> = <span class="i">$This</span>-&gt;{<span class="w">FileHandle</span>}<span class="sc">;</span>
+1189 
+1190   <span class="c"># Package information...</span>
+1191   <span class="i">$This</span>-&gt;{<span class="w">LineNum</span>} += <span class="n">1</span><span class="sc">;</span>
+1192   <span class="i">$Key</span> = <span class="q">&quot;Package&quot;</span><span class="sc">;</span> <span class="i">$Value</span> = <span class="i">PackageInfo::GetPackageName</span><span class="s">(</span><span class="s">)</span> . <span class="q">&quot; &quot;</span> . <span class="i">PackageInfo::GetVersionNumber</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1193   <span class="k">print</span> <span class="i">$FileHandle</span> <span class="q">&quot;# $Key = $Value\n&quot;</span><span class="sc">;</span>
+1194 
+1195   <span class="i">$This</span>-&gt;{<span class="w">LineNum</span>} += <span class="n">1</span><span class="sc">;</span>
+1196   <span class="i">$Key</span> = <span class="q">&quot;Release Date&quot;</span><span class="sc">;</span> <span class="i">$Value</span> = <span class="i">PackageInfo::GetReleaseDate</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1197   <span class="k">print</span> <span class="i">$FileHandle</span> <span class="q">&quot;# $Key = $Value\n&quot;</span><span class="sc">;</span>
+1198 
+1199   <span class="c"># Timestamp information...</span>
+1200   <span class="i">$This</span>-&gt;{<span class="w">LineNum</span>} += <span class="n">1</span><span class="sc">;</span>
+1201   <span class="k">print</span> <span class="i">$FileHandle</span> <span class="q">&quot;#\n&quot;</span><span class="sc">;</span>
+1202 
+1203   <span class="i">$This</span>-&gt;{<span class="w">LineNum</span>} += <span class="n">1</span><span class="sc">;</span>
+1204   <span class="i">$Key</span> = <span class="q">&quot;TimeStamp&quot;</span><span class="sc">;</span> <span class="i">$Value</span> = <span class="i">TimeUtil::FPFileTimeStamp</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1205   <span class="k">print</span> <span class="i">$FileHandle</span> <span class="q">&quot;# $Key = $Value\n&quot;</span><span class="sc">;</span>
+1206 
+1207   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1208 <span class="s">}</span>
+1209 
+1210 <span class="c"># Write out required header data keys...</span>
+1211 <span class="c">#</span>
+<a name="_WriteRequiredHeaderDataKeys-"></a>1212 <span class="k">sub </span><span class="m">_WriteRequiredHeaderDataKeys</span> <span class="s">{</span>
+1213   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1214   <span class="k">my</span><span class="s">(</span><span class="i">$FileHandle</span><span class="cm">,</span> <span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
+1215 
+1216   <span class="i">$FileHandle</span> = <span class="i">$This</span>-&gt;{<span class="w">FileHandle</span>}<span class="sc">;</span>
+1217 
+1218   <span class="i">$This</span><span class="i">-&gt;_GenerateWriteRequiredHeaderDataKeys</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1219 
+1220   <span class="i">$This</span>-&gt;{<span class="w">LineNum</span>} += <span class="n">1</span><span class="sc">;</span>
+1221   <span class="k">print</span> <span class="i">$FileHandle</span> <span class="q">&quot;#\n&quot;</span><span class="sc">;</span>
+1222 
+1223   <span class="k">for</span> <span class="i">$Key</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeys</span>}}<span class="s">)</span> <span class="s">{</span>
+1224     <span class="i">$Value</span> = <span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}{<span class="i">$Key</span>}<span class="sc">;</span>
+1225 
+1226     <span class="i">$This</span>-&gt;{<span class="w">LineNum</span>} += <span class="n">1</span><span class="sc">;</span>
+1227     <span class="k">print</span> <span class="i">$FileHandle</span> <span class="q">&quot;# $Key = $Value\n&quot;</span><span class="sc">;</span>
+1228 
+1229     <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> =~ <span class="q">/^FingerprintsStringType$/i</span><span class="s">)</span> <span class="s">{</span>
+1230       <span class="i">$This</span>-&gt;{<span class="w">LineNum</span>} += <span class="n">1</span><span class="sc">;</span>
+1231       <span class="k">print</span> <span class="i">$FileHandle</span> <span class="q">&quot;#\n&quot;</span><span class="sc">;</span>
+1232     <span class="s">}</span>
+1233   <span class="s">}</span>
+1234 
+1235   <span class="i">$This</span>-&gt;{<span class="w">LineNum</span>} += <span class="n">1</span><span class="sc">;</span>
+1236   <span class="k">print</span> <span class="i">$FileHandle</span> <span class="q">&quot;#\n&quot;</span><span class="sc">;</span>
+1237 
+1238   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1239 <span class="s">}</span>
+1240 
+<a name="_GenerateWriteRequiredHeaderDataKeys-"></a>1241 <span class="k">sub </span><span class="m">_GenerateWriteRequiredHeaderDataKeys</span> <span class="s">{</span>
+1242   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1243 
+1244   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsBitVectorStringMode</span>} &amp;&amp; <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>} =~ <span class="q">/^FingerprintsBitVector/i</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1245     <span class="i">$This</span><span class="i">-&gt;_GenerateWriteRequiredHeaderDataKeysForBitVectorString</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1246   <span class="s">}</span>
+1247   <span class="k">elsif</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsVectorStringMode</span>} &amp;&amp; <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>} =~ <span class="q">/^FingerprintsVector/i</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1248     <span class="i">$This</span><span class="i">-&gt;_GenerateWriteRequiredHeaderDataKeysForVectorString</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1249   <span class="s">}</span>
+1250   <span class="k">else</span> <span class="s">{</span>
+1251     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_GenerateWriteRequiredHeaderDataKeys: Required header data keys can&#39;t be generated: FingerprintsStringMode value, $This-&gt;{FingerprintsStringMode}, doesn&#39;t correspond to type of first FingerprintsString: $This-&gt;{FingerprintsString}...&quot;</span><span class="sc">;</span>
+1252   <span class="s">}</span>
+1253 
+1254   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1255 <span class="s">}</span>
+1256 
+1257 <span class="c"># Generate required data header keys and values for writing fingerprints bit vector string...</span>
+1258 <span class="c">#</span>
+<a name="_GenerateWriteRequiredHeaderDataKeysForBitVectorString-"></a>1259 <span class="k">sub </span><span class="m">_GenerateWriteRequiredHeaderDataKeysForBitVectorString</span> <span class="s">{</span>
+1260   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1261   <span class="k">my</span><span class="s">(</span><span class="i">$Key</span><span class="cm">,</span> <span class="i">$VectorType</span><span class="cm">,</span> <span class="i">$Description</span><span class="cm">,</span> <span class="i">$Size</span><span class="cm">,</span> <span class="i">$BitStringFormat</span><span class="cm">,</span> <span class="i">$BitsOrder</span><span class="s">)</span><span class="sc">;</span>
+1262 
+1263   <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeys</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1264   <span class="k">push</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeys</span>}}<span class="cm">,</span> <span class="i">$This</span><span class="i">-&gt;_GetRequiredHeaderDataKeys</span><span class="s">(</span><span class="q">&#39;FingerprintsBitVector&#39;</span><span class="s">)</span><span class="sc">;</span>
+1265 
+1266   <span class="s">(</span><span class="i">$VectorType</span><span class="cm">,</span> <span class="i">$Description</span><span class="cm">,</span> <span class="i">$Size</span><span class="cm">,</span> <span class="i">$BitStringFormat</span><span class="cm">,</span> <span class="i">$BitsOrder</span><span class="s">)</span> = <span class="i">Fingerprints::FingerprintsStringUtil::GetFingerprintsStringValues</span><span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>}<span class="s">)</span><span class="sc">;</span>
+1267 
+1268   <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1269 
+1270   <span class="k">for</span> <span class="i">$Key</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeys</span>}}<span class="s">)</span> <span class="s">{</span>
+1271     <span class="j">KEYTYPE:</span> <span class="s">{</span>
+1272       <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> =~ <span class="q">/^FingerprintsStringType$/i</span><span class="s">)</span> <span class="s">{</span>
+1273         <span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}{<span class="i">$Key</span>} = <span class="i">$VectorType</span><span class="sc">;</span>
+1274         <span class="k">last</span> <span class="j">KEYTYPE</span><span class="sc">;</span>
+1275       <span class="s">}</span>
+1276       <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> =~ <span class="q">/^Description$/i</span><span class="s">)</span> <span class="s">{</span>
+1277         <span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}{<span class="i">$Key</span>} = <span class="i">$Description</span><span class="sc">;</span>
+1278         <span class="k">last</span> <span class="j">KEYTYPE</span><span class="sc">;</span>
+1279       <span class="s">}</span>
+1280       <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> =~ <span class="q">/^Size$/i</span><span class="s">)</span> <span class="s">{</span>
+1281         <span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}{<span class="i">$Key</span>} = <span class="i">$Size</span><span class="sc">;</span>
+1282         <span class="k">last</span> <span class="j">KEYTYPE</span><span class="sc">;</span>
+1283       <span class="s">}</span>
+1284       <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> =~ <span class="q">/^BitStringFormat$/i</span><span class="s">)</span> <span class="s">{</span>
+1285         <span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}{<span class="i">$Key</span>} = <span class="i">$BitStringFormat</span><span class="sc">;</span>
+1286         <span class="k">last</span> <span class="j">KEYTYPE</span><span class="sc">;</span>
+1287       <span class="s">}</span>
+1288       <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> =~ <span class="q">/^BitsOrder$/i</span><span class="s">)</span> <span class="s">{</span>
+1289         <span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}{<span class="i">$Key</span>} = <span class="i">$BitsOrder</span><span class="sc">;</span>
+1290         <span class="k">last</span> <span class="j">KEYTYPE</span><span class="sc">;</span>
+1291       <span class="s">}</span>
+1292       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_GenerateWriteRequiredHeaderDataKeysForBitVectorString: Required header data key, $Key, value can&#39;t be generated: It&#39;s not a known key ...&quot;</span><span class="sc">;</span>
+1293     <span class="s">}</span>
+1294   <span class="s">}</span>
+1295 
+1296   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1297 <span class="s">}</span>
+1298 
+1299 <span class="c"># Generate required data header keys and values for writing fingerprints vector string...</span>
+1300 <span class="c">#</span>
+<a name="_GenerateWriteRequiredHeaderDataKeysForVectorString-"></a>1301 <span class="k">sub </span><span class="m">_GenerateWriteRequiredHeaderDataKeysForVectorString</span> <span class="s">{</span>
+1302   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1303   <span class="k">my</span><span class="s">(</span><span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span>  <span class="i">$VectorType</span><span class="cm">,</span> <span class="i">$Description</span><span class="cm">,</span> <span class="i">$NumOfValues</span><span class="cm">,</span> <span class="i">$VectorValuesType</span><span class="cm">,</span> <span class="i">$VectorStringFormat</span><span class="s">)</span><span class="sc">;</span>
+1304 
+1305   <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeys</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1306   <span class="k">push</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeys</span>}}<span class="cm">,</span> <span class="i">$This</span><span class="i">-&gt;_GetRequiredHeaderDataKeys</span><span class="s">(</span><span class="q">&#39;FingerprintsVector&#39;</span><span class="s">)</span><span class="sc">;</span>
+1307 
+1308   <span class="s">(</span><span class="i">$VectorType</span><span class="cm">,</span> <span class="i">$Description</span><span class="cm">,</span> <span class="i">$NumOfValues</span><span class="cm">,</span> <span class="i">$VectorValuesType</span><span class="cm">,</span> <span class="i">$VectorStringFormat</span><span class="s">)</span> = <span class="i">Fingerprints::FingerprintsStringUtil::GetFingerprintsStringValues</span><span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>}<span class="s">)</span><span class="sc">;</span>
+1309 
+1310   <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1311 
+1312   <span class="k">for</span> <span class="i">$Key</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeys</span>}}<span class="s">)</span> <span class="s">{</span>
+1313     <span class="j">KEYTYPE:</span> <span class="s">{</span>
+1314       <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> =~ <span class="q">/^FingerprintsStringType$/i</span><span class="s">)</span> <span class="s">{</span>
+1315         <span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}{<span class="i">$Key</span>} = <span class="i">$VectorType</span><span class="sc">;</span>
+1316         <span class="k">last</span> <span class="j">KEYTYPE</span><span class="sc">;</span>
+1317       <span class="s">}</span>
+1318       <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> =~ <span class="q">/^Description$/i</span><span class="s">)</span> <span class="s">{</span>
+1319         <span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}{<span class="i">$Key</span>} = <span class="i">$Description</span><span class="sc">;</span>
+1320         <span class="k">last</span> <span class="j">KEYTYPE</span><span class="sc">;</span>
+1321       <span class="s">}</span>
+1322       <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> =~ <span class="q">/^VectorValuesType$/i</span><span class="s">)</span> <span class="s">{</span>
+1323         <span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}{<span class="i">$Key</span>} = <span class="i">$VectorValuesType</span><span class="sc">;</span>
+1324         <span class="k">last</span> <span class="j">KEYTYPE</span><span class="sc">;</span>
+1325       <span class="s">}</span>
+1326       <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> =~ <span class="q">/^VectorStringFormat$/i</span><span class="s">)</span> <span class="s">{</span>
+1327         <span class="i">$This</span>-&gt;{<span class="w">RequiredHeaderDataKeysAndValues</span>}{<span class="i">$Key</span>} = <span class="i">$VectorStringFormat</span><span class="sc">;</span>
+1328         <span class="k">last</span> <span class="j">KEYTYPE</span><span class="sc">;</span>
+1329       <span class="s">}</span>
+1330       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_GenerateWriteRequiredHeaderDataKeysForVectorString: Required header data key, $Key, value can&#39;t be generated: It&#39;s not a known key ...&quot;</span><span class="sc">;</span>
+1331     <span class="s">}</span>
+1332   <span class="s">}</span>
+1333 
+1334   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1335 <span class="s">}</span>
+1336 
+1337 
+1338 <span class="c"># Get ready for writing fingerprints FP file...</span>
+1339 <span class="c">#</span>
+<a name="_PrepareForWritingFingerprintsFPFileData-"></a>1340 <span class="k">sub </span><span class="m">_PrepareForWritingFingerprintsFPFileData</span> <span class="s">{</span>
+1341   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1342   <span class="k">my</span><span class="s">(</span><span class="i">$FPFile</span><span class="cm">,</span> <span class="i">$FileDir</span><span class="cm">,</span> <span class="i">$FileName</span><span class="cm">,</span> <span class="i">$FileExt</span><span class="cm">,</span> <span class="i">$OutDelim</span><span class="s">)</span><span class="sc">;</span>
+1343 
+1344   <span class="i">$FPFile</span> = <span class="i">$This</span>-&gt;{<span class="w">Name</span>}<span class="sc">;</span>
+1345   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>-&gt;{<span class="w">Overwrite</span>}<span class="s">)</span> <span class="s">{</span>
+1346     <span class="k">if</span> <span class="s">(</span><span class="k">-e</span> <span class="i">$FPFile</span><span class="s">)</span> <span class="s">{</span>
+1347       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_PrepareForWritingFingerprintsFPFileData: File, $FPFile, already exist. Use overwrite option...&quot;</span><span class="sc">;</span>
+1348     <span class="s">}</span>
+1349   <span class="s">}</span>
+1350 
+1351   <span class="c"># Setup FingerprintsStringMode status...</span>
+1352   <span class="c">#</span>
+1353   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsBitVectorStringMode</span>} = <span class="n">0</span><span class="sc">;</span>
+1354   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsVectorStringMode</span>} = <span class="n">0</span><span class="sc">;</span>
+1355   <span class="i">$This</span>-&gt;{<span class="w">ValidFingerprintsStringMode</span>} = <span class="n">0</span><span class="sc">;</span>
+1356 
+1357   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsStringMode</span>} =~ <span class="q">/^FingerprintsBitVectorString$/i</span><span class="s">)</span> <span class="s">{</span>
+1358     <span class="i">$This</span>-&gt;{<span class="w">FingerprintsBitVectorStringMode</span>} = <span class="n">1</span><span class="sc">;</span>
+1359   <span class="s">}</span>
+1360   <span class="k">elsif</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsStringMode</span>} =~ <span class="q">/^FingerprintsVectorString$/i</span><span class="s">)</span> <span class="s">{</span>
+1361     <span class="i">$This</span>-&gt;{<span class="w">FingerprintsVectorStringMode</span>} = <span class="n">1</span><span class="sc">;</span>
+1362   <span class="s">}</span>
+1363 
+1364   <span class="i">$This</span>-&gt;{<span class="w">ValidFingerprintsStringMode</span>} = <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsBitVectorStringMode</span>} || <span class="i">$This</span>-&gt;{<span class="w">FingerprintsVectorStringMode</span>}<span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+1365 
+1366   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsBitVectorStringMode</span>}<span class="s">)</span> <span class="s">{</span>
+1367     <span class="i">$This</span><span class="i">-&gt;_SetDefaultBitStringFormat</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1368     <span class="i">$This</span><span class="i">-&gt;_SetDefaultBitsOrder</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1369   <span class="s">}</span>
+1370   <span class="k">elsif</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsVectorStringMode</span>}<span class="s">)</span> <span class="s">{</span>
+1371     <span class="i">$This</span><span class="i">-&gt;_SetDefaultVectorStringFormat</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1372   <span class="s">}</span>
+1373 
+1374   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1375 <span class="s">}</span>
+1376 
+1377 <span class="c"># Set default value for bit string format...</span>
+1378 <span class="c">#</span>
+<a name="_SetDefaultBitStringFormat-"></a>1379 <span class="k">sub </span><span class="m">_SetDefaultBitStringFormat</span> <span class="s">{</span>
+1380   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1381 
+1382   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>-&gt;{<span class="w">BitStringFormat</span>}<span class="s">)</span> <span class="s">{</span>
+1383     <span class="i">$This</span>-&gt;{<span class="w">BitStringFormat</span>} = <span class="i">Fingerprints::FingerprintsStringUtil::GetDefaultBitStringFormat</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1384   <span class="s">}</span>
+1385 
+1386   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1387 <span class="s">}</span>
+1388 
+1389 <span class="c"># Set default value for bit string format...</span>
+1390 <span class="c">#</span>
+<a name="_SetDefaultBitsOrder-"></a>1391 <span class="k">sub </span><span class="m">_SetDefaultBitsOrder</span> <span class="s">{</span>
+1392   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1393 
+1394   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>-&gt;{<span class="w">BitsOrder</span>}<span class="s">)</span> <span class="s">{</span>
+1395     <span class="i">$This</span>-&gt;{<span class="w">BitsOrder</span>} = <span class="i">Fingerprints::FingerprintsStringUtil::GetDefaultBitsOrder</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1396   <span class="s">}</span>
+1397 
+1398   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1399 <span class="s">}</span>
+1400 
+1401 <span class="c"># Set default value for vector string format...</span>
+1402 <span class="c">#</span>
+<a name="_SetDefaultVectorStringFormat-"></a>1403 <span class="k">sub </span><span class="m">_SetDefaultVectorStringFormat</span> <span class="s">{</span>
+1404   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1405 
+1406   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>-&gt;{<span class="w">VectorStringFormat</span>} &amp;&amp; <span class="i">$This</span>-&gt;{<span class="w">FingerprintsObject</span>}<span class="s">)</span> <span class="s">{</span>
+1407     <span class="i">$This</span>-&gt;{<span class="w">VectorStringFormat</span>} = <span class="i">Fingerprints::FingerprintsStringUtil::GetDefaultVectorStringFormat</span><span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsObject</span>}<span class="s">)</span><span class="sc">;</span>
+1408   <span class="s">}</span>
+1409 
+1410   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1411 <span class="s">}</span>
+1412 
+1413 <span class="c"># Generate fingerprints object using current fingerprints string...</span>
+1414 <span class="c">#</span>
+<a name="_GenerateFingerprintsObject-"></a>1415 <span class="k">sub </span><span class="m">_GenerateFingerprintsObject</span> <span class="s">{</span>
+1416   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1417 
+1418   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsObject</span>} = <span class="k">undef</span><span class="sc">;</span>
+1419 
+1420   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>}<span class="s">)</span> <span class="s">{</span>
+1421     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1422   <span class="s">}</span>
+1423 
+1424   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsBitVectorStringMode</span>}<span class="s">)</span> <span class="s">{</span>
+1425     <span class="i">$This</span>-&gt;{<span class="w">FingerprintsObject</span>} = <span class="i">Fingerprints::FingerprintsStringUtil::ParseFingerprintsBitVectorString</span><span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>}<span class="s">)</span><span class="sc">;</span>
+1426   <span class="s">}</span>
+1427   <span class="k">elsif</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsVectorStringMode</span>}<span class="s">)</span> <span class="s">{</span>
+1428     <span class="i">$This</span>-&gt;{<span class="w">FingerprintsObject</span>} = <span class="i">Fingerprints::FingerprintsStringUtil::ParseFingerprintsVectorString</span><span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>}<span class="s">)</span><span class="sc">;</span>
+1429   <span class="s">}</span>
+1430   <span class="k">else</span> <span class="s">{</span>
+1431     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1432   <span class="s">}</span>
+1433 
+1434   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1435 <span class="s">}</span>
+1436 
+1437 <span class="c"># Generate fingerprints string using current fingerprints object...</span>
+1438 <span class="c">#</span>
+<a name="_GenerateFingerprintsString-"></a>1439 <span class="k">sub </span><span class="m">_GenerateFingerprintsString</span> <span class="s">{</span>
+1440   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1441 
+1442   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>} = <span class="q">&#39;&#39;</span><span class="sc">;</span>
+1443 
+1444   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>-&gt;{<span class="w">FingerprintsObject</span>}<span class="s">)</span> <span class="s">{</span>
+1445     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1446   <span class="s">}</span>
+1447 
+1448   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsBitVectorStringMode</span>}<span class="s">)</span> <span class="s">{</span>
+1449     <span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>} = <span class="i">Fingerprints::FingerprintsStringUtil::GenerateFingerprintsString</span><span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsObject</span>}<span class="cm">,</span> <span class="i">$This</span>-&gt;{<span class="w">BitStringFormat</span>}<span class="cm">,</span> <span class="i">$This</span>-&gt;{<span class="w">BitsOrder</span>}<span class="s">)</span><span class="sc">;</span>
+1450   <span class="s">}</span>
+1451   <span class="k">elsif</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsVectorStringMode</span>}<span class="s">)</span> <span class="s">{</span>
+1452     <span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>} = <span class="i">Fingerprints::FingerprintsStringUtil::GenerateFingerprintsString</span><span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsObject</span>}<span class="cm">,</span> <span class="i">$This</span>-&gt;{<span class="w">VectorStringFormat</span>}<span class="s">)</span><span class="sc">;</span>
+1453   <span class="s">}</span>
+1454 
+1455   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1456 <span class="s">}</span>
+1457 
+1458 <span class="c"># Generate fingerprints string using partial fingerprints string and header keys data...</span>
+1459 <span class="c">#</span>
+1460 <span class="c"># Notes:</span>
+1461 <span class="c">#   o FP file fingerprints data line only contain partial fingerprints data which</span>
+1462 <span class="c">#     can&#39;t be used directly to create fingerprints bit-vector or vector objects</span>
+1463 <span class="c">#     using functions available in FingerprintsStringUtil.pm module</span>
+1464 <span class="c">#</span>
+<a name="_GenerateFingerprintsStringFromPartialFingerprintsString-"></a>1465 <span class="k">sub </span><span class="m">_GenerateFingerprintsStringFromPartialFingerprintsString</span> <span class="s">{</span>
+1466   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1467   <span class="k">my</span><span class="s">(</span><span class="i">$FPStringDelim</span><span class="s">)</span><span class="sc">;</span>
+1468 
+1469   <span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>} = <span class="q">&#39;&#39;</span><span class="sc">;</span>
+1470 
+1471   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>-&gt;{<span class="w">PartialFingerprintsString</span>}<span class="s">)</span> <span class="s">{</span>
+1472     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1473   <span class="s">}</span>
+1474 
+1475   <span class="i">$FPStringDelim</span> = <span class="i">Fingerprints::FingerprintsStringUtil::GetFingeprintsStringDelimiter</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1476 
+1477   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsBitVectorStringMode</span>}<span class="s">)</span> <span class="s">{</span>
+1478     <span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>} = <span class="i">$This</span>-&gt;{<span class="w">FingerprintsBitVectorStringPrefix</span>} . <span class="i">$FPStringDelim</span> . <span class="i">$This</span>-&gt;{<span class="w">PartialFingerprintsString</span>}<span class="sc">;</span>
+1479   <span class="s">}</span>
+1480   <span class="k">elsif</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsVectorStringMode</span>}<span class="s">)</span> <span class="s">{</span>
+1481     <span class="k">my</span><span class="s">(</span><span class="i">$NumOfValues</span><span class="cm">,</span> <span class="i">$VectorStringData</span><span class="s">)</span><span class="sc">;</span>
+1482 
+1483     <span class="s">(</span><span class="i">$NumOfValues</span><span class="cm">,</span> <span class="i">$VectorStringData</span><span class="s">)</span> =  <span class="i">$This</span>-&gt;{<span class="w">PartialFingerprintsString</span>} =~ <span class="q">/^(.*?)$FPStringDelim(.*?)$/</span><span class="sc">;</span>
+1484     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$NumOfValues</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VectorStringData</span><span class="s">)</span> &amp;&amp; <span class="i">$VectorStringData</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1485       <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1486     <span class="s">}</span>
+1487 
+1488     <span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>} = <span class="i">$This</span>-&gt;{<span class="w">FingerprintsVectorStringPrefix1</span>} . <span class="i">$FPStringDelim</span> . <span class="i">$NumOfValues</span> . <span class="i">$FPStringDelim</span> . <span class="i">$This</span>-&gt;{<span class="w">FingerprintsVectorStringPrefix2</span>} . <span class="i">$FPStringDelim</span> . <span class="i">$VectorStringData</span><span class="sc">;</span>
+1489   <span class="s">}</span>
+1490 
+1491   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1492 <span class="s">}</span>
+1493 
+1494 <span class="c"># Generate partial fingerprints string using fingerprints string and header keys data...</span>
+1495 <span class="c">#</span>
+1496 <span class="c"># Notes:</span>
+1497 <span class="c">#   o FP file fingerprints data line only contain partial fingerprints data which</span>
+1498 <span class="c">#     can&#39;t be used directly to create fingerprints bit-vector or vector objects</span>
+1499 <span class="c">#     using functions available in FingerprintsStringUtil.pm module</span>
+1500 <span class="c">#</span>
+<a name="_GeneratePartialFingerprintsStringFromFingerprintsString-"></a>1501 <span class="k">sub </span><span class="m">_GeneratePartialFingerprintsStringFromFingerprintsString</span> <span class="s">{</span>
+1502   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1503 
+1504   <span class="i">$This</span>-&gt;{<span class="w">PartialFingerprintsString</span>} = <span class="q">&#39;&#39;</span><span class="sc">;</span>
+1505 
+1506   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>}<span class="s">)</span> <span class="s">{</span>
+1507     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1508   <span class="s">}</span>
+1509 
+1510   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsBitVectorStringMode</span>}<span class="s">)</span> <span class="s">{</span>
+1511     <span class="k">my</span><span class="s">(</span><span class="i">$VectorType</span><span class="cm">,</span> <span class="i">$Description</span><span class="cm">,</span> <span class="i">$Size</span><span class="cm">,</span> <span class="i">$BitStringFormat</span><span class="cm">,</span> <span class="i">$BitsOrder</span><span class="cm">,</span> <span class="i">$BitVectorString</span><span class="s">)</span><span class="sc">;</span>
+1512 
+1513     <span class="s">(</span><span class="i">$VectorType</span><span class="cm">,</span> <span class="i">$Description</span><span class="cm">,</span> <span class="i">$Size</span><span class="cm">,</span> <span class="i">$BitStringFormat</span><span class="cm">,</span> <span class="i">$BitsOrder</span><span class="cm">,</span> <span class="i">$BitVectorString</span><span class="s">)</span> = <span class="i">Fingerprints::FingerprintsStringUtil::GetFingerprintsStringValues</span><span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>}<span class="s">)</span><span class="sc">;</span>
+1514     <span class="i">$This</span>-&gt;{<span class="w">PartialFingerprintsString</span>} = <span class="i">$BitVectorString</span><span class="sc">;</span>
+1515   <span class="s">}</span>
+1516   <span class="k">elsif</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsVectorStringMode</span>}<span class="s">)</span> <span class="s">{</span>
+1517     <span class="k">my</span><span class="s">(</span><span class="i">$FPStringDelim</span><span class="cm">,</span> <span class="i">$VectorType</span><span class="cm">,</span> <span class="i">$Description</span><span class="cm">,</span> <span class="i">$NumOfValues</span><span class="cm">,</span> <span class="i">$VectorValuesType</span><span class="cm">,</span> <span class="i">$VectorStringFormat</span><span class="cm">,</span> <span class="i">$VectorString1</span><span class="cm">,</span> <span class="i">$VectorString2</span><span class="cm">,</span> <span class="i">$VectorString</span><span class="s">)</span><span class="sc">;</span>
+1518 
+1519     <span class="i">$FPStringDelim</span> = <span class="i">Fingerprints::FingerprintsStringUtil::GetFingeprintsStringDelimiter</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1520 
+1521     <span class="s">(</span><span class="i">$VectorType</span><span class="cm">,</span> <span class="i">$Description</span><span class="cm">,</span> <span class="i">$NumOfValues</span><span class="cm">,</span> <span class="i">$VectorValuesType</span><span class="cm">,</span> <span class="i">$VectorStringFormat</span><span class="cm">,</span> <span class="i">$VectorString1</span><span class="cm">,</span> <span class="i">$VectorString2</span><span class="s">)</span> = <span class="i">Fingerprints::FingerprintsStringUtil::GetFingerprintsStringValues</span><span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">FingerprintsString</span>}<span class="s">)</span><span class="sc">;</span>
+1522     <span class="i">$VectorString</span> = <span class="i">TextUtil::IsEmpty</span><span class="s">(</span><span class="i">$VectorString2</span><span class="s">)</span> ? <span class="i">$VectorString1</span> <span class="co">:</span> <span class="q">&quot;${VectorString1}${FPStringDelim}${VectorString2}&quot;</span><span class="sc">;</span>
+1523 
+1524     <span class="i">$This</span>-&gt;{<span class="w">PartialFingerprintsString</span>} = <span class="i">$NumOfValues</span> . <span class="i">$FPStringDelim</span> . <span class="i">$VectorString</span><span class="sc">;</span>
+1525   <span class="s">}</span>
+1526 
+1527   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1528 <span class="s">}</span>
+1529 
+1530 <span class="c"># Is it a fingerprints file?</span>
+<a name="IsFingerprintsFPFile-"></a>1531 <span class="k">sub </span><span class="m">IsFingerprintsFPFile ($;$)</span> <span class="s">{</span>
+1532   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1533   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$FileName</span><span class="cm">,</span> <span class="i">$Status</span><span class="s">)</span><span class="sc">;</span>
+1534 
+1535   <span class="k">if</span> <span class="s">(</span><span class="s">(</span><span class="i">@_</span> == <span class="n">2</span><span class="s">)</span> &amp;&amp; <span class="s">(</span><span class="i">_IsFingerprintsFPFileIO</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1536     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$FileName</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span>
+1537   <span class="s">}</span>
+1538   <span class="k">else</span> <span class="s">{</span>
+1539     <span class="i">$FileName</span> = <span class="i">$FirstParameter</span><span class="sc">;</span>
+1540   <span class="s">}</span>
+1541 
+1542   <span class="c"># Check file extension...</span>
+1543   <span class="i">$Status</span> = <span class="i">FileUtil::CheckFileType</span><span class="s">(</span><span class="i">$FileName</span><span class="cm">,</span> <span class="q">&quot;fpf fp&quot;</span><span class="s">)</span><span class="sc">;</span>
+1544 
+1545   <span class="k">return</span> <span class="i">$Status</span><span class="sc">;</span>
+1546 <span class="s">}</span>
+1547 
+1548 <span class="c"># Is it a FingerprintsFPFileIO object?</span>
+<a name="_IsFingerprintsFPFileIO-"></a>1549 <span class="k">sub </span><span class="m">_IsFingerprintsFPFileIO</span> <span class="s">{</span>
+1550   <span class="k">my</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1551 
+1552   <span class="k">return</span> <span class="s">(</span><span class="i">Scalar::Util::blessed</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> &amp;&amp; <span class="i">$Object</span><span class="i">-&gt;isa</span><span class="s">(</span><span class="i">$ClassName</span><span class="s">)</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+1553 <span class="s">}</span>
+1554 
+<a name="EOF-"></a></pre>
+<p>&nbsp;</p>
+<br />
+<center>
+<img src="../../../images/h2o2.png">
+</center>
+</body>
+</html>