.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "String::Diff 3pm" .TH String::Diff 3pm "2022-10-13" "perl v5.34.0" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" String::Diff \- Simple diff to String .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 2 \& use String::Diff; \& use String::Diff qw( diff_fully diff diff_merge diff_regexp );# export functions \& \& # simple diff \& my($old, $new) = String::Diff::diff(\*(Aqthis is Perl\*(Aq, \*(Aqthis is Ruby\*(Aq); \& print "$old\en";# this is [Perl] \& print "$new\en";# this is {Ruby} \& \& my $diff = String::Diff::diff(\*(Aqthis is Perl\*(Aq, \*(Aqthis is Ruby\*(Aq); \& print "$diff\->[0]\en";# this is [Perl] \& print "$diff\->[1]\en";# this is {Ruby} \& \& my $diff = String::Diff::diff(\*(Aqthis is Perl\*(Aq, \*(Aqthis is Ruby\*(Aq, \& remove_open => \*(Aq\*(Aq, \& remove_close => \*(Aq\*(Aq, \& append_open => \*(Aq\*(Aq, \& append_close => \*(Aq\*(Aq, \& ); \& print "$diff\->[0]\en";# this is Perl \& print "$diff\->[1]\en";# this is Ruby \& \& # merged \& my $diff = String::Diff::diff_merge(\*(Aqthis is Perl\*(Aq, \*(Aqthis is Ruby\*(Aq); \& print "$diff\en";# this is [Perl]{Ruby} \& \& my $diff = String::Diff::diff_merge(\*(Aqthis is Perl\*(Aq, \*(Aqthis is Ruby\*(Aq, \& remove_open => \*(Aq\*(Aq, \& remove_close => \*(Aq\*(Aq, \& append_open => \*(Aq\*(Aq, \& append_close => \*(Aq\*(Aq, \& ); \& print "$diff\en";# this is PerlRuby \& \& # change to default marks \& %String::Diff::DEFAULT_MARKS = ( \& remove_open => \*(Aq\*(Aq, \& remove_close => \*(Aq\*(Aq, \& append_open => \*(Aq\*(Aq, \& append_close => \*(Aq\*(Aq, \& separator => \*(Aq<\-OLD|NEW\->\*(Aq, # for diff_merge \& ); \& \& # generated for regexp \& my $diff = String::Diff::diff_regexp(\*(Aqthis is Perl\*(Aq, \*(Aqthis is Ruby\*(Aq); \& print "$diff\en";# this\e is\e (?:Perl|Ruby) \& \& # detailed list \& my $diff = String::Diff::diff_fully(\*(Aqthis is Perl\*(Aq, \*(Aqthis is Ruby\*(Aq); \& for my $line (@{ $diff\->[0] }) { \& print "$line\->[0]: \*(Aq$line\->[1]\*(Aq\en"; \& } \& # u: \*(Aqthis is \*(Aq \& # \-: \*(AqPerl\*(Aq \& \& for my $line (@{ $diff\->[1] }) { \& print "$line\->[0]: \*(Aq$line\->[1]\*(Aq\en"; \& } \& # u: \*(Aqthis is \*(Aq \& # +: \*(AqRuby\*(Aq .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" String::Diff is the difference of a consecutive string is made. after general diff is done, the difference in the line is searchable. .PP the mark of the addition and the deletion can be freely changed. the color is colored to the terminal with \s-1ANSI,\s0 using the \s-1HTML\s0 display it. .PP after the line is divided, diff is taken when 'linebreak' option is specified. .PP .Vb 4 \& my($old_string, $new_string) = String::Diff::diff_fully(\*(Aqthis is Perl\*(Aq, \*(Aqthis is Ruby\*(Aq, linebreak => 1); \& my($old_string, $new_string) = String::Diff::diff(\*(Aqthis is Perl\*(Aq, \*(Aqthis is Ruby\*(Aq, linebreak => 1); \& my $string = String::Diff::diff_merge(\*(Aqthis is Perl\*(Aq, \*(Aqthis is Ruby\*(Aq, linebreak => 1); \& my $string = String::Diff::diff_regexp(\*(Aqthis is Perl\*(Aq, \*(Aqthis is Ruby\*(Aq, linebreak => 1); .Ve .PP In diff and diff_merge methods the mark of the difference can be changed. .PP .Vb 6 \& my $diff = String::Diff::diff(\*(Aqthis is Perl\*(Aq, \*(Aqthis is Ruby\*(Aq, \& remove_open => \*(Aq\*(Aq, \& remove_close => \*(Aq\*(Aq, \& append_open => \*(Aq\*(Aq, \& append_close => \*(Aq\*(Aq, \& ); .Ve .PP You can escape callback set to diff function and diff_merge function. .PP .Vb 12 \& use HTML::Entities \& my($diff_old, $diff_new) = String::Diff::diff( \& \*(Aqthis is Perl\*(Aq, \& \*(Aqthis is Ruby\*(Aq, \& remove_open => \*(Aq\*(Aq, \& remove_close => \*(Aq\*(Aq, \& append_open => \*(Aq\*(Aq, \& append_close => \*(Aq\*(Aq, \& escape => sub { encode_entities($_[0]) }, \& }); \& is($diff_old, \*(Aqthis is <b>Perl</b>\*(Aq); \& is($diff_new, \*(Aqthis is <b><BIG>R</BIG>uby</b>\*(Aq); .Ve .SH "METHODS" .IX Header "METHODS" .IP "diff_fully" 4 .IX Item "diff_fully" .Vb 1 \& the list that divides diff according to the mark is returnd. \& \& my($old_string, $new_string) = String::Diff::diff_fully(\*(Aqthis is Perl\*(Aq, \*(Aqthis is Ruby\*(Aq); .Ve .IP "diff" 4 .IX Item "diff" .Vb 1 \& abd the mark of the deletion and the addition is given to the string. .Ve .IP "diff_merge" 4 .IX Item "diff_merge" .Vb 1 \& old and new string is merged with diff. .Ve .IP "diff_regexp" 4 .IX Item "diff_regexp" .Vb 1 \& the regular expression to which old string and new string are matched with regexp is returned. .Ve .SH "AUTHOR" .IX Header "AUTHOR" Kazuhiro Osawa .SH "SEE ALSO" .IX Header "SEE ALSO" Algorithm::Diff .SH "LICENSE" .IX Header "LICENSE" Copyright 2008 (C) Kazuhiro Osawa .PP This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.