Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re^2: Get variables from if with regex

by Saved (Beadle)
on Mar 08, 2013 at 13:10 UTC ( #1022416=note: print w/replies, xml ) Need Help??


in reply to Re: Get variables from if with regex
in thread Get variables from if with regex

Thanx, all help much appreciated.
# add 1362072030 dc=ifdsgroup,dc=com dn: uid=nce9834xdho,ou=user,ou=nce,ou=prod ! port 1362 dc=isgrp,dc=com changetype: add ifastCreateDate: 1362072030649 objectClass: account objectClass: ifastUser objectClass: top ifastModifyDate: 1362072030649 uid: nce9834xdho cn: nce9834xdho ifastProducts: WEB ifastGivenName: Omar ifastLanguage: en ifastFailedLogons: 0 ifastLastLogon: 15764 ifastEmailAddr: omar.hafez@td.com ifastSurname: Hafez structuralObjectClass: account entryUUID: e587875c-1616-1032-93e5-4b7d087c5768 createTimestamp: 20130228172030Z modifyTimestamp: 20130228172030Z # end add 1362072030 # add 1362072030 dc=ifdsgroup,dc=com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # end add 1362072030
The suggestion by choroba seems to work, and is part of the solution, but I can't seem to get it working with more than one instance of it in the same if statement: Works:
undef $/; $/="\n\n"; while(<IFILE>) { my @RESULT=(); my @LINES=split (/\n/, $_); if ((grep /objectClass:\s+account/, @LINES) && (grep /objectClass:\s+ifastUser/, @LINES) #&& (my ( $PRODS ) = /ifastProducts:\s+(.+)\s*$/, $_) && (my ( $USER ) = /dn: uid=(\w+?),.+/, $_)) { push(@RESULT, $USER); #push(@RESULT, $PRODS, $USER); print join "|", @RESULT; #print OFILE join "|", @RESULT; #print OFILE "\n"; print "\n"; } }
But this does not:
undef $/; $/="\n\n"; while(<IFILE>) { my @RESULT=(); my @LINES=split (/\n/, $_); if ((grep /objectClass:\s+account/, @LINES) && (grep /objectClass:\s+ifastUser/, @LINES) && (my ( $PRODS ) = /ifastProducts:\s+(.+)\s*$/, $_) && (my ( $USER ) = /dn: uid=(\w+?),.+/, $_)) { #push(@RESULT, $USER); push(@RESULT, $PRODS, $USER); print join "|", @RESULT; #print OFILE join "|", @RESULT; #print OFILE "\n"; print "\n"; } }

Replies are listed 'Best First'.
Re^3: Get variables from if with regex
by choroba (Bishop) on Mar 08, 2013 at 13:51 UTC
    Do you really need to split the paragraph into lines? You can match a multiline string against a regex, too:
    #!/usr/bin/perl use warnings; use strict; $/ = "\n\n"; while (<>) { my @result; if ( /objectClass:\s+account/ and /objectClass:\s+ifastUser/ and my ($prods) = /ifastProducts:\s+(.+?)\s*$/mg # The /m is +important here. and my ($user) = /dn: uid=(\w+?),./g) { push @result, $prods, $user; print join '|', @result; print "\n"; } }

    But if you need the array, you can have it. The , $_) part of your code does nothing, so remove it. Here is my attempt to do what you need:

    #!/usr/bin/perl use warnings; use strict; $/ = "\n\n"; while (<>) { my @result; my @lines = split /\n/; if ( ( grep /objectClass:\s+account/, @lines) and (grep /objectClass:\s+ifastUser/, @lines) and (my ($prods) = map /ifastProducts:\s+(.+?)\s*$/g, @lines) and (my ($user) = map /dn: uid=(\w+?),.+/g, @lines +)) { push @result, $prods, $user; print join '|', @result; print "\n"; } }
    لսႽ ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
      Looking Good so far! Thanx a bunch

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1022416]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (4)
As of 2018-07-17 19:56 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    It has been suggested to rename Perl 6 in order to boost its marketing potential. Which name would you prefer?















    Results (377 votes). Check out past polls.

    Notices?