CINXE.COM
String::Approx - Perl extension for approximate matching (fuzzy matching) - metacpan.org
<!DOCTYPE html> <html lang="en-US"> <head> <title>String::Approx - Perl extension for approximate matching (fuzzy matching) - metacpan.org</title> <link rel="preload" as="fetch" href="/account/login_status" crossorigin="anonymous" /> <link href="/assets/style-XFEQ536G.css" rel="stylesheet" type="text/css"> <script src="/assets/main-WXBSEDQJ.js" type="module"></script> <link rel="alternate" type="application/rss+xml" title="Recent CPAN Uploads of String-Approx - MetaCPAN" href="/dist/String-Approx/releases.rss" /> <link rel="canonical" href="https://metacpan.org/pod/String::Approx" /> <meta name="description" content="Perl extension for approximate matching (fuzzy matching)" /> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5"> <link rel="shortcut icon" href="/static/icons/favicon.ico"> <link rel="apple-touch-icon" sizes="152x152" href="/static/icons/apple-touch-icon.png"> <link rel="search" href="/static/opensearch.xml" type="application/opensearchdescription+xml" title="MetaCPAN"> <script async src="https://perl-ads.perlhacks.com/perl-ads.js"></script> <script async src="https://www.googletagmanager.com/gtag/js?id=G-E82Q2V8LVD"></script> <meta property="og:site_name" content="MetaCPAN" /> <meta name="twitter:site" content="@metacpan" /> <meta property="og:type" content="article" /> <meta name="twitter:card" content="summary" /> <meta property="og:url" content="https://metacpan.org/pod/String::Approx" /> <meta property="og:title" content="String::Approx" /> <meta property="og:description" content="Perl extension for approximate matching (fuzzy matching)" /> <meta property="og:image" content="https://metacpan.org/static/images/dots.png" /> </head> <body> <nav class="navbar navbar-default" role="navigation"> <div class="header-logo-large hidden-xs"> <a href="/" tabindex="0"> <svg class="logo" aria-label="MetaCPAN"> <use class="logo" href="/static/images/metacpan-logo.svg#logo" /> </svg> </a> </div> <div class="header-logo-icon visible-xs"> <a href="/"> <svg class="logo" aria-label="MetaCPAN"> <use class="logo" href="/static/images/metacpan-logo.svg#dots" /> </svg> </a> </div> <ul class="nav navbar-nav menu-items hidden-xs hidden-sm"> <li><a href="/about">About</a></li> <li><a href="/about/sponsors">Sponsor</a></li> <li><a href="https://grep.metacpan.org/">grep::cpan</a></li> <li><a href="/recent">Recent</a></li> <li><a href="/about/faq">FAQ</a></li> <li><a href="/tools">Tools</a></li> <li><a href="https://fastapi.metacpan.org/">API</a></li> </ul> <ul class="nav navbar-nav navbar-right"> <button type="button" class="searchbar-btn visible-xs visible-sm"> <i class="fa fa-search button-fa-icon"></i> </button> <form action="/search" class="searchbar-form visible-md visible-lg search-form form-horizontal"> <input type="hidden" name="size" id="metacpan_search-size" value="20"> <div class="form-group"> <div class="search-group"> <i class="fa fa-search"></i> <input type="text" name="q" placeholder="Search the CPAN" size="41" autocorrect="off" autocapitalize="off" spellcheck="false" id="metacpan_search-input" class="form-control" value=""> </div> </div> </form> <li class="icon-slidepanel visible-xs visible-sm"> <button data-toggle="slidepanel" data-target=".slidepanel"> <span class="button-fa-icon"> <i class="fa fa-bars slidepanel-open"></i> <i class="fa fa-times slidepanel-close"></i> </span> </button> </li> <li class="dropdown login-dropdown show-logged-in"> <button type="button" class="dropdown-toggle" data-toggle="dropdown"> <i class="fa fa-user button-fa-icon logged-in-icon" aria-hidden="true"></i> <i class="fas fa-chevron-down"></i> </button> <ul class="dropdown-menu"> <li><a href="/account/identities">Identities</a></li> <li><a href="/account/profile">Profile</a></li> <li><a href="/account/favorite/list">Favorites</a></li> <li> <a href="#" type="button" class="logout-button"> Logout </a> </li> </ul> </li> <li class="dropdown login-dropdown show-logged-out"> <button type="button" class="dropdown-toggle" data-toggle="dropdown"> <i class="fa fa-user button-fa-icon avatar-placeholder" aria-hidden="true"></i> <i class="fas fa-chevron-down"></i> </button> <ul class="dropdown-menu"> <li> <a href="/login/github"> <i class="fab fa-github fa-fw"></i> GitHub </a> </li> <li> <a href="/login/twitter"> <i class="fab fa-twitter fa-fw"></i> Twitter </a> </li> <li> <a href="/login/google"> <i class="fab fa-google fa-fw"></i> Google </a> </li> </ul> </li> <li class="dropdown login-dropdown hide-logged-in hide-logged-out"> <button> <i class="fa fa-user button-fa-icon" aria-hidden="true"></i> </button> </li> </ul> </nav> <div class="page-content "> <div id="perl-ad-target" class="top-notify-banner perl-ad-target"> </div> <nav class="sidebar"> <div class="slidepanel"> <ul class="nav-list "> <li class="nav-header no-margin-top"> <div class="ttip" data-toggle="tooltip" data-placement="bottom" title="The date that this version of String-Approx was released."> <span class="relatize">16 Apr 2017 08:52:13 UTC</span> </div> </li> <li> Distribution: <a href="/dist/String-Approx">String-Approx</a> </li> <li> Module version: 3.28 </li> <li> <a data-keyboard-shortcut="g s" href="/dist/String-Approx/source/Approx.pm">Source</a> (<a href="/dist/String-Approx/source/Approx.pm?raw=1">raw</a>) </li> <li> <a data-keyboard-shortcut="g b" href="/dist/String-Approx/source">Browse</a> (<a href="/dist/String-Approx/source?raw=1">raw</a>) </li> <li> <a data-keyboard-shortcut="g c" href="/dist/String-Approx/changes">Changes</a> </li> <li> <a class="nopopup" href="/dist/String-Approx/contribute">How to Contribute</a> </li> <li> <a rel="noopener nofollow" data-keyboard-shortcut="g i" href="https://rt.cpan.org/Public/Dist/Display.html?Name=String-Approx">Issues</a> (6) </li> <li> <a rel="noopener nofollow" href="http://matrix.cpantesters.org/?dist=String-Approx+3.28" title="Matrix">Testers</a> <span title="(pass / fail / na)">(<a rel="noopener nofollow" href="https://www.cpantesters.org/distro/S/String-Approx.html?oncpan=1&distmat=1&version=3.28&grade=2" style="color: #090">263</a> / <a rel="noopener nofollow" href="https://www.cpantesters.org/distro/S/String-Approx.html?oncpan=1&distmat=1&version=3.28&grade=3" style="color: #900">0</a> / <a rel="noopener nofollow" href="https://www.cpantesters.org/distro/S/String-Approx.html?oncpan=1&distmat=1&version=3.28&grade=4">0</a>)</span> </li> <li> <a rel="noopener nofollow" href="http://cpants.cpanauthors.org/release/JHI/String-Approx-3.28">Kwalitee</a> </li> <li> <div class="ttip" data-toggle="tooltip" data-placement="bottom" title="The # people with an indexing permission on String-Approx who have released something to CPAN in the last 2 years (i.e. the # people likely able to release critical fixes in a timely manner)"> Bus factor: 0 </div> </li> <li> <a rel="noopener nofollow" href="http://cpancover.com/latest/String-Approx-3.28/index.html">68.44% Coverage </a> </li> <li> License: unknown </li> <li class="nav-header">Activity</li> <li> <div class="activity-graph"> <img src="/dist/String-Approx/activity.svg?res=month" /> <div class="comment">24 month</div> </div> </li> <li class="nav-header">Tools</li> <li> <a itemprop="downloadUrl" href="https://cpan.metacpan.org/authors/id/J/JH/JHI/String-Approx-3.28.tar.gz"> Download (<span itemprop="fileSize">44.04KB</span>)</a> </li> <li> <a href="https://explorer.metacpan.org/?url=%2Fmodule%2FJHI%2FString-Approx-3.28%2FApprox.pm"> MetaCPAN Explorer </a> </li> <li> <a href="/dist/String-Approx/permissions"> Permissions </a> </li> <li> <a href="/dist/String-Approx/releases.rss"> Subscribe to distribution </a> </li> <li> <button class="btn btn-link" data-toggle="modal" data-target="#metacpan_install-instructions-dialog"> Install Instructions </button> </li> <li> <form action="/search"> <input type="hidden" name="q" value="dist:String-Approx"> <input type="search" name="q" placeholder="Search distribution" class="form-control tool-bar-form"> <input type="submit" style="display: none"> </form> </li> <li> <form action="https://grep.metacpan.org/search"> <input type="hidden" name="qd" value="String-Approx"> <input type="hidden" name="source" value="metacpan"> <input type="search" name="q" placeholder="grep distribution" class="form-control tool-bar-form"> <input type="submit" style="display: none"> </form> </li> <li class="version-jump"> <select class="select-navigator form-control tool-bar-form"> <option disabled selected>Jump to version</option> <option disabled value="/release/JHI/String-Approx-3.28/view/Approx.pm" >3.28 (JHI on 2017-04-16)</option> <option value="/release/JHI/String-Approx-3.27/view/Approx.pm" >3.27 (JHI on 2013-01-22)</option> <option value="/release/JHI/String-Approx-2.7/view/Approx.pm" >2.7 (JHI on 1998-03-23)</option> <option value="/release/JHI/String-Approx-1.6/view/Approx.pm" >1.6 (JHI on 1997-04-13)</option> <optgroup label="BackPAN">' <option value="/release/JHI/String-Approx-3.26/view/Approx.pm" >3.26 (JHI on 2006-04-09)</option> <option value="/release/JHI/String-Approx-3.25/view/Approx.pm" >3.25 (JHI on 2005-05-24)</option> <option value="/release/JHI/String-Approx-3.24/view/Approx.pm" >3.24 (JHI on 2005-01-02)</option> <option value="/release/JHI/String-Approx-3.23/view/Approx.pm" >3.23 (JHI on 2003-12-01)</option> <option value="/release/JHI/String-Approx-3.22/view/Approx.pm" >3.22 (JHI on 2003-10-19)</option> <option value="/release/JHI/String-Approx-3.20/view/Approx.pm" >3.20 (JHI on 2003-05-12)</option> <option value="/release/JHI/String-Approx-3.19/view/Approx.pm" >3.19 (JHI on 2002-08-18)</option> <option value="/release/JHI/String-Approx-3.18/view/Approx.pm" >3.18 (JHI on 2001-10-16)</option> <option value="/release/JHI/String-Approx-3.17/view/Approx.pm" >3.17 (JHI on 2001-08-03)</option> <option value="/release/JHI/String-Approx-3.16/view/Approx.pm" >3.16 (JHI on 2001-06-28)</option> <option value="/release/JHI/String-Approx-3.15/view/Approx.pm" >3.15 (JHI on 2001-02-10)</option> <option value="/release/JHI/String-Approx-3.14/view/Approx.pm" >3.14 (JHI on 2000-11-16)</option> <option value="/release/JHI/String-Approx-3.13/view/Approx.pm" >3.13 (JHI on 2000-09-06)</option> <option value="/release/JHI/String-Approx-3.12/view/Approx.pm" >3.12 (JHI on 2000-04-30)</option> <option value="/release/JHI/String-Approx-3.11/view/Approx.pm" >3.11 (JHI on 2000-04-24)</option> <option value="/release/JHI/String-Approx-3.10/view/Approx.pm" >3.10 (JHI on 2000-04-18)</option> <option value="/release/JHI/String-Approx-3.09/view/Approx.pm" >3.09 (JHI on 1999-07-19)</option> <option value="/release/JHI/String-Approx-3.08/view/Approx.pm" >3.08 (JHI on 1999-06-23)</option> <option value="/release/JHI/String-Approx-3.06/view/Approx.pm" >3.06 (JHI on 1999-06-16)</option> <option value="/release/JHI/String-Approx-3.04/view/Approx.pm" >3.04 (JHI on 1998-12-17)</option> <option value="/release/JHI/String-Approx-3.03/view/Approx.pm" >3.03 (JHI on 1998-12-16)</option> <option value="/release/JHI/String-Approx-3.02/view/Approx.pm" >3.02 (JHI on 1998-12-15)</option> <option value="/release/JHI/String-Approx-3.01/view/Approx.pm" >3.01 (JHI on 1998-12-15)</option> <option value="/release/JHI/String-Approx-2.6/view/Approx.pm" >2.6 (JHI on 1998-03-22)</option> <option value="/release/JHI/String-Approx-2.5/view/Approx.pm" >2.5 (JHI on 1998-03-15)</option> <option value="/release/JHI/String-Approx-2.4/view/Approx.pm" >2.4 (JHI on 1998-03-09)</option> <option value="/release/JHI/String-Approx-2.3/view/Approx.pm" >2.3 (JHI on 1998-02-25)</option> <option value="/release/JHI/String-Approx-2.2/view/Approx.pm" >2.2 (JHI on 1997-09-17)</option> <option value="/release/JHI/String-Approx-2.1/view/Approx.pm" >2.1 (JHI on 1997-05-28)</option> <option value="/release/JHI/String-Approx-2.0_01/view/Approx.pm" >2.0_01 DEV (JHI on 1997-05-04)</option> <option value="/release/JHI/String-Approx-2.0/view/Approx.pm" >2.0 (JHI on 1997-05-02)</option> <option value="/release/JHI/String-Approx-1.5/view/Approx.pm" >1.5 (JHI on 1995-11-02)</option> </optgroup> </select> </li> <li class="version-diff"> <select class="select-navigator form-control tool-bar-form"> <option disabled selected>Diff with version</option> <option disabled value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.28/Approx.pm" >3.28 (JHI on 2017-04-16)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.27/Approx.pm" >3.27 (JHI on 2013-01-22)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-2.7/Approx.pm" >2.7 (JHI on 1998-03-23)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-1.6/Approx.pm" >1.6 (JHI on 1997-04-13)</option> <optgroup label="BackPAN">' <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.26/Approx.pm" >3.26 (JHI on 2006-04-09)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.25/Approx.pm" >3.25 (JHI on 2005-05-24)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.24/Approx.pm" >3.24 (JHI on 2005-01-02)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.23/Approx.pm" >3.23 (JHI on 2003-12-01)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.22/Approx.pm" >3.22 (JHI on 2003-10-19)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.20/Approx.pm" >3.20 (JHI on 2003-05-12)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.19/Approx.pm" >3.19 (JHI on 2002-08-18)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.18/Approx.pm" >3.18 (JHI on 2001-10-16)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.17/Approx.pm" >3.17 (JHI on 2001-08-03)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.16/Approx.pm" >3.16 (JHI on 2001-06-28)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.15/Approx.pm" >3.15 (JHI on 2001-02-10)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.14/Approx.pm" >3.14 (JHI on 2000-11-16)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.13/Approx.pm" >3.13 (JHI on 2000-09-06)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.12/Approx.pm" >3.12 (JHI on 2000-04-30)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.11/Approx.pm" >3.11 (JHI on 2000-04-24)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.10/Approx.pm" >3.10 (JHI on 2000-04-18)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.09/Approx.pm" >3.09 (JHI on 1999-07-19)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.08/Approx.pm" >3.08 (JHI on 1999-06-23)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.06/Approx.pm" >3.06 (JHI on 1999-06-16)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.04/Approx.pm" >3.04 (JHI on 1998-12-17)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.03/Approx.pm" >3.03 (JHI on 1998-12-16)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.02/Approx.pm" >3.02 (JHI on 1998-12-15)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-3.01/Approx.pm" >3.01 (JHI on 1998-12-15)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-2.6/Approx.pm" >2.6 (JHI on 1998-03-22)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-2.5/Approx.pm" >2.5 (JHI on 1998-03-15)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-2.4/Approx.pm" >2.4 (JHI on 1998-03-09)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-2.3/Approx.pm" >2.3 (JHI on 1998-02-25)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-2.2/Approx.pm" >2.2 (JHI on 1997-09-17)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-2.1/Approx.pm" >2.1 (JHI on 1997-05-28)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-2.0_01/Approx.pm" >2.0_01 DEV (JHI on 1997-05-04)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-2.0/Approx.pm" >2.0 (JHI on 1997-05-02)</option> <option value="/release/JHI/String-Approx-3.28/diff/JHI/String-Approx-1.5/Approx.pm" >1.5 (JHI on 1995-11-02)</option> </optgroup> </select> </li> <li> <ul class="dependencies"> <li class="nav-header">Dependencies</li> <li><a href="/pod/Test::More" title="Test::More" class="ellipsis">Test::More</a></li> <li><i class="ttip" title="dynamic_config enabled">and possibly others</i></li> <li> <hr> </li> <li> <a href="/module/String::Approx/requires">Reverse dependencies</a> </li> <li> <a href="http://deps.cpantesters.org/?module=String%3A%3AApprox">CPAN Testers List</a> </li> <li> <a href="https://cpandeps.grinnz.com/?dist=String-Approx">Dependency graph</a> </li> </ul> </li> <li class="nav-header">Permalinks</li> <li> <a href="/release/JHI/String-Approx-3.28/view/Approx.pm">This version</a> </li> <li> <a href="/pod/String::Approx">Latest version</a> </li> <li> <div class="plussers"> <div class="nav-header">++ed by:</div> <div> <a class="display-all" href="/author/SREZIC"><img src="https://www.gravatar.com/avatar/5fa5a4e5ffdf883a1fcb1840c915d485?d=identicon&s=20" title="SREZIC" alt="SREZIC"></a> </div> <!-- Display counts of plussers--> <div> <a href="/dist/String-Approx/plussers">1 PAUSE user</a> </div> <div> 3 non-PAUSE users </div> </div> </li> <li> </li> </ul> </div> </nav> <div class="content-navigation"> <div class="breadcrumbs"> <span> <a data-keyboard-shortcut="g a" rel="author" href="/author/JHI" class="author-name">Jarkko Hietaniemi</a> </span> <span> / </span> <div class="release dist-release status-latest maturity-released"> <span class="dropdown"><b class="caret"></b></span> <select class="select-navigator "> <option selected value="/release/JHI/String-Approx-3.28/view/Approx.pm" >3.28 (JHI on 2017-04-16)</option> <option value="/release/JHI/String-Approx-3.27/view/Approx.pm" >3.27 (JHI on 2013-01-22)</option> <option value="/release/JHI/String-Approx-2.7/view/Approx.pm" >2.7 (JHI on 1998-03-23)</option> <option value="/release/JHI/String-Approx-1.6/view/Approx.pm" >1.6 (JHI on 1997-04-13)</option> <optgroup label="BackPAN">' <option value="/release/JHI/String-Approx-3.26/view/Approx.pm" >3.26 (JHI on 2006-04-09)</option> <option value="/release/JHI/String-Approx-3.25/view/Approx.pm" >3.25 (JHI on 2005-05-24)</option> <option value="/release/JHI/String-Approx-3.24/view/Approx.pm" >3.24 (JHI on 2005-01-02)</option> <option value="/release/JHI/String-Approx-3.23/view/Approx.pm" >3.23 (JHI on 2003-12-01)</option> <option value="/release/JHI/String-Approx-3.22/view/Approx.pm" >3.22 (JHI on 2003-10-19)</option> <option value="/release/JHI/String-Approx-3.20/view/Approx.pm" >3.20 (JHI on 2003-05-12)</option> <option value="/release/JHI/String-Approx-3.19/view/Approx.pm" >3.19 (JHI on 2002-08-18)</option> <option value="/release/JHI/String-Approx-3.18/view/Approx.pm" >3.18 (JHI on 2001-10-16)</option> <option value="/release/JHI/String-Approx-3.17/view/Approx.pm" >3.17 (JHI on 2001-08-03)</option> <option value="/release/JHI/String-Approx-3.16/view/Approx.pm" >3.16 (JHI on 2001-06-28)</option> <option value="/release/JHI/String-Approx-3.15/view/Approx.pm" >3.15 (JHI on 2001-02-10)</option> <option value="/release/JHI/String-Approx-3.14/view/Approx.pm" >3.14 (JHI on 2000-11-16)</option> <option value="/release/JHI/String-Approx-3.13/view/Approx.pm" >3.13 (JHI on 2000-09-06)</option> <option value="/release/JHI/String-Approx-3.12/view/Approx.pm" >3.12 (JHI on 2000-04-30)</option> <option value="/release/JHI/String-Approx-3.11/view/Approx.pm" >3.11 (JHI on 2000-04-24)</option> <option value="/release/JHI/String-Approx-3.10/view/Approx.pm" >3.10 (JHI on 2000-04-18)</option> <option value="/release/JHI/String-Approx-3.09/view/Approx.pm" >3.09 (JHI on 1999-07-19)</option> <option value="/release/JHI/String-Approx-3.08/view/Approx.pm" >3.08 (JHI on 1999-06-23)</option> <option value="/release/JHI/String-Approx-3.06/view/Approx.pm" >3.06 (JHI on 1999-06-16)</option> <option value="/release/JHI/String-Approx-3.04/view/Approx.pm" >3.04 (JHI on 1998-12-17)</option> <option value="/release/JHI/String-Approx-3.03/view/Approx.pm" >3.03 (JHI on 1998-12-16)</option> <option value="/release/JHI/String-Approx-3.02/view/Approx.pm" >3.02 (JHI on 1998-12-15)</option> <option value="/release/JHI/String-Approx-3.01/view/Approx.pm" >3.01 (JHI on 1998-12-15)</option> <option value="/release/JHI/String-Approx-2.6/view/Approx.pm" >2.6 (JHI on 1998-03-22)</option> <option value="/release/JHI/String-Approx-2.5/view/Approx.pm" >2.5 (JHI on 1998-03-15)</option> <option value="/release/JHI/String-Approx-2.4/view/Approx.pm" >2.4 (JHI on 1998-03-09)</option> <option value="/release/JHI/String-Approx-2.3/view/Approx.pm" >2.3 (JHI on 1998-02-25)</option> <option value="/release/JHI/String-Approx-2.2/view/Approx.pm" >2.2 (JHI on 1997-09-17)</option> <option value="/release/JHI/String-Approx-2.1/view/Approx.pm" >2.1 (JHI on 1997-05-28)</option> <option value="/release/JHI/String-Approx-2.0_01/view/Approx.pm" >2.0_01 DEV (JHI on 1997-05-04)</option> <option value="/release/JHI/String-Approx-2.0/view/Approx.pm" >2.0 (JHI on 1997-05-02)</option> <option value="/release/JHI/String-Approx-1.5/view/Approx.pm" >1.5 (JHI on 1995-11-02)</option> </optgroup> </select> <a data-keyboard-shortcut="g d" class="release-name" href="/dist/String-Approx">String-Approx-3.28</a> </div> <span class="river-gauge-gauge"> <svg width="24px" height="15px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g> <title> River stage one • 6 direct dependents • 7 total dependents </title> <rect x="0" y="0" width="4" height="15" fill="#7ea3f2" /> <rect x="5" y="0" width="4" height="15" fill="#e4e2e2" /> <rect x="10" y="0" width="4" height="15" fill="#e4e2e2" /> <rect x="15" y="0" width="4" height="15" fill="#e4e2e2" /> <rect x="20" y="0" width="4" height="15" fill="#e4e2e2" /> </g> </svg> </span> <div id="String-Approx-fav" class="show-logged-in"> <form action="/account/favorite/add" style="display: inline" method="POST"> <input type="hidden" name="remove" value="0"> <input type="hidden" name="release" value="String-Approx-3.28"> <input type="hidden" name="author" value="JHI"> <input type="hidden" name="distribution" value="String-Approx"> <button type="submit" class="favorite highlight"><span>4</span> ++</button> </form> </div> <div class="show-logged-out"> <button class="fav-not-logged-in favorite highlight"><span>4</span> ++</button> </div> / <span>String::Approx</span> </div> </div> <main class="content"> <nav class="toc"> <div class="toc-header"><strong>Contents</strong></div> <ul> <li><a href="#NAME">NAME</a></li> <li><a href="#SYNOPSIS">SYNOPSIS</a></li> <li><a href="#DESCRIPTION">DESCRIPTION</a></li> <li><a href="#MATCH">MATCH</a> <ul> <li><a href="#MODIFIERS">MODIFIERS</a></li> </ul> </li> <li><a href="#SUBSTITUTE">SUBSTITUTE</a></li> <li><a href="#INDEX">INDEX</a></li> <li><a href="#SLICE">SLICE</a></li> <li><a href="#DISTANCE">DISTANCE</a></li> <li><a href="#CONTROLLING-THE-CACHE">CONTROLLING THE CACHE</a></li> <li><a href="#NOTES">NOTES</a> <ul> <li><a href="#TEXT-POSITION">TEXT POSITION</a></li> </ul> </li> <li><a href="#VERSION">VERSION</a></li> <li><a href="#CHANGES-FROM-VERSION-2">CHANGES FROM VERSION 2</a> <ul> <li><a href="#GOOD-NEWS">GOOD NEWS</a></li> <li><a href="#BAD-NEWS">BAD NEWS</a></li> </ul> </li> <li><a href="#ACKNOWLEDGEMENTS">ACKNOWLEDGEMENTS</a></li> <li><a href="#AUTHOR">AUTHOR</a></li> <li><a href="#COPYRIGHT-AND-LICENSE">COPYRIGHT AND LICENSE</a></li> </ul></nav> <div class="pod anchors"> <h1 id="NAME">NAME</h1> <p>String::Approx - Perl extension for approximate matching (fuzzy matching)</p> <h1 id="SYNOPSIS">SYNOPSIS</h1> <pre><code>use String::Approx 'amatch'; print if amatch("foobar"); my @matches = amatch("xyzzy", @inputs); my @catches = amatch("plugh", ['2'], @inputs);</code></pre> <h1 id="DESCRIPTION">DESCRIPTION</h1> <p>String::Approx lets you match and substitute strings approximately. With this you can emulate errors: typing errorrs, speling errors, closely related vocabularies (colour color), genetic mutations (GAG ACT), abbreviations (McScot, MacScot).</p> <p>NOTE: String::Approx suits the task of <b>string matching</b>, not <b>string comparison</b>, and it works for <b>strings</b>, not for <b>text</b>.</p> <p>If you want to compare strings for similarity, you probably just want the Levenshtein edit distance (explained below), the Text::Levenshtein and Text::LevenshteinXS modules in CPAN. See also Text::WagnerFischer and Text::PhraseDistance. (There are functions for this in String::Approx, e.g. adist(), but their results sometimes differ from the bare Levenshtein et al.)</p> <p>If you want to compare things like text or source code, consisting of <b>words</b> or <b>tokens</b> and <b>phrases</b> and <b>sentences</b>, or <b>expressions</b> and <b>statements</b>, you should probably use some other tool than String::Approx, like for example the standard UNIX diff(1) tool, or the Algorithm::Diff module from CPAN.</p> <p>The measure of <b>approximateness</b> is the <i>Levenshtein edit distance</i>. It is the total number of "edits": insertions,</p> <pre><code>word world</code></pre> <p>deletions,</p> <pre><code>monkey money</code></pre> <p>and substitutions</p> <pre><code>sun fun</code></pre> <p>required to transform a string to another string. For example, to transform <i>"lead"</i> into <i>"gold"</i>, you need three edits:</p> <pre><code>lead gead goad gold</code></pre> <p>The edit distance of "lead" and "gold" is therefore three, or 75%.</p> <p><b>String::Approx</b> uses the Levenshtein edit distance as its measure, but String::Approx is not well-suited for comparing strings of different length, in other words, if you want a "fuzzy eq", see above. String::Approx is more like regular expressions or index(), it finds substrings that are close matches.></p> <h1 id="MATCH">MATCH</h1> <pre><code>use String::Approx 'amatch'; $matched = amatch("pattern") $matched = amatch("pattern", [ modifiers ]) $any_matched = amatch("pattern", @inputs) $any_matched = amatch("pattern", [ modifiers ], @inputs) @match = amatch("pattern") @match = amatch("pattern", [ modifiers ]) @matches = amatch("pattern", @inputs) @matches = amatch("pattern", [ modifiers ], @inputs)</code></pre> <p>Match <b>pattern</b> approximately. In list context return the matched <b>@inputs</b>. If no inputs are given, match against the <b>$_</b>. In scalar context return true if <i>any</i> of the inputs match, false if none match.</p> <p>Notice that the pattern is a string. Not a regular expression. None of the regular expression notations (^, ., *, and so on) work. They are characters just like the others. Note-on-note: some limited form of <i>"regular expressionism"</i> is planned in future: for example character classes ([abc]) and <i>any-chars</i> (.). But that feature will be turned on by a special <i>modifier</i> (just a guess: "r"), so there should be no backward compatibility problem.</p> <p>Notice also that matching is not symmetric. The inputs are matched against the pattern, not the other way round. In other words: the pattern can be a substring, a submatch, of an input element. An input element is always a superstring of the pattern.</p> <h2 id="MODIFIERS">MODIFIERS</h2> <p>With the modifiers you can control the amount of approximateness and certain other control variables. The modifiers are one or more strings, for example <b>"i"</b>, within a string optionally separated by whitespace. The modifiers are inside an anonymous array: the <b>[ ]</b> in the syntax are not notational, they really do mean <b>[ ]</b>, for example <b>[ "i", "2" ]</b>. <b>["2 i"]</b> would be identical.</p> <p>The implicit default approximateness is 10%, rounded up. In other words: every tenth character in the pattern may be an error, an edit. You can explicitly set the maximum approximateness by supplying a modifier like</p> <pre><code>number number%</code></pre> <p>Examples: <b>"3"</b>, <b>"15%"</b>.</p> <p>Note that <code>0%</code> is not rounded up, it is equal to <code>0</code>.</p> <p>Using a similar syntax you can separately control the maximum number of insertions, deletions, and substitutions by prefixing the numbers with I, D, or S, like this:</p> <pre><code>Inumber Inumber% Dnumber Dnumber% Snumber Snumber%</code></pre> <p>Examples: <b>"I2"</b>, <b>"D20%"</b>, <b>"S0"</b>.</p> <p>You can ignore case (<b>"A"</b> becames equal to <b>"a"</b> and vice versa) by adding the <b>"i"</b> modifier.</p> <p>For example</p> <pre><code>[ "i 25%", "S0" ]</code></pre> <p>means <i>ignore case</i>, <i>allow every fourth character to be "an edit"</i>, but allow <i>no substitutions</i>. (See <a href="/pod/NOTES">NOTES</a> about disallowing substitutions or insertions.)</p> <p>NOTE: setting <code>I0 D0 S0</code> is not equivalent to using index(). If you want to use index(), use index().</p> <h1 id="SUBSTITUTE">SUBSTITUTE</h1> <pre><code>use String::Approx 'asubstitute'; @substituted = asubstitute("pattern", "replacement") @substituted = asubstitute("pattern", "replacement", @inputs) @substituted = asubstitute("pattern", "replacement", [ modifiers ]) @substituted = asubstitute("pattern", "replacement", [ modifiers ], @inputs)</code></pre> <p>Substitute approximate <b>pattern</b> with <b>replacement</b> and return as a list <copies> of <b>@inputs</b>, the substitutions having been made on the elements that did match the pattern. If no inputs are given, substitute in the <b>$_</b>. The replacement can contain magic strings <b>$&</b>, <b>$`</b>, <b>$'</b> that stand for the matched string, the string before it, and the string after it, respectively. All the other arguments are as in <code>amatch()</code>, plus one additional modifier, <b>"g"</b> which means substitute globally (all the matches in an element and not just the first one, as is the default).</p> <p>See <a href="#BAD-NEWS">"BAD NEWS"</a> about the unfortunate stinginess of <code>asubstitute()</code>.</p> <h1 id="INDEX">INDEX</h1> <pre><code>use String::Approx 'aindex'; $index = aindex("pattern") @indices = aindex("pattern", @inputs) $index = aindex("pattern", [ modifiers ]) @indices = aindex("pattern", [ modifiers ], @inputs)</code></pre> <p>Like <code>amatch()</code> but returns the index/indices at which the pattern matches approximately. In list context and if <code>@inputs</code> are used, returns a list of indices, one index for each input element. If there's no approximate match, <code>-1</code> is returned as the index.</p> <p>NOTE: if there is character repetition (e.g. "aa") either in the pattern or in the text, the returned index might start "too early". This is consistent with the goal of the module of matching "as early as possible", just like regular expressions (that there might be a "less approximate" match starting later is of somewhat irrelevant).</p> <p>There's also backwards-scanning <code>arindex()</code>.</p> <h1 id="SLICE">SLICE</h1> <pre><code>use String::Approx 'aslice'; ($index, $size) = aslice("pattern") ([$i0, $s0], ...) = aslice("pattern", @inputs) ($index, $size) = aslice("pattern", [ modifiers ]) ([$i0, $s0], ...) = aslice("pattern", [ modifiers ], @inputs)</code></pre> <p>Like <code>aindex()</code> but returns also the size (length) of the match. If the match fails, returns an empty list (when matching against <code>$_</code>) or an empty anonymous list corresponding to the particular input.</p> <p>NOTE: size of the match will very probably be something you did not expect (such as longer than the pattern, or a negative number). This may or may not be fixed in future releases. Also the beginning of the match may vary from the expected as with aindex(), see above.</p> <p>If the modifier</p> <pre><code>"minimal_distance"</code></pre> <p>is used, the minimal possible edit distance is returned as the third element:</p> <pre><code>($index, $size, $distance) = aslice("pattern", [ modifiers ]) ([$i0, $s0, $d0], ...) = aslice("pattern", [ modifiers ], @inputs)</code></pre> <h1 id="DISTANCE">DISTANCE</h1> <pre><code>use String::Approx 'adist'; $dist = adist("pattern", $input); @dist = adist("pattern", @input);</code></pre> <p>Return the <i>edit distance</i> or distances between the pattern and the input or inputs. Zero edit distance means exact match. (Remember that the match can 'float' in the inputs, the match is a substring match.) If the pattern is longer than the input or inputs, the returned distance or distances is or are negative.</p> <pre><code>use String::Approx 'adistr'; $dist = adistr("pattern", $input); @dist = adistr("pattern", @inputs);</code></pre> <p>Return the <b>relative</b> <i>edit distance</i> or distances between the pattern and the input or inputs. Zero relative edit distance means exact match, one means completely different. (Remember that the match can 'float' in the inputs, the match is a substring match.) If the pattern is longer than the input or inputs, the returned distance or distances is or are negative.</p> <p>You can use adist() or adistr() to sort the inputs according to their approximateness:</p> <pre><code>my %d; @d{@inputs} = map { abs } adistr("pattern", @inputs); my @d = sort { $d{$a} <=> $d{$b} } @inputs;</code></pre> <p>Now <code>@d</code> contains the inputs, the most like <code>"pattern"</code> first.</p> <h1 id="CONTROLLING-THE-CACHE"><a id="CONTROLLING"></a>CONTROLLING THE CACHE</h1> <p><code>String::Approx</code> maintains a LU (least-used) cache that holds the 'matching engines' for each instance of a <i>pattern+modifiers</i>. The cache is intended to help the case where you match a small set of patterns against a large set of string. However, the more engines you cache the more you eat memory. If you have a lot of different patterns or if you have a lot of memory to burn, you may want to control the cache yourself. For example, allowing a larger cache consumes more memory but probably runs a little bit faster since the cache fills (and needs flushing) less often.</p> <p>The cache has two parameters: <i>max</i> and <i>purge</i>. The first one is the maximum size of the cache and the second one is the cache flushing ratio: when the number of cache entries exceeds <i>max</i>, <i>max</i> times <i>purge</i> cache entries are flushed. The default values are 1000 and 0.75, respectively, which means that when the 1001st entry would be cached, 750 least used entries will be removed from the cache. To access the parameters you can use the calls</p> <pre><code>$now_max = String::Approx::cache_max(); String::Approx::cache_max($new_max); $now_purge = String::Approx::cache_purge(); String::Approx::cache_purge($new_purge); $limit = String::Approx::cache_n_purge();</code></pre> <p>To be honest, there are actually <b>two</b> caches: the first one is used far the patterns with no modifiers, the second one for the patterns with pattern modifiers. Using the standard parameters you will therefore actually cache up to 2000 entries. The above calls control both caches for the same price.</p> <p>To disable caching completely use</p> <pre><code>String::Approx::cache_disable();</code></pre> <p>Note that this doesn't flush any possibly existing cache entries, to do that use</p> <pre><code>String::Approx::cache_flush_all();</code></pre> <h1 id="NOTES">NOTES</h1> <p>Because matching is by <i>substrings</i>, not by whole strings, insertions and substitutions produce often very similar results: "abcde" matches "axbcde" either by insertion <b>or</b> substitution of "x".</p> <p>The maximum edit distance is also the maximum number of edits. That is, the <b>"I2"</b> in</p> <pre><code>amatch("abcd", ["I2"])</code></pre> <p>is useless because the maximum edit distance is (implicitly) 1. You may have meant to say</p> <pre><code>amatch("abcd", ["2D1S1"])</code></pre> <p>or something like that.</p> <p>If you want to simulate transposes</p> <pre><code>feet fete</code></pre> <p>you need to allow at least edit distance of two because in terms of our edit primitives a transpose is first one deletion and then one insertion.</p> <h2 id="TEXT-POSITION"><a id="TEXT"></a>TEXT POSITION</h2> <p>The starting and ending positions of matching, substituting, indexing, or slicing can be changed from the beginning and end of the input(s) to some other positions by using either or both of the modifiers</p> <pre><code>"initial_position=24" "final_position=42"</code></pre> <p>or the both the modifiers</p> <pre><code>"initial_position=24" "position_range=10"</code></pre> <p>By setting the <b>"position_range"</b> to be zero you can limit (anchor) the operation to happen only once (if a match is possible) at the position.</p> <h1 id="VERSION">VERSION</h1> <p>Major release 3.</p> <h1 id="CHANGES-FROM-VERSION-2"><a id="CHANGES"></a>CHANGES FROM VERSION 2</h1> <h2 id="GOOD-NEWS"><a id="GOOD"></a>GOOD NEWS</h2> <dl> <dt id="The-version-3-is-2-3-times-faster-than-version-2"><a id="The"></a>The version 3 is 2-3 times faster than version 2</dt> <dd> </dd> <dt id="No-pattern-length-limitation"><a id="No"></a>No pattern length limitation</dt> <dd> <p>The algorithm is independent on the pattern length: its time complexity is <i>O(kn)</i>, where <i>k</i> is the number of edits and <i>n</i> the length of the text (input). The preprocessing of the pattern will of course take some <i>O(m)</i> (<i>m</i> being the pattern length) time, but <code>amatch()</code> and <code>asubstitute()</code> cache the result of this preprocessing so that it is done only once per pattern.</p> </dd> </dl> <h2 id="BAD-NEWS"><a id="BAD"></a>BAD NEWS</h2> <dl> <dt id="You-do-need-a-C-compiler-to-install-the-module"><a id="You"></a>You do need a C compiler to install the module</dt> <dd> <p>Perl's regular expressions are no more used; instead a faster and more scalable algorithm written in C is used.</p> </dd> <dt id="asubstitute()-is-now-always-stingy"><a id="asubstitute"></a><a id="asubstitute-is-now-always-stingy"></a><code>asubstitute()</code> is now always stingy</dt> <dd> <p>The string matched and substituted is now always stingy, as short as possible. It used to be as long as possible. This is an unfortunate change stemming from switching the matching algorithm. Example: with edit distance of two and substituting for <b>"word"</b> from <b>"cork"</b> and <b>"wool"</b> previously did match <b>"cork"</b> and <b>"wool"</b>. Now it does match <b>"or"</b> and <b>"wo"</b>. As little as possible, or, in other words, with as much approximateness, as many edits, as possible. Because there is no <i>need</i> to match the <b>"c"</b> of <b>"cork"</b>, it is not matched.</p> </dd> <dt id="no-more-aregex()-because-regular-expressions-are-no-more-used"><a id="no"></a><a id="no-more-aregex-because-regular-expressions-are-no-more-used"></a>no more <code>aregex()</code> because regular expressions are no more used</dt> <dd> </dd> <dt id="no-more-compat1-for-String::Approx-version-1-compatibility"><a id="no1"></a>no more <code>compat1</code> for String::Approx version 1 compatibility</dt> <dd> </dd> </dl> <h1 id="ACKNOWLEDGEMENTS">ACKNOWLEDGEMENTS</h1> <p>The following people have provided valuable test cases, documentation clarifications, and other feedback:</p> <p>Jared August, Arthur Bergman, Anirvan Chatterjee, Steve A. Chervitz, Aldo Calpini, David Curiel, Teun van den Dool, Alberto Fontaneda, Rob Fugina, Dmitrij Frishman, Lars Gregersen, Kevin Greiner, B. Elijah Griffin, Mike Hanafey, Mitch Helle, Ricky Houghton, 'idallen', Helmut Jarausch, Damian Keefe, Ben Kennedy, Craig Kelley, Franz Kirsch, Dag Kristian, Mark Land, J. D. Laub, John P. Linderman, Tim Maher, Juha Muilu, Sergey Novoselov, Andy Oram, Ji Y Park, Eric Promislow, Nikolaus Rath, Stefan Ram, Slaven Rezic, Dag Kristian Rognlien, Stewart Russell, Slaven Rezic, Chris Rosin, Pasha Sadri, Ilya Sandler, Bob J.A. Schijvenaars, Ross Smith, Frank Tobin, Greg Ward, Rich Williams, Rick Wise.</p> <p>The matching algorithm was developed by Udi Manber, Sun Wu, and Burra Gopal in the Department of Computer Science, University of Arizona.</p> <h1 id="AUTHOR">AUTHOR</h1> <p>Jarkko Hietaniemi <jhi@iki.fi></p> <h1 id="COPYRIGHT-AND-LICENSE"><a id="COPYRIGHT"></a>COPYRIGHT AND LICENSE</h1> <p>Copyright 2001-2013 by Jarkko Hietaniemi</p> <p>This library is free software; you can redistribute it and/or modify under either the terms of the Artistic License 2.0, or the GNU Library General Public License, Version 2. See the files Artistic and LGPL for more details.</p> <p>Furthermore: no warranties or obligations of any kind are given, and the separate file <i>COPYRIGHT</i> must be included intact in all copies and derived materials.</p></div> <div id="metacpan_install-instructions-dialog" class="modal fade"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> <h4 class="modal-title">Module Install Instructions</h4> </div> <div class="modal-body"> <p>To install String::Approx, copy and paste the appropriate command in to your terminal.</p> <p><a href="/dist/App-cpanminus/view/bin/cpanm">cpanm</a></p> <pre><code>cpanm String::Approx</code></pre> <p><a href="/pod/CPAN">CPAN shell</a></p> <pre><code>perl -MCPAN -e shell install String::Approx</code></pre> <p>For more information on module installation, please visit <a href="https://www.cpan.org/modules/INSTALL.html">the detailed CPAN module installation guide</a>.</p> </div> <div class="modal-footer"> <a href="#" data-dismiss="modal" class="btn">Close</a> </div> </div> </div> </div> </main> <div class="content-pagination"> </div> </div> <footer class="footer"> <div class="footer-container"> <div class="footer-social"> <div class="footer-link footer-logo"> <a href="/"> <img src="/static/images/metacpan-logo.svg" alt="MetaCPAN" /> </a> </div> <a class="footer-social-link" href="https://github.com/metacpan"> <i class="fab fa-github-square"></i> </a> <a class="footer-social-link" href="https://fosstodon.org/@metacpan"> <i class="fab fa-mastodon"></i> </a> </div> <div class="footer-links"> <div class="footer-link"> <a href="/about">About</a> </div> <div class="footer-link"> <a href="/about/sponsors">Sponsor</a> </div> <div class="footer-link"> <a href="https://grep.metacpan.org">grep::cpan</a> </div> <div class="footer-link"> <a href="/recent">Recent</a> </div> <div class="footer-link"> <a href="/about/faq">FAQ</a> </div> <div class="footer-link"> <a href="/tools">Tools</a> </div> <div class="footer-link"> <a href="https://fastapi.metacpan.org/">API</a> </div> <div class="footer-link"> <a href="https://www.perl.org/">Perl.org</a> </div> </div> <div class="footer-sponsors"> <a class="footer-sponsor-link" target="_blank" href="https://www.bytemark.co.uk/" rel="noopener"> <img class="footer-sponsor-bytemark" src="/static/images/sponsors/bytemark_logo.svg" alt="Bytemark logo"> </a> <a class="footer-sponsor-link" target="_blank" href="https://www.liquidweb.com/" rel="noopener"> <img class="footer-sponsor-liquidweb" src="/static/images/sponsors/liquidweb_logo.png" alt="liquidweb logo"> </a> <a class="footer-sponsor-link" target="_blank" href="https://deriv.com/careers/" rel="noopener"> <img class="footer-sponsor-deriv" src="/static/images/sponsors/deriv.svg" alt="Deriv logo"> </a> <a class="footer-sponsor-link" target="_blank" href="https://geocode.xyz" rel="noopener"> <img class="footer-sponsor-geocode" src="/static/images/sponsors/geocodelogo.svg" alt="Geocode logo"> </a> <a class="footer-sponsor-link" target="_blank" href="https://www.fastly.com/" rel="noopener"> <img class="footer-sponsor-fastly" src="/static/images/sponsors/fastly_logo.svg" alt="Fastly logo"> </a> <a class="footer-sponsor-link" target="_blank" href="https://opencagedata.com" rel="noopener"> <img class="footer-sponsor-opencage" src="/static/images/sponsors/open-cage.svg" alt="OpenCage logo"> </a> <!-- Added 2024-07-22 --> <a class="footer-sponsor-link" target="_blank" href="https://www.elastic.co/" rel="noopener"> <img class="footer-sponsor-elastic" src="/static/images/sponsors/elastic.svg" alt="Elastic logo"> </a> <!-- Added 2024-07-22 --> <a class="footer-sponsor-link" target="_blank" href="https://route4me.com/" rel="noopener"> <img class="footer-sponsor-route4me" src="/static/images/sponsors/route4me.png" alt="Route4Me logo"> </a> </div> </div> </footer> <div class="modal fade" tabindex="-1" role="dialog" id="metacpan_keyboard-shortcuts"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal">×</button> <h4 class="modal-title">Keyboard Shortcuts</h4> </div> <div class="modal-body row"> <div class="col-md-6"> <table class="table keyboard-shortcuts"> <thead> <tr> <th></th> <th>Global</th> </tr> </thead> <tbody> <tr> <td class="keys"> <kbd>s</kbd> </td> <td>Focus search bar</td> </tr> <tr> <td class="keys"> <kbd>?</kbd> </td> <td>Bring up this help dialog</td> </tr> </tbody> </table> <table class="table keyboard-shortcuts"> <thead> <tr> <th></th> <th>GitHub</th> </tr> </thead> <tbody> <tr> <td class="keys"> <kbd>g</kbd> <kbd>p</kbd> </td> <td>Go to pull requests</td> </tr> <tr> <td class="keys"> <kbd>g</kbd> <kbd>i</kbd> </td> <td>go to github issues (only if github is preferred repository)</td> </tr> </tbody> </table> </div> <div class="col-md-6"> <table class="table keyboard-shortcuts"> <thead> <tr> <th></th> <th>POD</th> </tr> </thead> <tbody> <tr> <td class="keys"> <kbd>g</kbd> <kbd>a</kbd> </td> <td>Go to author</td> </tr> <tr> <td class="keys"> <kbd>g</kbd> <kbd>c</kbd> </td> <td>Go to changes</td> </tr> <tr> <td class="keys"> <kbd>g</kbd> <kbd>i</kbd> </td> <td>Go to issues</td> </tr> <tr> <td class="keys"> <kbd>g</kbd> <kbd>d</kbd> </td> <td>Go to dist</td> </tr> <tr> <td class="keys"> <kbd>g</kbd> <kbd>r</kbd> </td> <td>Go to repository/SCM</td> </tr> <tr> <td class="keys"> <kbd>g</kbd> <kbd>s</kbd> </td> <td>Go to source</td> </tr> <tr> <td class="keys"> <kbd>g</kbd> <kbd>b</kbd> </td> <td>Go to file browse</td> </tr> </tbody> </table> </div> <div class="col-md-12"> <table class="table keyboard-shortcuts"> <thead> <tr> <th></th> <th>Search terms</th> </tr> </thead> <tbody> <tr> <td><em>module:</em> (e.g. <a href="/search?q=module%3APlugin">module:Plugin</a>)</td> </tr> <tr> <td><em>distribution:</em> (e.g. <a href="/search?q=distribution%3ADancer+auth">distribution:Dancer auth</a>)</td> </tr> <tr> <td><em>author:</em> (e.g. <a href="/search?q=author%3ASONGMU+Redis">author:SONGMU Redis</a>)</td> </tr> <tr> <td><em>version:</em> (e.g. <a href="/search?q=version%3A1.00">version:1.00</a>)</td> </tr> </tbody> </table> </div> </div> <div class="modal-footer"></div> </div> </div> </div> </body> </html>