Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Perl Misc (http://www.velocityreviews.com/forums/f67-perl-misc.html)
-   -   Line separator issues using OLE / outlook (http://www.velocityreviews.com/forums/t897557-line-separator-issues-using-ole-outlook.html)

niall.macpherson@ntlworld.com 04-19-2006 11:23 AM

Line separator issues using OLE / outlook
 
I am using the outlook interface for the first time . I am attempting
to read a mail message which has a number of lines which should match
the pattern
/(.*),(\d\d\d\d-\d\d-\d\d),(\d\d:\d\d:\d\d),(\d*)/


To test the pattern match I used the following test program
-------------------------------------------------------------------------------------------------------------
use strict;
use warnings;
use Data::Dumper;

my $bigstring = '';
while(<DATA>)
{
$bigstring .= $_;
}
print Dumper $bigstring;
while($bigstring =~
/(.*),(\d\d\d\d-\d\d-\d\d),(\d\d:\d\d:\d\d),(\d*)/g)
{
my ($tablename, $date, $time, $ticks) = ($1, $2, $3, $4);

print Dumper $tablename, $date, $time, $ticks;
}
__END__
fxticks,2006-04-19,09:40:04,412130617,
bondticks,2006-04-19,09:40:04,361784391,
ir_swapticks,2006-04-19,09:40:04,241879716,
intrateticks,2006-04-19,09:40:04,232578257,
fraticks,2006-04-19,09:40:04,209225323,
rtrspttick,2006-04-19,09:40:04,205294165,

-------------------------------------------------------------------------------------------------------------------------

which produced the desired output

C:\develop\NiallPerlScripts>multimatch.pl
$VAR1 = 'fxticks,2006-04-19,09:40:04,412130617,
bondticks,2006-04-19,09:40:04,361784391,
ir_swapticks,2006-04-19,09:40:04,241879716,
intrateticks,2006-04-19,09:40:04,232578257,
fraticks,2006-04-19,09:40:04,209225323,
rtrspttick,2006-04-19,09:40:04,205294165,';
$VAR1 = 'fxticks';
$VAR2 = '2006-04-19';
$VAR3 = '09:40:04';
$VAR4 = '412130617';
$VAR1 = 'bondticks';
$VAR2 = '2006-04-19';
$VAR3 = '09:40:04';
$VAR4 = '361784391';
$VAR1 = 'ir_swapticks';
$VAR2 = '2006-04-19';
$VAR3 = '09:40:04';
$VAR4 = '241879716';
$VAR1 = 'intrateticks';
$VAR2 = '2006-04-19';
$VAR3 = '09:40:04';
$VAR4 = '232578257';
$VAR1 = 'fraticks';
$VAR2 = '2006-04-19';
$VAR3 = '09:40:04';
$VAR4 = '209225323';
$VAR1 = 'rtrspttick';
$VAR2 = '2006-04-19';
$VAR3 = '09:40:04';
$VAR4 = '205294165';

C:\develop\NiallPerlScripts>

-----------------------------------------------------------------------------------------------------------------------------------

However, when I incorporated this into my program which reads the data
from outlook as follows

use strict;
use warnings;
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Outlook';
use Data::Dumper;

my $outlook = Win32::OLE->new('Outlook.Application') or die
"Error!\n";

my $namespace = $outlook->GetNamespace("MAPI");
my $folder = $namespace->GetDefaultFolder(olFolderInbox);
my $items = $folder->Items;

my %tickstats;

for my $itemIndex (1..$items->Count)
{
my $message = $items->item($itemIndex);
next if not defined $message;

if($message->{Subject} =~ /Tick Status Test/)
{
print Dumper 'Body ' . $message->{Body};

while( $message->{Body} =~
/(.*),(\d\d\d\d-\d\d-\d\d),(\d\d:\d\d:\d\d),(\d*)/g)
{
my ($tablename, $date, $time, $ticks) = ($1, $2, $3, $4);

print Dumper $tablename, $date, $time, $ticks;
$tickstats{ $tablename } { $date } = $ticks;
}
}
}
print Dumper \%tickstats;

exit(0);
--------------------------------------------------------------------------------------------------------------------------------
I ended up with an infinite loop - the first line just keeps getting
re-processed

C:\develop\NiallPerlScripts>outlook.pl
$VAR1 = 'Body fxticks,2006-04-19,09:40:04,412130617,
bondticks,2006-04-19,09:40:04,361784391,
ir_swapticks,2006-04-19,09:40:04,241879716,
intrateticks,2006-04-19,09:40:04,232578257,
fraticks,2006-04-19,09:40:04,209225323,
rtrspttick,2006-04-19,09:40:04,205294165,
';
$VAR1 = 'fxticks';
$VAR2 = '2006-04-19';
$VAR3 = '09:40:04';
$VAR4 = '412130617';
$VAR1 = 'fxticks';
$VAR2 = '2006-04-19';
$VAR3 = '09:40:04';
$VAR4 = '412130617';
$VAR1 = 'fxticks';
$VAR2 = '2006-04-19';
$VAR3 = '09:40:04';
$VAR4 = '412130617';
$VAR1 = 'fxticks';
$VAR2 = '2006-04-19';
$VAR3 = '09:40:04';
$VAR4 = '412130617';
$VAR1 = 'fxticks';
$VAR2 = '2006-04-19';
$VAR3 = '09:40:04';
$VAR4 = '412130617';
$VAR1 = 'fxticks';
$VAR2 = '2006-04-19';
$VAR3 = '09:40:04';
$VAR4 = '412130617';
.................................................. ...................
.................................................. ..................,.
ad infintum .......

I cannot see why - can anyone help ?

Thanks


Brian McCauley 04-19-2006 09:13 PM

Re: Line separator issues using OLE / outlook
 

niall.macpherson@ntlworld.com wrote:

[ Let me take this opportunity to congratuate Niall on a question well
asked ]

> I am using the outlook interface for the first time . I am attempting
> to read a mail message which has a number of lines which should match
> the pattern
> /(.*),(\d\d\d\d-\d\d-\d\d),(\d\d:\d\d:\d\d),(\d*)/
>
> To test the pattern match I used the following test program


> while($bigstring =~
> /(.*),(\d\d\d\d-\d\d-\d\d),(\d\d:\d\d:\d\d),(\d*)/g)


> which produced the desired output


> However, when I incorporated this into my program which reads the data
> from outlook as follows


> my $namespace = $outlook->GetNamespace("MAPI");
> my $folder = $namespace->GetDefaultFolder(olFolderInbox);
> my $items = $folder->Items;


> for my $itemIndex (1..$items->Count)
> {
> my $message = $items->item($itemIndex);


> while( $message->{Body} =~
> /(.*),(\d\d\d\d-\d\d-\d\d),(\d\d:\d\d:\d\d),(\d*)/g)


> I cannot see why - can anyone help ?


$message is not a simple hash but an object that presents a hash-like
interface. When you say $message->{Body} you are actually calling a
method tied(%{$message})->FETCH('Body').

Now the way m//g in a scalar context works is rather odd. Every scalar
lvalue in Perl has a special hidden attibute called 'pos' that can be
manipulated via the pos() function which records the "current search
position". But when you call the FETCH method in a loop as you do above
you get a fresh scalar value each time with a pos of 0.

Note: this is still unavoidably the case even if the FETCH() method is
given an lvalue attribute. IMNSHO this is a bug in perl.

Try the following

my $body = $message->{Body};
while( $body =~ /(.*),(\d\d\d\d-\d\d-\d\d),(\d\d:\d\d:\d\d),(\d*)/g)

This way pos($body) gets to retain the current search position within
the string between iterations of the loop.


niall.macpherson@ntlworld.com 04-20-2006 10:26 AM

Re: Line separator issues using OLE / outlook
 

Brian McCauley wrote:

> Now the way m//g in a scalar context works is rather odd. Every scalar
> lvalue in Perl has a special hidden attibute called 'pos' that can be
> manipulated via the pos() function which records the "current search
> position". But when you call the FETCH method in a loop as you do above
> you get a fresh scalar value each time with a pos of 0.
>
> Note: this is still unavoidably the case even if the FETCH() method is
> given an lvalue attribute. IMNSHO this is a bug in perl.
>
> Try the following
>
> my $body = $message->{Body};
> while( $body =~ /(.*),(\d\d\d\d-\d\d-\d\d),(\d\d:\d\d:\d\d),(\d*)/g)
>
> This way pos($body) gets to retain the current search position within
> the string between iterations of the loop.


Thanks for the suggestion and the explanation Brian - I have changed
the code as suggested and all is now working as expected !



All times are GMT. The time now is 05:23 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.