view mayachemtools/docs/modules/html/code/FingerprintsFPFileIO.html @ 9:ab29fa5c8c1f draft default tip

Uploaded
author deepakjadmin
date Thu, 15 Dec 2016 14:18:03 -0500
parents 73ae111cf86f
children
line wrap: on
line source

<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>