Mercurial > repos > deepakjadmin > mayatool3_test3
diff mayachemtools/docs/modules/html/code/FingerprintsFPFileIO.html @ 0:73ae111cf86f draft
Uploaded
author | deepakjadmin |
---|---|
date | Wed, 20 Jan 2016 11:55:01 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mayachemtools/docs/modules/html/code/FingerprintsFPFileIO.html Wed Jan 20 11:55:01 2016 -0500 @@ -0,0 +1,1575 @@ +<html> +<head> +<title>MayaChemTools:Code:FileIO::FingerprintsFPFileIO.pm</title> +<meta http-equiv="content-type" content="text/html;charset=utf-8"> +<link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css"> +</head> +<body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10"> +<br/> +<center> +<a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a> +</center> +<br/> +<pre> +<a name="package-FileIO::FingerprintsFPFileIO-"></a> 1 <span class="k">package </span><span class="i">FileIO::FingerprintsFPFileIO</span><span class="sc">;</span> + 2 <span class="c">#</span> + 3 <span class="c"># $RCSfile: FingerprintsFPFileIO.pm,v $</span> + 4 <span class="c"># $Date: 2015/02/28 20:48:43 $</span> + 5 <span class="c"># $Revision: 1.19 $</span> + 6 <span class="c">#</span> + 7 <span class="c"># Author: Manish Sud <msud@san.rr.com></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 <http://www.gnu.org/licenses/> 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">=></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">->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">->_InitializeFingerprintsFPFileIO</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> + 60 + 61 <span class="i">$This</span><span class="i">->_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>->{<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>->{<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>->{<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's on the current line for current</span> + 105 <span class="c"># line during read/write...</span> + 106 <span class="i">$This</span>->{<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>->{<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>->{<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>->{<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>->{<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>->{<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">->_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">->_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>->{<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>->{<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>->{<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>->{<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>->{<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>->{<span class="w">NumOfLinesWithMissingData</span>} = <span class="n">0</span><span class="sc">;</span> + 158 <span class="i">$This</span>->{<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>->{<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>->{<span class="w">ValidFileData</span>} = <span class="n">0</span><span class="sc">;</span> + 165 <span class="i">$This</span>->{<span class="w">ValidRequiredHeaderDataKeys</span>} = <span class="n">0</span><span class="sc">;</span> + 166 <span class="i">$This</span>->{<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>->{<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>->{<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's set to ValuesString.</span> + 200 <span class="c">#</span> + 201 <span class="i">$This</span>->{<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>->{<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<PropertyName> 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">"Set${Name}"</span><span class="sc">;</span> + 219 <span class="i">$This</span><span class="i">->$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">"Error: ${ClassName}->New: Object can't be instantiated without specifying file name..."</span><span class="sc">;</span> + 224 <span class="s">}</span> + 225 + 226 <span class="c"># Make sure it'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">->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">"Error: ${ClassName}->New: Object can't be instantiated: File, $Name, doesn't appear to be fingerprints format..."</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">->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">->_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">->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">->_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>->{<span class="w">FingerprintsStringMode</span>}<span class="s">)</span> <span class="s">{</span> + 249 <span class="i">$This</span>->{<span class="w">FingerprintsStringMode</span>} = <span class="q">'AutoDetect'</span><span class="sc">;</span> + 250 <span class="s">}</span> + 251 + 252 <span class="i">$This</span><span class="i">->_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">"Error: ${ClassName}->New: Object can't be instantiated without specifying FingerprintsStringMode..."</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>->{<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">"Error: ${ClassName}->New: Object can't be instantiated: FingerprintsStringMode value, $This->{FingerprintsStringMode}, is not valid; Supported values for write/append: FingerprintsBitVectorString or FingerprintsVectorString..."</span><span class="sc">;</span> + 269 <span class="s">}</span> + 270 + 271 <span class="i">$This</span><span class="i">->_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">"Error: ${ClassName}->SetFingerprintsStringMode: FingerprintsStringMode value, $Value, is not valid; Supported values: AutoDetect, FingerprintsBitVectorString or FingerprintsVectorString..."</span><span class="sc">;</span> + 287 <span class="s">}</span> + 288 + 289 <span class="i">$This</span>->{<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">"Error: ${ClassName}->SetDetailLevel: DetailLevel value, $Value, is not valid; Supported values: > 0..."</span><span class="sc">;</span> + 301 <span class="s">}</span> + 302 + 303 <span class="i">$This</span>->{<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">"Error: ${ClassName}->SetBitStringFormat: BitStringFormat value, $Value, is not valid; Supported values: BinaryString or HexadecimalString..."</span><span class="sc">;</span> + 315 <span class="s">}</span> + 316 + 317 <span class="i">$This</span>->{<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">"Error: ${ClassName}->SetBitsOrder: FingerprintsStringMode value, $Value, is not valid; Supported values: Ascending or Descending..."</span><span class="sc">;</span> + 332 <span class="s">}</span> + 333 + 334 <span class="i">$This</span>->{<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">"Warning: ${ClassName}->SetCompoundID: Spaces are not allowed in compound ID; They have been removed..."</span><span class="sc">;</span> + 347 <span class="s">}</span> + 348 + 349 <span class="i">$This</span>->{<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">"Error: ${ClassName}->SetVectorStringFormat: FingerprintsStringMode value, $Value, is not valid; Supported values: IDsAndValuesString, IDsAndValuesPairsString, ValuesAndIDsString, ValuesAndIDsPairsString, or ValuesString..."</span><span class="sc">;</span> + 363 <span class="s">}</span> + 364 + 365 <span class="i">$This</span>->{<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>->{<span class="w">HeaderDataKeys</span>}} <span class="co">:</span> <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$This</span>->{<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">"Error: ${ClassName}->SetHeaderDataKeys: Can't set HeaderDataKeys: Not allowed..."</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>->{<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">"Error: ${ClassName}->SetHeaderDataKeysAndValues: Can't set HeaderDataKeysAndValues: Not allowed..."</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>->{<span class="w">RequiredHeaderDataKeys</span>}} <span class="co">:</span> <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$This</span>->{<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">"Error: ${ClassName}->SetRequiredHeaderDataKeys: Can't set RequiredHeaderDataKeys: Not allowed..."</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>->{<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">"Error: ${ClassName}->SetRequiredHeaderDataKeysAndValues: Can't set RequiredHeaderDataKeysAndValues: Not allowed..."</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>->{<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>->{<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>->{<span class="w">FingerprintsString</span>} ? <span class="i">$This</span>->{<span class="w">FingerprintsString</span>} <span class="co">:</span> <span class="q">'None'</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>->{<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>->{<span class="w">PartialFingerprintsString</span>} ? <span class="i">$This</span>->{<span class="w">PartialFingerprintsString</span>} <span class="co">:</span> <span class="q">'None'</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>->{<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>->{<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>->{<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>->{<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>->{<span class="w">CannonicalHeaderDataKeysAndValues</span>}{<span class="i">$CannonicalKey</span>} ? <span class="i">$This</span>->{<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">->_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>->{<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>->{<span class="w">ValidateData</span>}<span class="s">)</span> <span class="s">{</span> + 549 <span class="i">$This</span>->{<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>->{<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">->_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>->{<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">->_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">->_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">->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">->_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>->{<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">->_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>->{<span class="w">LineNum</span>} += <span class="n">1</span><span class="sc">;</span> + 599 <span class="i">$This</span>->{<span class="w">DataLine</span>} = <span class="i">TextUtil::GetTextLine</span><span class="s">(</span><span class="i">$This</span>->{<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>->{<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">->_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>->{<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> && <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>->{<span class="w">CompoundID</span>} = <span class="i">$CompoundID</span><span class="sc">;</span> + 626 <span class="i">$This</span>->{<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">->_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>->{<span class="w">CompoundID</span>} = <span class="k">undef</span><span class="sc">;</span> + 640 <span class="i">$This</span>->{<span class="w">DataLine</span>} = <span class="k">undef</span><span class="sc">;</span> + 641 + 642 <span class="i">$This</span>->{<span class="w">FingerprintsObject</span>} = <span class="k">undef</span><span class="sc">;</span> + 643 + 644 <span class="i">$This</span>->{<span class="w">FingerprintsString</span>} = <span class="k">undef</span><span class="sc">;</span> + 645 <span class="i">$This</span>->{<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>->{<span class="w">CompoundID</span>} && <span class="i">$This</span>->{<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>->{<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>->{<span class="w">DetailLevel</span>} >= <span class="n">3</span><span class="s">)</span> <span class="s">{</span> + 660 <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_ValidateReadDataLine: Data line number $This->{LineNum} contains no fingerprints data: $This->{DataLine}..."</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>->{<span class="w">DetailLevel</span>} >= <span class="n">2</span><span class="s">)</span> <span class="s">{</span> + 663 <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_ValidateReadDataLine: Data line number $This->{LineNum} contains no fingerprints data..."</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>->{<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>->{<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>->{<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>->{<span class="w">DetailLevel</span>} >= <span class="n">3</span><span class="s">)</span> <span class="s">{</span> + 682 <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_ValidateReadDataLine: Data line number $This->{LineNum} contains invalid fingerprints data: $This->{DataLine}..."</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>->{<span class="w">DetailLevel</span>} >= <span class="n">2</span><span class="s">)</span> <span class="s">{</span> + 685 <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_ValidateReadDataLine: Data line number $This->{LineNum} contains invalid fingerprints data..."</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>->{<span class="w">FingerprintsObject</span>}<span class="s">)</span> <span class="s">{</span> + 699 <span class="i">$This</span>->{<span class="w">FingerprintsObject</span>}<span class="i">->SetID</span><span class="s">(</span><span class="i">$This</span>->{<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>->{<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>->{<span class="w">FileHandle</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span> + 716 <span class="i">$This</span>->{<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>->{<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">->_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">->_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>->{<span class="w">ValidRequiredHeaderDataKeys</span>}<span class="s">)</span> <span class="s">{</span> + 742 <span class="i">$This</span><span class="i">->_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>->{<span class="w">ValidFileData</span>} = <span class="s">(</span><span class="i">$This</span>->{<span class="w">ValidRequiredHeaderDataKeys</span>} && <span class="i">$This</span>->{<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>->{<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">"Error: ${ClassName}->_RetrieveFPFileDataHeaders: File, $FPFile, doesn't exist..."</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">"$FPFile"</span><span class="s">)</span> <span class="s">{</span> + 764 <span class="w">croak</span> <span class="q">"Error: ${ClassName}->_RetrieveFPFileDataHeaders: Couldn't open input FP file $FPFile: $! ..."</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">'='</span><span class="sc">;</span> + 770 <span class="i">$KeyValuePairDelimiter</span> = <span class="q">';'</span><span class="sc">;</span> + 771 + 772 <span class="i">@</span>{<span class="i">$This</span>->{<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>->{<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>->{<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">"$KeyValuePairDelimiter"</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">"$KeyValueDelimiter"</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">''</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">''</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">"Warning: ${ClassName}->_RetrieveFPFileDataHeaders: Data header line containing \"Key = Value\" pairs is not valid: It must contain even number of \"Key = Value\" pairs with valid values. Ignoring data header line: \"$Line\"..."</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>->{<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> < <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>->{<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>->{<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>->{<span class="w">ValidRequiredHeaderDataKeys</span>} = <span class="n">0</span><span class="sc">;</span> + 823 <span class="i">@</span>{<span class="i">$This</span>->{<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">->IsHeaderDataKeyPresent</span><span class="s">(</span><span class="q">'FingerprintsStringType'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> + 827 <span class="w">carp</span> <span class="q">"carp: ${ClassName}->_ValidateReadHeaderDataKeysAndValues: FingerprintsStringType data header key is missing in fingerprints file..."</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">->GetHeaderDataKeyValue</span><span class="s">(</span><span class="q">'FingerprintsStringType'</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">->_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">"Warning: ${ClassName}->_ValidateReadHeaderDataKeysAndValues: FingerprintsStringType data header key value, $FingerprintsStringType, is not valid. SUpported values: FingerprintsBitVector or FingerprintsVector..."</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">->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">"Error: ${ClassName}->_ValidateReadHeaderDataKeysAndValues: Requires data header key, $Key, is missing in fingerprints file..."</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>->{<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">->_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">->_ProcessRequiredHeaderDataKeyValues</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> + 861 + 862 <span class="i">$This</span>->{<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>->{<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">->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">"Warning: ${ClassName}->_ValidateRequiredHeaderDataKeyValues: Required $Key data header key value, $Value, is not valid. Supported values: FingerprintsBitVector or FingerprintsVector..."</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">"Warning: ${ClassName}->_ValidateRequiredHeaderDataKeyValues: Required $Key data header key value, $Value, is not valid. Supported values: > 0..."</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">"Warning: ${ClassName}->_ValidateRequiredHeaderDataKeyValues: Required $Key data header key value, $Value, is not valid. Supported values: BinaryString or HexadecimalString ..."</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">"Warning: ${ClassName}->_ValidateRequiredHeaderDataKeyValues: Required $Key data header key value, $Value, is not valid. Supported values: Ascending or Descending..."</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">"Warning: ${ClassName}->_ValidateRequiredHeaderDataKeyValues: Required $Key data header key value, $Value, is not valid. Supported values: IDsAndValuesString, IDsAndValuesPairsString, ValuesAndIDsString, ValuesAndIDsPairsString, or ValuesString ..."</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">"Warning: ${ClassName}->_ValidateRequiredHeaderDataKeyValues: Required $Key data header key value, $Value, is not valid. Supported values: OrderedNumericalValues, NumericalValues or AlphaNumericalValues..."</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">"Warning: ${ClassName}->_ValidateRequiredHeaderDataKeyValues: Required $Key data header key value is not valid. Supported value: A no-empty text string..."</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">"Warning: ${ClassName}->_ValidateRequiredHeaderDataKeyValues: Required $Key data header key is not not supported..."</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>->{<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>->{<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">->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>->{<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>->{<span class="w">FingerprintsBitVectorStringPrefix</span>} = <span class="q">''</span><span class="sc">;</span> + 950 <span class="i">$This</span>->{<span class="w">FingerprintsVectorStringPrefix1</span>} = <span class="q">''</span><span class="sc">;</span> + 951 <span class="i">$This</span>->{<span class="w">FingerprintsVectorStringPrefix2</span>} = <span class="q">''</span><span class="sc">;</span> + 952 + 953 <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<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>->{<span class="w">FingerprintsBitVectorStringPrefix</span>} = <span class="i">$This</span><span class="i">->_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>->{<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>->{<span class="w">FingerprintsVectorStringPrefix1</span>} = <span class="i">$This</span><span class="i">->_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>->{<span class="w">FingerprintsVectorStringPrefix2</span>} = <span class="i">$This</span><span class="i">->_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>->{<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">"Warning: ${ClassName}->GetRequiredHeaderDataKeys: FingerprintsStringType value, $FingerprintsStringType, is not valid. Supported values: FingerprintsBitVector or FingerprintsVector..."</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>->{<span class="w">ValidFingerprintsStringMode</span>} = <span class="n">0</span><span class="sc">;</span> +1012 <span class="i">$This</span>->{<span class="w">FingerprintsBitVectorStringMode</span>} = <span class="n">0</span><span class="sc">;</span> +1013 <span class="i">$This</span>->{<span class="w">FingerprintsVectorStringMode</span>} = <span class="n">0</span><span class="sc">;</span> +1014 +1015 <span class="i">$This</span>->{<span class="w">FirstFingerprintsStringType</span>} = <span class="q">''</span><span class="sc">;</span> +1016 <span class="i">$This</span>->{<span class="w">FirstFingerprintsStringDescription</span>} = <span class="q">''</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">''</span><span class="sc">;</span> +1022 <span class="i">$FirstFingerprintsStringDescription</span> = <span class="q">''</span><span class="sc">;</span> +1023 +1024 <span class="i">$FingerprintsStringType</span> = <span class="i">$This</span><span class="i">->GetHeaderDataKeyValue</span><span class="s">(</span><span class="q">'FingerprintsStringType'</span><span class="s">)</span><span class="sc">;</span> +1025 <span class="i">$FingerprintsStringDescription</span> = <span class="i">$This</span><span class="i">->GetHeaderDataKeyValue</span><span class="s">(</span><span class="q">'Description'</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>->{<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">"Warning: ${ClassName}->_ValidateReadFingerprintsStringMode: Fingerprints string data type, $FingerprintsStringType, doesn't correspond to, FingerprintsBitVectorString, specified using \"FingerprintsStringMode\"..."</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">'FingerprintsBitVector'</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>->{<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">"Warning: ${ClassName}->_ValidateReadFingerprintsStringMode: Fingerprints string data type, $FingerprintsStringType, doesn't correspond to, FingerprintsVectorString, specified using \"FingerprintsStringMode\"..."</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">'FingerprintsVector'</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">"Warning: ${ClassName}->_ValidateReadFingerprintsStringMode: Fingerprints string data type, $FingerprintsStringType, identified during, AutoDetect, value of \"FingerprintsStringMode\" is not valid; Supported fingerprints types: FingerprintBitVector or FingerprintsVector..."</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>->{<span class="w">ValidFingerprintsStringMode</span>} = <span class="n">1</span><span class="sc">;</span> +1062 +1063 <span class="i">$This</span>->{<span class="w">FingerprintsBitVectorStringMode</span>} = <span class="i">$FingerprintsBitVectorStringMode</span><span class="sc">;</span> +1064 <span class="i">$This</span>->{<span class="w">FingerprintsVectorStringMode</span>} = <span class="i">$FingerprintsVectorStringMode</span><span class="sc">;</span> +1065 +1066 <span class="i">$This</span>->{<span class="w">FirstFingerprintsStringType</span>} = <span class="i">$FirstFingerprintsStringType</span><span class="sc">;</span> +1067 <span class="i">$This</span>->{<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">->_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>->{<span class="w">FingerprintsObject</span>} = <span class="i">$FingerprintsObject</span><span class="sc">;</span> +1083 <span class="i">$This</span><span class="i">->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">->_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">->_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">->_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'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">->_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>->{<span class="w">FingerprintsString</span>} = <span class="i">$FingerprintsString</span><span class="sc">;</span> +1113 <span class="i">$This</span><span class="i">->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">->_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">->_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">->_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>->{<span class="w">DataLine</span>} = <span class="k">undef</span><span class="sc">;</span> +1133 <span class="i">$This</span>->{<span class="w">CompoundID</span>} = <span class="k">undef</span><span class="sc">;</span> +1134 +1135 <span class="i">$This</span>->{<span class="w">FingerprintsObject</span>} = <span class="k">undef</span><span class="sc">;</span> +1136 +1137 <span class="i">$This</span>->{<span class="w">FingerprintsString</span>} = <span class="k">undef</span><span class="sc">;</span> +1138 <span class="i">$This</span>->{<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>->{<span class="w">FirstDataLineIO</span>}<span class="s">)</span> <span class="s">{</span> +1150 <span class="i">$This</span><span class="i">->_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>->{<span class="w">CompoundID</span>} . <span class="q">' '</span> . <span class="i">$This</span>->{<span class="w">PartialFingerprintsString</span>}<span class="sc">;</span> +1155 +1156 <span class="i">$This</span>->{<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>->{<span class="w">FileHandle</span>}<span class="sc">;</span> +1158 <span class="k">print</span> <span class="i">$FileHandle</span> <span class="q">"$Line\n"</span><span class="sc">;</span> +1159 +1160 <span class="i">$This</span>->{<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>->{<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">->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">->_WritePackageAndTimeStampHeaderKeys</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> +1176 <span class="i">$This</span><span class="i">->_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>->{<span class="w">FileHandle</span>}<span class="sc">;</span> +1189 +1190 <span class="c"># Package information...</span> +1191 <span class="i">$This</span>->{<span class="w">LineNum</span>} += <span class="n">1</span><span class="sc">;</span> +1192 <span class="i">$Key</span> = <span class="q">"Package"</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">" "</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">"# $Key = $Value\n"</span><span class="sc">;</span> +1194 +1195 <span class="i">$This</span>->{<span class="w">LineNum</span>} += <span class="n">1</span><span class="sc">;</span> +1196 <span class="i">$Key</span> = <span class="q">"Release Date"</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">"# $Key = $Value\n"</span><span class="sc">;</span> +1198 +1199 <span class="c"># Timestamp information...</span> +1200 <span class="i">$This</span>->{<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">"#\n"</span><span class="sc">;</span> +1202 +1203 <span class="i">$This</span>->{<span class="w">LineNum</span>} += <span class="n">1</span><span class="sc">;</span> +1204 <span class="i">$Key</span> = <span class="q">"TimeStamp"</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">"# $Key = $Value\n"</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>->{<span class="w">FileHandle</span>}<span class="sc">;</span> +1217 +1218 <span class="i">$This</span><span class="i">->_GenerateWriteRequiredHeaderDataKeys</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> +1219 +1220 <span class="i">$This</span>->{<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">"#\n"</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>->{<span class="w">RequiredHeaderDataKeys</span>}}<span class="s">)</span> <span class="s">{</span> +1224 <span class="i">$Value</span> = <span class="i">$This</span>->{<span class="w">RequiredHeaderDataKeysAndValues</span>}{<span class="i">$Key</span>}<span class="sc">;</span> +1225 +1226 <span class="i">$This</span>->{<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">"# $Key = $Value\n"</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>->{<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">"#\n"</span><span class="sc">;</span> +1232 <span class="s">}</span> +1233 <span class="s">}</span> +1234 +1235 <span class="i">$This</span>->{<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">"#\n"</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>->{<span class="w">FingerprintsBitVectorStringMode</span>} && <span class="s">(</span><span class="i">$This</span>->{<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">->_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>->{<span class="w">FingerprintsVectorStringMode</span>} && <span class="s">(</span><span class="i">$This</span>->{<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">->_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">"Error: ${ClassName}->_GenerateWriteRequiredHeaderDataKeys: Required header data keys can't be generated: FingerprintsStringMode value, $This->{FingerprintsStringMode}, doesn't correspond to type of first FingerprintsString: $This->{FingerprintsString}..."</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>->{<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>->{<span class="w">RequiredHeaderDataKeys</span>}}<span class="cm">,</span> <span class="i">$This</span><span class="i">->_GetRequiredHeaderDataKeys</span><span class="s">(</span><span class="q">'FingerprintsBitVector'</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>->{<span class="w">FingerprintsString</span>}<span class="s">)</span><span class="sc">;</span> +1267 +1268 <span class="i">%</span>{<span class="i">$This</span>->{<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>->{<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>->{<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>->{<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>->{<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>->{<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>->{<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">"Error: ${ClassName}->_GenerateWriteRequiredHeaderDataKeysForBitVectorString: Required header data key, $Key, value can't be generated: It's not a known key ..."</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>->{<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>->{<span class="w">RequiredHeaderDataKeys</span>}}<span class="cm">,</span> <span class="i">$This</span><span class="i">->_GetRequiredHeaderDataKeys</span><span class="s">(</span><span class="q">'FingerprintsVector'</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>->{<span class="w">FingerprintsString</span>}<span class="s">)</span><span class="sc">;</span> +1309 +1310 <span class="i">%</span>{<span class="i">$This</span>->{<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>->{<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>->{<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>->{<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>->{<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>->{<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">"Error: ${ClassName}->_GenerateWriteRequiredHeaderDataKeysForVectorString: Required header data key, $Key, value can't be generated: It's not a known key ..."</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>->{<span class="w">Name</span>}<span class="sc">;</span> +1345 <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>->{<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">"Error: ${ClassName}->_PrepareForWritingFingerprintsFPFileData: File, $FPFile, already exist. Use overwrite option..."</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>->{<span class="w">FingerprintsBitVectorStringMode</span>} = <span class="n">0</span><span class="sc">;</span> +1354 <span class="i">$This</span>->{<span class="w">FingerprintsVectorStringMode</span>} = <span class="n">0</span><span class="sc">;</span> +1355 <span class="i">$This</span>->{<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>->{<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>->{<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>->{<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>->{<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>->{<span class="w">ValidFingerprintsStringMode</span>} = <span class="s">(</span><span class="i">$This</span>->{<span class="w">FingerprintsBitVectorStringMode</span>} || <span class="i">$This</span>->{<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>->{<span class="w">FingerprintsBitVectorStringMode</span>}<span class="s">)</span> <span class="s">{</span> +1367 <span class="i">$This</span><span class="i">->_SetDefaultBitStringFormat</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> +1368 <span class="i">$This</span><span class="i">->_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>->{<span class="w">FingerprintsVectorStringMode</span>}<span class="s">)</span> <span class="s">{</span> +1371 <span class="i">$This</span><span class="i">->_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>->{<span class="w">BitStringFormat</span>}<span class="s">)</span> <span class="s">{</span> +1383 <span class="i">$This</span>->{<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>->{<span class="w">BitsOrder</span>}<span class="s">)</span> <span class="s">{</span> +1395 <span class="i">$This</span>->{<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>->{<span class="w">VectorStringFormat</span>} && <span class="i">$This</span>->{<span class="w">FingerprintsObject</span>}<span class="s">)</span> <span class="s">{</span> +1407 <span class="i">$This</span>->{<span class="w">VectorStringFormat</span>} = <span class="i">Fingerprints::FingerprintsStringUtil::GetDefaultVectorStringFormat</span><span class="s">(</span><span class="i">$This</span>->{<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>->{<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>->{<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>->{<span class="w">FingerprintsBitVectorStringMode</span>}<span class="s">)</span> <span class="s">{</span> +1425 <span class="i">$This</span>->{<span class="w">FingerprintsObject</span>} = <span class="i">Fingerprints::FingerprintsStringUtil::ParseFingerprintsBitVectorString</span><span class="s">(</span><span class="i">$This</span>->{<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>->{<span class="w">FingerprintsVectorStringMode</span>}<span class="s">)</span> <span class="s">{</span> +1428 <span class="i">$This</span>->{<span class="w">FingerprintsObject</span>} = <span class="i">Fingerprints::FingerprintsStringUtil::ParseFingerprintsVectorString</span><span class="s">(</span><span class="i">$This</span>->{<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>->{<span class="w">FingerprintsString</span>} = <span class="q">''</span><span class="sc">;</span> +1443 +1444 <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>->{<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>->{<span class="w">FingerprintsBitVectorStringMode</span>}<span class="s">)</span> <span class="s">{</span> +1449 <span class="i">$This</span>->{<span class="w">FingerprintsString</span>} = <span class="i">Fingerprints::FingerprintsStringUtil::GenerateFingerprintsString</span><span class="s">(</span><span class="i">$This</span>->{<span class="w">FingerprintsObject</span>}<span class="cm">,</span> <span class="i">$This</span>->{<span class="w">BitStringFormat</span>}<span class="cm">,</span> <span class="i">$This</span>->{<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>->{<span class="w">FingerprintsVectorStringMode</span>}<span class="s">)</span> <span class="s">{</span> +1452 <span class="i">$This</span>->{<span class="w">FingerprintsString</span>} = <span class="i">Fingerprints::FingerprintsStringUtil::GenerateFingerprintsString</span><span class="s">(</span><span class="i">$This</span>->{<span class="w">FingerprintsObject</span>}<span class="cm">,</span> <span class="i">$This</span>->{<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'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>->{<span class="w">FingerprintsString</span>} = <span class="q">''</span><span class="sc">;</span> +1470 +1471 <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>->{<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>->{<span class="w">FingerprintsBitVectorStringMode</span>}<span class="s">)</span> <span class="s">{</span> +1478 <span class="i">$This</span>->{<span class="w">FingerprintsString</span>} = <span class="i">$This</span>->{<span class="w">FingerprintsBitVectorStringPrefix</span>} . <span class="i">$FPStringDelim</span> . <span class="i">$This</span>->{<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>->{<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>->{<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> && <span class="k">defined</span><span class="s">(</span><span class="i">$VectorStringData</span><span class="s">)</span> && <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>->{<span class="w">FingerprintsString</span>} = <span class="i">$This</span>->{<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>->{<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'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>->{<span class="w">PartialFingerprintsString</span>} = <span class="q">''</span><span class="sc">;</span> +1505 +1506 <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span>->{<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>->{<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>->{<span class="w">FingerprintsString</span>}<span class="s">)</span><span class="sc">;</span> +1514 <span class="i">$This</span>->{<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>->{<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>->{<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">"${VectorString1}${FPStringDelim}${VectorString2}"</span><span class="sc">;</span> +1523 +1524 <span class="i">$This</span>->{<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> && <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">"fpf fp"</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> && <span class="i">$Object</span><span class="i">->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> </p> +<br /> +<center> +<img src="../../../images/h2o2.png"> +</center> +</body> +</html>