Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

comment on

( [id://3333]=superdoc: print w/replies, xml ) Need Help??

G'day Mark.Allan,

There are a number of issues with what you posted. One or more of these may be the cause of your problems. You'll need to adjust your problem description and/or data and/or expected output as described here:

  • In $VAR1, you have "'server=cvmfsser3::FS=/opt/apps'" which has no terminal comma. This generates a syntax error ("String found where operator expected"). I've made the assumption that this is a typo and added the comma in my code below; however, see the next point which may indicate some other problem here.
  • In $VAR1, you have "'FS=/bar/cut/data03:NO',". Note the issue with the previous element (from the last point). You have no "server=..." in this element: that may be correct or there could be missing data. Regardless, that element cannot be a "MATCH" (in your expected output) unless the problem description "... complete match (ie server and fs) ..." is wrong. Either change the data, the problem description, or the expected output.
  • In $VAR1, you've used a single colon as a separator throughout except in "'server=cvmfsser3::FS=/opt/apps'". This raises yet another question mark regarding the accuracy of this data element. I've coded around this discrepancy but you'll need to look at this and fix if necessary.
  • In some places you show pathnames with a trailing slash ('/'), in others this is absent. Again, I don't know whether this is a real issue or a typo. I've coded around this by canonicalising the filesystem value.

If you copy and paste your code and data, we will see exactly what you're seeing. Trying to make multiple guesses as to what is and isn't a typo is both annoying and error-prone. Please bear this in mind with any future posts.

I believe this code should be close to what you want. You may need to make changes where the assumptions and guesses I've documented are incorrect.

#!/usr/bin/env perl use strict; use warnings; my @checks = ( 'server=bar116aix,bar117aix:FS=/tmp', 'server=cvmfsser1, cvmfsser2:FS=/opt/apps', 'server=cvmfsser3::FS=/opt/apps', 'FS=/bar/cut/data03:NO', 'server=baraix665, baraix666, baraix667:FS=/data/hp/feeds', 'server=vmdprd:FS=/opt/tuxedo', 'server=testserver1:FS=/data/repository', ); my %data; while (<DATA>) { my ($server, $fs) = (split /::/)[0, 1]; $fs = canonicalise_fs($fs); $data{both}{join '::' => $server, $fs} = undef; $data{server}{$server} = undef; $data{fs}{$fs} = undef; } for (@checks) { print "'$_',\t"; my $server = /server=([^:]+)/ ? $1 : ''; my $fs = /FS=([^:]+)/ ? $1 : ''; $fs = canonicalise_fs($fs); if (exists $data{both}{join '::' => $server, $fs}) { print ''; } elsif (exists $data{server}{$server} or exists $data{fs}{$fs}) { print 'PART '; } else { print 'NO '; } print "MATCH\n"; } sub canonicalise_fs { my $fs = shift; $fs .= '/' unless length $fs and $fs =~ /\/$/; return $fs; } __DATA__ vmaprd::/opt/vmaprd/application::intel vmclprd::/opt/vmclprd/apps/oracle::db_support vmdprd::/opt/vmdprd/db2::db_support cvmfsser1::/opt/apps/::app_support cvmfsser3::/opt/apps/::app_support d87ser1::/opt/db2ese::db_support aix5server::/bar/cut/data03::aix_sup linuxvm001::/bar/cut/data04::linux_sup

Output:

'server=bar116aix,bar117aix:FS=/tmp', NO MATCH 'server=cvmfsser1, cvmfsser2:FS=/opt/apps', PART MATCH 'server=cvmfsser3::FS=/opt/apps', MATCH 'FS=/bar/cut/data03:NO', PART MATCH 'server=baraix665, baraix666, baraix667:FS=/data/hp/feeds', NO MATC +H 'server=vmdprd:FS=/opt/tuxedo', PART MATCH 'server=testserver1:FS=/data/repository', NO MATCH

-- Ken


In reply to Re: Matching array elements against file by kcott
in thread Matching array elements against file by Mark.Allan

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or How to display code and escape characters are good places to start.
Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others taking refuge in the Monastery: (5)
As of 2024-03-28 22:10 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found