Mercurial > repos > deepakjadmin > mayatool3_test3
view mayachemtools/docs/modules/html/code/FingerprintsFPFileIO.html @ 9:ab29fa5c8c1f draft default tip
Uploaded
author | deepakjadmin |
---|---|
date | Thu, 15 Dec 2016 14:18:03 -0500 |
parents | 73ae111cf86f |
children |
line wrap: on
line source
<html> <head> <title>MayaChemTools:Code:FileIO::FingerprintsFPFileIO.pm</title> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css"> </head> <body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10"> <br/> <center> <a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a> </center> <br/> <pre> <a name="package-FileIO::FingerprintsFPFileIO-"></a> 1 <span class="k">package </span><span class="i">FileIO::FingerprintsFPFileIO</span><span class="sc">;</span> 2 <span class="c">#</span> 3 <span class="c"># $RCSfile: FingerprintsFPFileIO.pm,v $</span> 4 <span class="c"># $Date: 2015/02/28 20:48:43 $</span> 5 <span class="c"># $Revision: 1.19 $</span> 6 <span class="c">#</span> 7 <span class="c"># Author: Manish Sud <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>