Ask a Question related to PERL Modules, Design and Development.
-
Ronald Fischer #1
Text::Diff usage question
I would like to compare two arrays of lines. If the arrays
are different, I want to output the differences in human-readable
form, and also call a function f().
I think that Text::Diff, found on CPAN, would useful. Indeed it
works, but my code looks a bit cumbersome and I wonder whether
one can make it easier:
# Compare the arrays
my @status_diff=Text::Diff::diff(\@after,\@before);
unless(@status_diff eq 0
|| (@status_diff eq 1 and length($status_diff[0]) eq 0))
{
# Lines differ
print(@status_diff); # print differences
f() # call f
}
What looks a bit complicated is the condition inside the "unless".
Even on identical arrays, diff returns an array of 1 string of
zero length. But I can't simplify it to, say
if(length($status_diff[0])) { print(...); f() }
because I could imagine that there are cases where diff
returns an empty list or even undef (I didn't find anything
in the diff documentation which guarantees that the output
is always an array of at least one string, when the default
formatter is used - or did I overlook something here in the
docs?).
Any suggestion how I could write this in a better way?
Ronald
--
Ronald Fischer <ronaldf@eml.cc>
Posted via [url]http://www.newsoffice.de/[/url]
Ronald Fischer Guest
-
Question about CPAN's Text::Diff
Hi all: This newbie would like to compare two files, let's say File1 and File2. I want to put the difference from File2 only, into a new file,... -
One question on ColorSpace usage via SDk
Hi, If particular element uses ColorSpace - then I see structure like this: /CS0 cs 0 scn .... Is it possible via PDE layer to change that... -
Space Usage on Informix Question
Whats the best way to make sure you dont run out of space on your machines ? I've set up some purge scripts which will purge a lot of old data on... -
ASP.NET MSSQL usage question
The MSDN article about using MSSQL with ASP.NET located here: http://msdn.microsoft.com/library/default.asp? url=/library/en-... -
Index Usage Question
your range scan is forcing the full table scan. AND reportdatentime >= '25-Mar-2003' AND reportdatentime < '21-Jun-2003' Oracle can only... -
DJ Stunks #2
Re: Text::Diff usage question
Ronald Fischer wrote:
I don't know what docs you have, but mine say:> I would like to compare two arrays of lines. If the arrays
> are different, I want to output the differences in human-readable
> form, and also call a function f().
>
> I think that Text::Diff, found on CPAN, would useful. Indeed it
> works, but my code looks a bit cumbersome and I wonder whether
> one can make it easier:
>
> # Compare the arrays
> my @status_diff=Text::Diff::diff(\@after,\@before);
>
> unless(@status_diff eq 0
> || (@status_diff eq 1 and length($status_diff[0]) eq 0))
> {
> # Lines differ
> print(@status_diff); # print differences
> f() # call f
> }
>
> What looks a bit complicated is the condition inside the "unless".
> Even on identical arrays, diff returns an array of 1 string of
> zero length. But I can't simplify it to, say
>
> if(length($status_diff[0])) { print(...); f() }
>
> because I could imagine that there are cases where diff
> returns an empty list or even undef (I didn't find anything
> in the diff documentation which guarantees that the output
> is always an array of at least one string, when the default
> formatter is used - or did I overlook something here in the
> docs?).
[Synopsis] my $diff = diff \@records1, \@records2;
and
[Output] If no OUTPUT is supplied, returns the diffs in a string
which leads me to believe your array will only ever have one element -
it just may or may not be defined.
-jp
DJ Stunks Guest
-
ro.naldfi.scher@gmail.com #3
Re: Text::Diff usage question
DJ Stunks schrieb:
I overlooked this. Thank you for pointing it out.>> > # Compare the arrays
> > my @status_diff=Text::Diff::diff(\@after,\@before);
> >
> > unless(@status_diff eq 0
> > || (@status_diff eq 1 and length($status_diff[0]) eq 0))
> > {
> > # Lines differ
> > print(@status_diff); # print differences
> > f() # call f
> > }
> >
> > What looks a bit complicated is the condition inside the "unless".
> > Even on identical arrays, diff returns an array of 1 string of
> > zero length. But I can't simplify it to, say
> >
> > if(length($status_diff[0])) { print(...); f() }
> >
> > because I could imagine that there are cases where diff
> > returns an empty list or even undef (I didn't find anything
> > in the diff documentation which guarantees that the output
> > is always an array of at least one string, when the default
> > formatter is used - or did I overlook something here in the
> > docs?).
> I don't know what docs you have, but mine say:
>
> [Synopsis] my $diff = diff \@records1, \@records2;
> and
> [Output] If no OUTPUT is supplied, returns the diffs in a string
>
> which leads me to believe your array will only ever have one element -
> it just may or may not be defined.
This makes the comparision a little bit simpler,
although it would be better IMO if the docs ensure exactly how
the result will look like when the arrays are equal (from the code
you can see that the output will be the string "" in such a case,
but this is not the same as documenting this fact - because if
it is documented, one can expect it to be part of the interface
and that it will stay the same in future versions of this module).
Ronald
ro.naldfi.scher@gmail.com Guest
-
DJ Stunks #4
Re: Text::Diff usage question
[email]ro.naldfi.scher@gmail.com[/email] wrote:the comparison is much simpler: if ( $diff ne q{} ) { #different...> DJ Stunks schrieb:>> >> > > # Compare the arrays
> > > my @status_diff=Text::Diff::diff(\@after,\@before);
> > >
> > > unless(@status_diff eq 0
> > > || (@status_diff eq 1 and length($status_diff[0]) eq 0))
> > > {
> > > # Lines differ
> > > print(@status_diff); # print differences
> > > f() # call f
> > > }
> > >
> > > What looks a bit complicated is the condition inside the "unless".
> > > Even on identical arrays, diff returns an array of 1 string of
> > > zero length. But I can't simplify it to, say
> > >
> > > if(length($status_diff[0])) { print(...); f() }
> > >
> > > because I could imagine that there are cases where diff
> > > returns an empty list or even undef (I didn't find anything
> > > in the diff documentation which guarantees that the output
> > > is always an array of at least one string, when the default
> > > formatter is used - or did I overlook something here in the
> > > docs?).
> > I don't know what docs you have, but mine say:
> >
> > [Synopsis] my $diff = diff \@records1, \@records2;
> > and
> > [Output] If no OUTPUT is supplied, returns the diffs in a string
> >
> > which leads me to believe your array will only ever have one element -
> > it just may or may not be defined.
> I overlooked this. Thank you for pointing it out.
>
> This makes the comparision a little bit simpler,
> although it would be better IMO if the docs ensure exactly how
> the result will look like when the arrays are equal (from the code
> you can see that the output will be the string "" in such a case,
> but this is not the same as documenting this fact - because if
> it is documented, one can expect it to be part of the interface
> and that it will stay the same in future versions of this module).
I agree the module documentation should be updated to include the
return value of diff(). You should contact Barry and let him know.
-jp
>
> RonaldDJ Stunks Guest



Reply With Quote

