📄 ch01_07.htm
字号:
<HTML><HEAD><TITLE>Recipe 1.6. Reversing a String by Word or Character (Perl Cookbook)</TITLE><METANAME="DC.title"CONTENT="Perl Cookbook"><METANAME="DC.creator"CONTENT="Tom Christiansen & Nathan Torkington"><METANAME="DC.publisher"CONTENT="O'Reilly & Associates, Inc."><METANAME="DC.date"CONTENT="1999-07-02T01:28:52Z"><METANAME="DC.type"CONTENT="Text.Monograph"><METANAME="DC.format"CONTENT="text/html"SCHEME="MIME"><METANAME="DC.source"CONTENT="1-56592-243-3"SCHEME="ISBN"><METANAME="DC.language"CONTENT="en-US"><METANAME="generator"CONTENT="Jade 1.1/O'Reilly DocBook 3.0 to HTML 4.0"><LINKREV="made"HREF="mailto:online-books@oreilly.com"TITLE="Online Books Comments"><LINKREL="up"HREF="ch01_01.htm"TITLE="1. Strings"><LINKREL="prev"HREF="ch01_06.htm"TITLE="1.5. Processing a String One Character at a Time"><LINKREL="next"HREF="ch01_08.htm"TITLE="1.7. Expanding and Compressing Tabs"></HEAD><BODYBGCOLOR="#FFFFFF"><img alt="Book Home" border="0" src="gifs/smbanner.gif" usemap="#banner-map" /><map name="banner-map"><area shape="rect" coords="1,-2,616,66" href="index.htm" alt="Perl Cookbook"><area shape="rect" coords="629,-11,726,25" href="jobjects/fsearch.htm" alt="Search this book" /></map><div class="navbar"><p><TABLEWIDTH="684"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch01_06.htm"TITLE="1.5. Processing a String One Character at a Time"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 1.5. Processing a String One Character at a Time"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><B><FONTFACE="ARIEL,HELVETICA,HELV,SANSERIF"SIZE="-1"><ACLASS="chapter"REL="up"HREF="ch01_01.htm"TITLE="1. Strings"></A></FONT></B></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch01_08.htm"TITLE="1.7. Expanding and Compressing Tabs"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 1.7. Expanding and Compressing Tabs"BORDER="0"></A></TD></TR></TABLE></DIV><DIVCLASS="sect1"><H2CLASS="sect1"><ACLASS="title"NAME="ch01-51812">1.6. Reversing a String by Word or Character</A></H2><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch01-pgfId-669">Problem <ACLASS="indexterm"NAME="ch01-idx-1000010224-0"></A><ACLASS="indexterm"NAME="ch01-idx-1000010224-1"></A><ACLASS="indexterm"NAME="ch01-idx-1000010224-2"></A><ACLASS="indexterm"NAME="ch01-idx-1000010224-3"></A></A></H3><PCLASS="para">You want to reverse the characters or words of a string.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch01-pgfId-675">Solution</A></H3><PCLASS="para">Use the <CODECLASS="literal">reverse</CODE><ACLASS="indexterm"NAME="ch01-idx-1000010241-0"></A> function in scalar context for flipping bytes.</P><PRECLASS="programlisting">$revbytes = reverse($string);</PRE><PCLASS="para">To flip words, use <CODECLASS="literal">reverse</CODE> in list context with <CODECLASS="literal">split</CODE> and <CODECLASS="literal">join</CODE>:</P><PRECLASS="programlisting">$revwords = join(" ", reverse split(" ", $string));</PRE></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch01-pgfId-687">Discussion</A></H3><PCLASS="para">The <CODECLASS="literal">reverse</CODE> function is two different functions in one. When called in scalar context, it joins together its arguments and returns that string in reverse order. When called in list context, it returns its arguments in the opposite order. When using <CODECLASS="literal">reverse</CODE> for its byte-flipping behavior, use <CODECLASS="literal">scalar</CODE> to force scalar context unless it's entirely obvious.</P><PRECLASS="programlisting">$gnirts = reverse($string); # reverse letters in $string@sdrow = reverse(@words); # reverse elements in @words$confused = reverse(@words); # reverse letters in join("", @words)</PRE><PCLASS="para">Here's an example of reversing words in a string. Using a single space, " ", as the pattern to <CODECLASS="literal">split</CODE> is a special case. It causes <CODECLASS="literal">split</CODE> to use contiguous whitespace as the separator and also discard any leading null fields, just like <EMCLASS="emphasis">awk</EM>. Normally, <CODECLASS="literal">split</CODE> discards only trailing null fields.</P><PRECLASS="programlisting"># reverse word order$string = 'Yoda said, "can you see this?"';@allwords = split(" ", $string);$revwords = join(" ", reverse @allwords);print $revwords, "\n";<CODECLASS="userinput"><B><CODECLASS="replaceable"><I>this?" see you "can said, Yoda</I></CODE></B></CODE></PRE><PCLASS="para">We could remove the temporary array <CODECLASS="literal">@allwords</CODE> and do it on one line:</P><PRECLASS="programlisting">$revwords = join(" ", reverse split(" ", $string));</PRE><PCLASS="para">Multiple whitespace in <CODECLASS="literal">$string</CODE> becomes a single space in <CODECLASS="literal">$revwords</CODE>. If you want to preserve whitespace, use this:</P><PRECLASS="programlisting">$revwords = join("", reverse split(/(\s+)/, $string));</PRE><PCLASS="para">One use of <CODECLASS="literal">reverse</CODE> is to test whether a word is a palindrome (a word that reads the same backward or forward):</P><PRECLASS="programlisting">$word = "reviver";$is_palindrome = ($word eq reverse($word));</PRE><PCLASS="para">We can turn this into a one-liner that finds big palindromes in <EMCLASS="emphasis">/usr/dict/words</EM>.</P><PRECLASS="programlisting">% perl -nle 'print if $_ eq reverse && length > 5' /usr/dict/words<CODECLASS="userinput"><B><CODECLASS="replaceable"><I>deedeed</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>degged</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>deified</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>denned</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>hallah</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>kakkak</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>murdrum</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>redder</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>repaper</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>retter</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>reviver</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>rotator</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>sooloos</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>tebbet</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>terret</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>tut-tut</I></CODE></B></CODE></PRE></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch01-pgfId-735">See Also</A></H3><PCLASS="para">The <CODECLASS="literal">split</CODE>, <CODECLASS="literal">reverse</CODE>, and <CODECLASS="literal">scalar</CODE> functions in <EMCLASS="emphasis">perlfunc </EM>(1) and <ACLASS="olink"HREF="../prog/ch03_01.htm">Chapter 3</A> of <ACLASS="citetitle"HREF="../prog/index.htm"TITLE="Programming Perl"><CITECLASS="citetitle">Programming Perl</CITE></A>; the "Switches" section of <EMCLASS="emphasis">perlrun </EM>(1) and <ACLASS="olink"HREF="../prog/ch06_01.htm">Chapter 6</A> of <ACLASS="citetitle"HREF="../prog/index.htm"TITLE="Programming Perl"><CITECLASS="citetitle">Programming Perl</CITE></A><ACLASS="indexterm"NAME="ch01-idx-1000010233-0"></A><ACLASS="indexterm"NAME="ch01-idx-1000010233-1"></A><ACLASS="indexterm"NAME="ch01-idx-1000010233-2"></A><ACLASS="indexterm"NAME="ch01-idx-1000010233-3"></A><ACLASS="indexterm"NAME="ch01-idx-1000010233-4"></A></P></DIV></DIV><DIVCLASS="htmlnav"><P></P><HRALIGN="LEFT"WIDTH="684"TITLE="footer"><TABLEWIDTH="684"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch01_06.htm"TITLE="1.5. Processing a String One Character at a Time"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 1.5. Processing a String One Character at a Time"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><ACLASS="book"HREF="index.htm"TITLE="Perl Cookbook"><IMGSRC="../gifs/txthome.gif"ALT="Perl Cookbook"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch01_08.htm"TITLE="1.7. Expanding and Compressing Tabs"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 1.7. Expanding and Compressing Tabs"BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228">1.5. Processing a String One Character at a Time</TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><ACLASS="index"HREF="index/index.htm"TITLE="Book Index"><IMGSRC="../gifs/index.gif"ALT="Book Index"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228">1.7. Expanding and Compressing Tabs</TD></TR></TABLE><HRALIGN="LEFT"WIDTH="684"TITLE="footer"><FONTSIZE="-1"></DIV<!-- LIBRARY NAV BAR --> <img src="../gifs/smnavbar.gif" usemap="#library-map" border="0" alt="Library Navigation Links"><p> <a href="copyrght.htm">Copyright © 2002</a> O'Reilly & Associates. All rights reserved.</font> </p> <map name="library-map"> <area shape="rect" coords="1,0,85,94" href="../index.htm"><area shape="rect" coords="86,1,178,103" href="../lwp/index.htm"><area shape="rect" coords="180,0,265,103" href="../lperl/index.htm"><area shape="rect" coords="267,0,353,105" href="../perlnut/index.htm"><area shape="rect" coords="354,1,446,115" href="../prog/index.htm"><area shape="rect" coords="448,0,526,132" href="../tk/index.htm"><area shape="rect" coords="528,1,615,119" href="../cookbook/index.htm"><area shape="rect" coords="617,0,690,135" href="../pxml/index.htm"></map> </BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -