📄 ch10_10.htm
字号:
<HTML><HEAD><TITLE>Recipe 10.9. Returning More Than One Array or Hash (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:39:53Z"><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="ch10_01.htm"TITLE="10. Subroutines"><LINKREL="prev"HREF="ch10_09.htm"TITLE="10.8. Skipping Selected Return Values"><LINKREL="next"HREF="ch10_11.htm"TITLE="10.10. Returning Failure"></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="ch10_09.htm"TITLE="10.8. Skipping Selected Return Values"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 10.8. Skipping Selected Return Values"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><B><FONTFACE="ARIEL,HELVETICA,HELV,SANSERIF"SIZE="-1"><ACLASS="chapter"REL="up"HREF="ch10_01.htm"TITLE="10. Subroutines"></A></FONT></B></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch10_11.htm"TITLE="10.10. Returning Failure"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 10.10. Returning Failure"BORDER="0"></A></TD></TR></TABLE></DIV><DIVCLASS="sect1"><H2CLASS="sect1"><ACLASS="title"NAME="ch10-41757">10.9. Returning More Than One Array or Hash</A></H2><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch10-pgfId-690">Problem<ACLASS="indexterm"NAME="ch10-idx-1000004695-0"></A><ACLASS="indexterm"NAME="ch10-idx-1000004695-1"></A><ACLASS="indexterm"NAME="ch10-idx-1000004695-2"></A></A></H3><PCLASS="para">You want a function to return more than one array or hash, but the return list flattens into just one long list of scalars.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch10-pgfId-696">Solution</A></H3><PCLASS="para">Return references to the hashes or arrays:</P><PRECLASS="programlisting">($array_ref, $hash_ref) = somefunc();sub somefunc { my @array; my %hash; # ... return ( \@array, \%hash );}</PRE></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch10-pgfId-722">Discussion</A></H3><PCLASS="para">Just as all arguments collapse into one flat list of scalars, return values do, too. Functions that want to return separate arrays of hashes need to return those by reference, and the caller must be prepared to receive references. If a function wants to return three separate hashes, for example, it should use one of the following:</P><PRECLASS="programlisting">sub fn { ..... return (\%a, \%b, \%c); # or return \(%a, %b, %c); # same thing}</PRE><PCLASS="para">The caller must expect a list of hash references returned out of the function. It cannot just assign to three hashes.</P><PRECLASS="programlisting">(%h0, %h1, %h2) = fn(); # WRONG!@array_of_hashes = fn(); # eg: $array_of_hashes[2]->{"keystring"}($r0, $r1, $r2) = fn(); # eg: $r2->{"keystring"}<ACLASS="indexterm"NAME="ch10-idx-1000004697-0"></A><ACLASS="indexterm"NAME="ch10-idx-1000004697-1"></A><ACLASS="indexterm"NAME="ch10-idx-1000004697-2"></A></PRE></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch10-pgfId-750">See Also</A></H3><PCLASS="para">The general discussions on references in <ACLASS="xref"HREF="ch11_01.htm"TITLE="References and Records">Chapter 11</A>, and in <ACLASS="olink"HREF="../prog/ch04_01.htm">Chapter 4</A> of <ACLASS="citetitle"HREF="../prog/index.htm"TITLE="Programming Perl"><CITECLASS="citetitle">Programming Perl</CITE></A>; <ACLASS="xref"HREF="ch10_06.htm"TITLE="Passing Arrays and Hashes by Reference">Recipe 10.5</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="ch10_09.htm"TITLE="10.8. Skipping Selected Return Values"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 10.8. Skipping Selected Return Values"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="ch10_11.htm"TITLE="10.10. Returning Failure"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 10.10. Returning Failure"BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228">10.8. Skipping Selected Return Values</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">10.10. Returning Failure</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 + -