<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Say what???: Tag ruby</title>
    <link>http://drotner.org/articles/tag/ruby</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>by Kelly McCauley</description>
    <item>
      <title>Getting a grip on archiving mail threads</title>
      <description>&lt;p&gt;I&amp;#8217;m subscribed to both the Ruby Talk and Ruby on Rails mailing lists.  Both
are high volume.  I typically don&amp;#8217;t have enough time to read all that is going
on, but I do like to have the emails around so I can search for a specific
topic.&lt;/p&gt;

&lt;p&gt;I like to keep my high volume mailing lists&amp;#8217; threads archived by month.  This
means that the topic thread head&amp;#8217;s &lt;code&gt;Date&lt;/code&gt; header determines where the entire
thread is archived, even if the thread children&amp;#8217;s &lt;code&gt;Date&lt;/code&gt; header is a different
month.  For a low volume lists, this can be done by hand using any mail client.
For high volume lists, doing it by hand is tedious and prone to mistakes.
Computers are for this type of task.  It is time to work hard at being
lazy&amp;#8230;&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s what I did to tackle this problem.  My time was limited, I only had a
couple of hours to create something to do the above for my two high volume
lists.  I had two Maildirs containing the Ruby Talk (&lt;code&gt;~/.maildir/.ruby.talk&lt;/code&gt;)
and Ruby on Rails (&lt;code&gt;~/.maildir/.ruby.rails&lt;/code&gt;) mailing lists.  Each contained
more than 50,000 emails stored in individual files in the lists&amp;#8217; &lt;code&gt;/cur&lt;/code&gt;
directory.&lt;/p&gt;

&lt;p&gt;So my &lt;code&gt;~/.maildir&lt;/code&gt; is organized like the following:&lt;/p&gt;

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;15&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;.ruby.rails/&lt;tt&gt;
&lt;/tt&gt;.ruby.rails.200603/&lt;tt&gt;
&lt;/tt&gt;.ruby.rails.200604/&lt;tt&gt;
&lt;/tt&gt;.ruby.rails.200605/&lt;tt&gt;
&lt;/tt&gt;.ruby.rails.200606/&lt;tt&gt;
&lt;/tt&gt;.ruby.rails.200607/&lt;tt&gt;
&lt;/tt&gt;.ruby.rails.200608/&lt;tt&gt;
&lt;/tt&gt;.ruby.rails.200609/&lt;tt&gt;
&lt;/tt&gt;.ruby.rails.200610/&lt;tt&gt;
&lt;/tt&gt;.ruby.rails.200611/&lt;tt&gt;
&lt;/tt&gt;.ruby.talk/&lt;tt&gt;
&lt;/tt&gt;.ruby.talk.200603/&lt;tt&gt;
&lt;/tt&gt;.ruby.talk.200604/&lt;tt&gt;
&lt;/tt&gt;.ruby.talk.200605/&lt;tt&gt;
&lt;/tt&gt;.ruby.talk.200606/&lt;tt&gt;
&lt;/tt&gt;.ruby.talk.200607/&lt;tt&gt;
&lt;/tt&gt;.ruby.talk.200608/&lt;tt&gt;
&lt;/tt&gt;.ruby.talk.200609/&lt;tt&gt;
&lt;/tt&gt;.ruby.talk.200610/&lt;tt&gt;
&lt;/tt&gt;.ruby.talk.200611/&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


&lt;p&gt;The requirements were:&lt;/p&gt;

	&lt;ul&gt;
	&lt;li&gt;Archive threads into the appropriate archive directories (should correctly archive 99.9% of the time).&lt;/li&gt;
		&lt;li&gt;Keep track of thread heads and their associated archive location so subsequent runs catch thread children dated after the previous run.&lt;/li&gt;
		&lt;li&gt;Shouldn&amp;#8217;t consume excessive amounts of memory.&lt;/li&gt;
	&lt;/ul&gt;


&lt;p&gt;Since I intended to be the sole user of this program and the scope of
functionality was so narrow, I decided to write a self contained script to
flesh out the logic and behavior.  This meant that testing by hand was OK for
me (if this was developed for someone else, I would not choose this path).
Future development iterations, I will break out the functionality into classes
and modules along with real test specs.&lt;/p&gt;

&lt;p&gt;The next decision I had was to decided how to process email headers.  Since
&lt;a href="http://tmail.rubyforge.org/"&gt;TMail&lt;/a&gt; is being maintained again, I decided to use
it instead of parsing the email headers my self.&lt;/p&gt;

&lt;p&gt;The following is the heavily commented script that I created. The most current source can be found at &lt;a href="http://svn.drotner.org/repos/unix_tools/trunk/bin/mail_sort.rb"&gt;http://svn.drotner.org/repos/unix_tools/trunk/bin/mail_sort.rb&lt;/a&gt;&lt;/p&gt;

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;15&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;25&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;28&lt;tt&gt;
&lt;/tt&gt;29&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;31&lt;tt&gt;
&lt;/tt&gt;32&lt;tt&gt;
&lt;/tt&gt;33&lt;tt&gt;
&lt;/tt&gt;34&lt;tt&gt;
&lt;/tt&gt;35&lt;tt&gt;
&lt;/tt&gt;36&lt;tt&gt;
&lt;/tt&gt;37&lt;tt&gt;
&lt;/tt&gt;38&lt;tt&gt;
&lt;/tt&gt;39&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;40&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;41&lt;tt&gt;
&lt;/tt&gt;42&lt;tt&gt;
&lt;/tt&gt;43&lt;tt&gt;
&lt;/tt&gt;44&lt;tt&gt;
&lt;/tt&gt;45&lt;tt&gt;
&lt;/tt&gt;46&lt;tt&gt;
&lt;/tt&gt;47&lt;tt&gt;
&lt;/tt&gt;48&lt;tt&gt;
&lt;/tt&gt;49&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;50&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;51&lt;tt&gt;
&lt;/tt&gt;52&lt;tt&gt;
&lt;/tt&gt;53&lt;tt&gt;
&lt;/tt&gt;54&lt;tt&gt;
&lt;/tt&gt;55&lt;tt&gt;
&lt;/tt&gt;56&lt;tt&gt;
&lt;/tt&gt;57&lt;tt&gt;
&lt;/tt&gt;58&lt;tt&gt;
&lt;/tt&gt;59&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;60&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;61&lt;tt&gt;
&lt;/tt&gt;62&lt;tt&gt;
&lt;/tt&gt;63&lt;tt&gt;
&lt;/tt&gt;64&lt;tt&gt;
&lt;/tt&gt;65&lt;tt&gt;
&lt;/tt&gt;66&lt;tt&gt;
&lt;/tt&gt;67&lt;tt&gt;
&lt;/tt&gt;68&lt;tt&gt;
&lt;/tt&gt;69&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;70&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;71&lt;tt&gt;
&lt;/tt&gt;72&lt;tt&gt;
&lt;/tt&gt;73&lt;tt&gt;
&lt;/tt&gt;74&lt;tt&gt;
&lt;/tt&gt;75&lt;tt&gt;
&lt;/tt&gt;76&lt;tt&gt;
&lt;/tt&gt;77&lt;tt&gt;
&lt;/tt&gt;78&lt;tt&gt;
&lt;/tt&gt;79&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;80&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;81&lt;tt&gt;
&lt;/tt&gt;82&lt;tt&gt;
&lt;/tt&gt;83&lt;tt&gt;
&lt;/tt&gt;84&lt;tt&gt;
&lt;/tt&gt;85&lt;tt&gt;
&lt;/tt&gt;86&lt;tt&gt;
&lt;/tt&gt;87&lt;tt&gt;
&lt;/tt&gt;88&lt;tt&gt;
&lt;/tt&gt;89&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;90&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;91&lt;tt&gt;
&lt;/tt&gt;92&lt;tt&gt;
&lt;/tt&gt;93&lt;tt&gt;
&lt;/tt&gt;94&lt;tt&gt;
&lt;/tt&gt;95&lt;tt&gt;
&lt;/tt&gt;96&lt;tt&gt;
&lt;/tt&gt;97&lt;tt&gt;
&lt;/tt&gt;98&lt;tt&gt;
&lt;/tt&gt;99&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;100&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;101&lt;tt&gt;
&lt;/tt&gt;102&lt;tt&gt;
&lt;/tt&gt;103&lt;tt&gt;
&lt;/tt&gt;104&lt;tt&gt;
&lt;/tt&gt;105&lt;tt&gt;
&lt;/tt&gt;106&lt;tt&gt;
&lt;/tt&gt;107&lt;tt&gt;
&lt;/tt&gt;108&lt;tt&gt;
&lt;/tt&gt;109&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;110&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;111&lt;tt&gt;
&lt;/tt&gt;112&lt;tt&gt;
&lt;/tt&gt;113&lt;tt&gt;
&lt;/tt&gt;114&lt;tt&gt;
&lt;/tt&gt;115&lt;tt&gt;
&lt;/tt&gt;116&lt;tt&gt;
&lt;/tt&gt;117&lt;tt&gt;
&lt;/tt&gt;118&lt;tt&gt;
&lt;/tt&gt;119&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;120&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;121&lt;tt&gt;
&lt;/tt&gt;122&lt;tt&gt;
&lt;/tt&gt;123&lt;tt&gt;
&lt;/tt&gt;124&lt;tt&gt;
&lt;/tt&gt;125&lt;tt&gt;
&lt;/tt&gt;126&lt;tt&gt;
&lt;/tt&gt;127&lt;tt&gt;
&lt;/tt&gt;128&lt;tt&gt;
&lt;/tt&gt;129&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;130&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;131&lt;tt&gt;
&lt;/tt&gt;132&lt;tt&gt;
&lt;/tt&gt;133&lt;tt&gt;
&lt;/tt&gt;134&lt;tt&gt;
&lt;/tt&gt;135&lt;tt&gt;
&lt;/tt&gt;136&lt;tt&gt;
&lt;/tt&gt;137&lt;tt&gt;
&lt;/tt&gt;138&lt;tt&gt;
&lt;/tt&gt;139&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;140&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;141&lt;tt&gt;
&lt;/tt&gt;142&lt;tt&gt;
&lt;/tt&gt;143&lt;tt&gt;
&lt;/tt&gt;144&lt;tt&gt;
&lt;/tt&gt;145&lt;tt&gt;
&lt;/tt&gt;146&lt;tt&gt;
&lt;/tt&gt;147&lt;tt&gt;
&lt;/tt&gt;148&lt;tt&gt;
&lt;/tt&gt;149&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;150&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;151&lt;tt&gt;
&lt;/tt&gt;152&lt;tt&gt;
&lt;/tt&gt;153&lt;tt&gt;
&lt;/tt&gt;154&lt;tt&gt;
&lt;/tt&gt;155&lt;tt&gt;
&lt;/tt&gt;156&lt;tt&gt;
&lt;/tt&gt;157&lt;tt&gt;
&lt;/tt&gt;158&lt;tt&gt;
&lt;/tt&gt;159&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;160&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;161&lt;tt&gt;
&lt;/tt&gt;162&lt;tt&gt;
&lt;/tt&gt;163&lt;tt&gt;
&lt;/tt&gt;164&lt;tt&gt;
&lt;/tt&gt;165&lt;tt&gt;
&lt;/tt&gt;166&lt;tt&gt;
&lt;/tt&gt;167&lt;tt&gt;
&lt;/tt&gt;168&lt;tt&gt;
&lt;/tt&gt;169&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;170&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;171&lt;tt&gt;
&lt;/tt&gt;172&lt;tt&gt;
&lt;/tt&gt;173&lt;tt&gt;
&lt;/tt&gt;174&lt;tt&gt;
&lt;/tt&gt;175&lt;tt&gt;
&lt;/tt&gt;176&lt;tt&gt;
&lt;/tt&gt;177&lt;tt&gt;
&lt;/tt&gt;178&lt;tt&gt;
&lt;/tt&gt;179&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;180&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;181&lt;tt&gt;
&lt;/tt&gt;182&lt;tt&gt;
&lt;/tt&gt;183&lt;tt&gt;
&lt;/tt&gt;184&lt;tt&gt;
&lt;/tt&gt;185&lt;tt&gt;
&lt;/tt&gt;186&lt;tt&gt;
&lt;/tt&gt;187&lt;tt&gt;
&lt;/tt&gt;188&lt;tt&gt;
&lt;/tt&gt;189&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;190&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;191&lt;tt&gt;
&lt;/tt&gt;192&lt;tt&gt;
&lt;/tt&gt;193&lt;tt&gt;
&lt;/tt&gt;194&lt;tt&gt;
&lt;/tt&gt;195&lt;tt&gt;
&lt;/tt&gt;196&lt;tt&gt;
&lt;/tt&gt;197&lt;tt&gt;
&lt;/tt&gt;198&lt;tt&gt;
&lt;/tt&gt;199&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;200&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;201&lt;tt&gt;
&lt;/tt&gt;202&lt;tt&gt;
&lt;/tt&gt;203&lt;tt&gt;
&lt;/tt&gt;204&lt;tt&gt;
&lt;/tt&gt;205&lt;tt&gt;
&lt;/tt&gt;206&lt;tt&gt;
&lt;/tt&gt;207&lt;tt&gt;
&lt;/tt&gt;208&lt;tt&gt;
&lt;/tt&gt;209&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;210&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;211&lt;tt&gt;
&lt;/tt&gt;212&lt;tt&gt;
&lt;/tt&gt;213&lt;tt&gt;
&lt;/tt&gt;214&lt;tt&gt;
&lt;/tt&gt;215&lt;tt&gt;
&lt;/tt&gt;216&lt;tt&gt;
&lt;/tt&gt;217&lt;tt&gt;
&lt;/tt&gt;218&lt;tt&gt;
&lt;/tt&gt;219&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;220&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;221&lt;tt&gt;
&lt;/tt&gt;222&lt;tt&gt;
&lt;/tt&gt;223&lt;tt&gt;
&lt;/tt&gt;224&lt;tt&gt;
&lt;/tt&gt;225&lt;tt&gt;
&lt;/tt&gt;226&lt;tt&gt;
&lt;/tt&gt;227&lt;tt&gt;
&lt;/tt&gt;228&lt;tt&gt;
&lt;/tt&gt;229&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;230&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;231&lt;tt&gt;
&lt;/tt&gt;232&lt;tt&gt;
&lt;/tt&gt;233&lt;tt&gt;
&lt;/tt&gt;234&lt;tt&gt;
&lt;/tt&gt;235&lt;tt&gt;
&lt;/tt&gt;236&lt;tt&gt;
&lt;/tt&gt;237&lt;tt&gt;
&lt;/tt&gt;238&lt;tt&gt;
&lt;/tt&gt;239&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;240&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;241&lt;tt&gt;
&lt;/tt&gt;242&lt;tt&gt;
&lt;/tt&gt;243&lt;tt&gt;
&lt;/tt&gt;244&lt;tt&gt;
&lt;/tt&gt;245&lt;tt&gt;
&lt;/tt&gt;246&lt;tt&gt;
&lt;/tt&gt;247&lt;tt&gt;
&lt;/tt&gt;248&lt;tt&gt;
&lt;/tt&gt;249&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;250&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;251&lt;tt&gt;
&lt;/tt&gt;252&lt;tt&gt;
&lt;/tt&gt;253&lt;tt&gt;
&lt;/tt&gt;254&lt;tt&gt;
&lt;/tt&gt;255&lt;tt&gt;
&lt;/tt&gt;256&lt;tt&gt;
&lt;/tt&gt;257&lt;tt&gt;
&lt;/tt&gt;258&lt;tt&gt;
&lt;/tt&gt;259&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;260&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;261&lt;tt&gt;
&lt;/tt&gt;262&lt;tt&gt;
&lt;/tt&gt;263&lt;tt&gt;
&lt;/tt&gt;264&lt;tt&gt;
&lt;/tt&gt;265&lt;tt&gt;
&lt;/tt&gt;266&lt;tt&gt;
&lt;/tt&gt;267&lt;tt&gt;
&lt;/tt&gt;268&lt;tt&gt;
&lt;/tt&gt;269&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;270&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;271&lt;tt&gt;
&lt;/tt&gt;272&lt;tt&gt;
&lt;/tt&gt;273&lt;tt&gt;
&lt;/tt&gt;274&lt;tt&gt;
&lt;/tt&gt;275&lt;tt&gt;
&lt;/tt&gt;276&lt;tt&gt;
&lt;/tt&gt;277&lt;tt&gt;
&lt;/tt&gt;278&lt;tt&gt;
&lt;/tt&gt;279&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;280&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;281&lt;tt&gt;
&lt;/tt&gt;282&lt;tt&gt;
&lt;/tt&gt;283&lt;tt&gt;
&lt;/tt&gt;284&lt;tt&gt;
&lt;/tt&gt;285&lt;tt&gt;
&lt;/tt&gt;286&lt;tt&gt;
&lt;/tt&gt;287&lt;tt&gt;
&lt;/tt&gt;288&lt;tt&gt;
&lt;/tt&gt;289&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;290&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;291&lt;tt&gt;
&lt;/tt&gt;292&lt;tt&gt;
&lt;/tt&gt;293&lt;tt&gt;
&lt;/tt&gt;294&lt;tt&gt;
&lt;/tt&gt;295&lt;tt&gt;
&lt;/tt&gt;296&lt;tt&gt;
&lt;/tt&gt;297&lt;tt&gt;
&lt;/tt&gt;298&lt;tt&gt;
&lt;/tt&gt;299&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;300&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;301&lt;tt&gt;
&lt;/tt&gt;302&lt;tt&gt;
&lt;/tt&gt;303&lt;tt&gt;
&lt;/tt&gt;304&lt;tt&gt;
&lt;/tt&gt;305&lt;tt&gt;
&lt;/tt&gt;306&lt;tt&gt;
&lt;/tt&gt;307&lt;tt&gt;
&lt;/tt&gt;308&lt;tt&gt;
&lt;/tt&gt;309&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;310&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;311&lt;tt&gt;
&lt;/tt&gt;312&lt;tt&gt;
&lt;/tt&gt;313&lt;tt&gt;
&lt;/tt&gt;314&lt;tt&gt;
&lt;/tt&gt;315&lt;tt&gt;
&lt;/tt&gt;316&lt;tt&gt;
&lt;/tt&gt;317&lt;tt&gt;
&lt;/tt&gt;318&lt;tt&gt;
&lt;/tt&gt;319&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;320&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;321&lt;tt&gt;
&lt;/tt&gt;322&lt;tt&gt;
&lt;/tt&gt;323&lt;tt&gt;
&lt;/tt&gt;324&lt;tt&gt;
&lt;/tt&gt;325&lt;tt&gt;
&lt;/tt&gt;326&lt;tt&gt;
&lt;/tt&gt;327&lt;tt&gt;
&lt;/tt&gt;328&lt;tt&gt;
&lt;/tt&gt;329&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;330&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;331&lt;tt&gt;
&lt;/tt&gt;332&lt;tt&gt;
&lt;/tt&gt;333&lt;tt&gt;
&lt;/tt&gt;334&lt;tt&gt;
&lt;/tt&gt;335&lt;tt&gt;
&lt;/tt&gt;336&lt;tt&gt;
&lt;/tt&gt;337&lt;tt&gt;
&lt;/tt&gt;338&lt;tt&gt;
&lt;/tt&gt;339&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;340&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;341&lt;tt&gt;
&lt;/tt&gt;342&lt;tt&gt;
&lt;/tt&gt;343&lt;tt&gt;
&lt;/tt&gt;344&lt;tt&gt;
&lt;/tt&gt;345&lt;tt&gt;
&lt;/tt&gt;346&lt;tt&gt;
&lt;/tt&gt;347&lt;tt&gt;
&lt;/tt&gt;348&lt;tt&gt;
&lt;/tt&gt;349&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;350&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;351&lt;tt&gt;
&lt;/tt&gt;352&lt;tt&gt;
&lt;/tt&gt;353&lt;tt&gt;
&lt;/tt&gt;354&lt;tt&gt;
&lt;/tt&gt;355&lt;tt&gt;
&lt;/tt&gt;356&lt;tt&gt;
&lt;/tt&gt;357&lt;tt&gt;
&lt;/tt&gt;358&lt;tt&gt;
&lt;/tt&gt;359&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;360&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;361&lt;tt&gt;
&lt;/tt&gt;362&lt;tt&gt;
&lt;/tt&gt;363&lt;tt&gt;
&lt;/tt&gt;364&lt;tt&gt;
&lt;/tt&gt;365&lt;tt&gt;
&lt;/tt&gt;366&lt;tt&gt;
&lt;/tt&gt;367&lt;tt&gt;
&lt;/tt&gt;368&lt;tt&gt;
&lt;/tt&gt;369&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;370&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;371&lt;tt&gt;
&lt;/tt&gt;372&lt;tt&gt;
&lt;/tt&gt;373&lt;tt&gt;
&lt;/tt&gt;374&lt;tt&gt;
&lt;/tt&gt;375&lt;tt&gt;
&lt;/tt&gt;376&lt;tt&gt;
&lt;/tt&gt;377&lt;tt&gt;
&lt;/tt&gt;378&lt;tt&gt;
&lt;/tt&gt;379&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;380&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;381&lt;tt&gt;
&lt;/tt&gt;382&lt;tt&gt;
&lt;/tt&gt;383&lt;tt&gt;
&lt;/tt&gt;384&lt;tt&gt;
&lt;/tt&gt;385&lt;tt&gt;
&lt;/tt&gt;386&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="c"&gt;#!/usr/bin/env ruby&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Author: Kelly McCauley&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Copyright 2007 Kelly McCauley&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Source: http://svn.drotner.org/repos/unix_tools/trunk/bin/mail_sort.rb&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# License: version 0.1 is Public Domain&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;rubygems&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;optparse&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;        &lt;span class="c"&gt;# Parses commandline options&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;tmail&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;           &lt;span class="c"&gt;# Handles the email parsing&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;date&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;            &lt;span class="c"&gt;# Ruby's date library&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;fileutils&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;       &lt;span class="c"&gt;# File and directory manipulation libarary&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="gv"&gt;$VERBOSE&lt;/span&gt; = &lt;span class="pc"&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="iv"&gt;@version&lt;/span&gt; = &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;0.1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="iv"&gt;@debug&lt;/span&gt; = &lt;span class="i"&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="iv"&gt;@quiet&lt;/span&gt; = &lt;span class="pc"&gt;false&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="iv"&gt;@days_ago&lt;/span&gt; = &lt;span class="i"&gt;30&lt;/span&gt;              &lt;span class="c"&gt;# Default &amp;quot;Sort and archive mail up to @days_ago&amp;quot;.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="iv"&gt;@src_mail_dir&lt;/span&gt; = &lt;span class="pc"&gt;nil&lt;/span&gt;         &lt;span class="c"&gt;# Maildir to sort and archive.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="iv"&gt;@thread_heads&lt;/span&gt; = {}          &lt;span class="c"&gt;# Maps a thread head's Message-ID to&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;                            &lt;span class="c"&gt;# its associated archive directory.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="iv"&gt;@thread_head_index&lt;/span&gt; = &lt;span class="pc"&gt;nil&lt;/span&gt;    &lt;span class="c"&gt;# Location of a saved version of @thread_heads&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;                            &lt;span class="c"&gt;# from a previous run.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="iv"&gt;@total_orphans&lt;/span&gt; = &lt;span class="i"&gt;0&lt;/span&gt;          &lt;span class="c"&gt;# Count of thread children that have no parents.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="iv"&gt;@total_emails&lt;/span&gt; = &lt;span class="i"&gt;0&lt;/span&gt;           &lt;span class="c"&gt;# Total emails read.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="iv"&gt;@total_emails_archived&lt;/span&gt; = &lt;span class="i"&gt;0&lt;/span&gt;  &lt;span class="c"&gt;# Total emails that were moved to an archive&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;                            &lt;span class="c"&gt;# directory.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;#&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Methods&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;#&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Prints out the given msgs and opts to STDERR and then exits&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;error_exit&lt;/span&gt;(opts, *msgs)&lt;tt&gt;
&lt;/tt&gt;  msgs.each {|m| &lt;span class="gv"&gt;$stderr&lt;/span&gt;.print m}&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts opts&lt;tt&gt;
&lt;/tt&gt;  exit(&lt;span class="i"&gt;1&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Loads a saved @thread_heads from a previous run into memory.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;load_thread_head_index&lt;/span&gt;(index_file)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="co"&gt;File&lt;/span&gt;.file?(index_file)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="co"&gt;File&lt;/span&gt;.open(index_file) &lt;span class="r"&gt;do&lt;/span&gt; |file|&lt;tt&gt;
&lt;/tt&gt;      file.each_line &lt;span class="r"&gt;do&lt;/span&gt; |line|&lt;tt&gt;
&lt;/tt&gt;        key, year, sum, mon = line.chomp.split(&lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="ch"&gt;\t&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="iv"&gt;@thread_heads&lt;/span&gt;[key.to_sym] = [year.to_sym, sum.to_i, mon.to_sym]&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Dumps @thread_heads that are less than 365 days ago to a file.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;#&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# I didn't serialize it to YAML because I didn't want the extra processing&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# overhead or memory consumption.  I didn't Marshal it since I wanted the&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# saved file to be tied to the particular version of Marshal.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;dump_thread_head_index&lt;/span&gt;(index_file)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="co"&gt;File&lt;/span&gt;.open(index_file, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;w&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;) &lt;span class="r"&gt;do&lt;/span&gt; |file|&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="iv"&gt;@thread_heads&lt;/span&gt;.each &lt;span class="r"&gt;do&lt;/span&gt; |key,value|&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="r"&gt;next&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; value[&lt;span class="i"&gt;1&lt;/span&gt;] &amp;lt; &lt;span class="iv"&gt;@th_index_cutoff_sum&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      file &amp;lt;&amp;lt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;key.to_s&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="ch"&gt;\t&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;value.map{|x| x.to_s}.join(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="ch"&gt;\t&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="ch"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="iv"&gt;@th_index_dump_count&lt;/span&gt; += &lt;span class="i"&gt;1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Adds the given email to the @thread_heads lookup table.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;add_thread_head&lt;/span&gt;(email)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;unless&lt;/span&gt; &lt;span class="iv"&gt;@thread_heads&lt;/span&gt;.key?(email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;message-id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].id.to_sym)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;th subject: '&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;subject&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].to_s&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;'&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@debug&lt;/span&gt; &amp;gt; &lt;span class="i"&gt;2&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="iv"&gt;@thread_heads&lt;/span&gt;[email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;message-id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].id.to_sym] = [&lt;tt&gt;
&lt;/tt&gt;      email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;date&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].date.year.to_s.to_sym,&lt;tt&gt;
&lt;/tt&gt;      (&lt;tt&gt;
&lt;/tt&gt;        email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;date&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].date.year.to_s +&lt;tt&gt;
&lt;/tt&gt;        sprintf(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;%02d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;date&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].date.mon) +&lt;tt&gt;
&lt;/tt&gt;        sprintf(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;%02d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;date&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].date.day)&lt;tt&gt;
&lt;/tt&gt;      ).to_i,&lt;tt&gt;
&lt;/tt&gt;      sprintf(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;%02d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;date&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].date.mon).to_sym,&lt;tt&gt;
&lt;/tt&gt;    ]&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Creates the archive maildir&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;create_archive_maildir&lt;/span&gt;(root_archive_dir)&lt;tt&gt;
&lt;/tt&gt;  sub_dirs = []&lt;tt&gt;
&lt;/tt&gt;  sub_dirs &amp;lt;&amp;lt; &lt;span class="co"&gt;File&lt;/span&gt;.join(root_archive_dir, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;cur&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  sub_dirs &amp;lt;&amp;lt; &lt;span class="co"&gt;File&lt;/span&gt;.join(root_archive_dir, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  sub_dirs &amp;lt;&amp;lt; &lt;span class="co"&gt;File&lt;/span&gt;.join(root_archive_dir, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;tmp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  options = {}&lt;tt&gt;
&lt;/tt&gt;  options[&lt;span class="sy"&gt;:noop&lt;/span&gt;] = &lt;span class="pc"&gt;true&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@debug&lt;/span&gt; &amp;gt; &lt;span class="i"&gt;2&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  options[&lt;span class="sy"&gt;:verbose&lt;/span&gt;] = &lt;span class="pc"&gt;true&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@debug&lt;/span&gt; &amp;gt; &lt;span class="i"&gt;1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  sub_dirs.each &lt;span class="r"&gt;do&lt;/span&gt; |dir|&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;unless&lt;/span&gt; &lt;span class="co"&gt;File&lt;/span&gt;.directory?(dir)&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="co"&gt;FileUtils&lt;/span&gt;.mkdir_p(dir, options)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;return&lt;/span&gt; sub_dirs&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Archives the given file to the give archive directory&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;archive_email&lt;/span&gt;(root_archive_dir, filename)&lt;tt&gt;
&lt;/tt&gt;  archive_dir = create_archive_maildir(root_archive_dir).shift&lt;tt&gt;
&lt;/tt&gt;  options = {}&lt;tt&gt;
&lt;/tt&gt;  options[&lt;span class="sy"&gt;:noop&lt;/span&gt;] = &lt;span class="pc"&gt;true&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@debug&lt;/span&gt; &amp;gt; &lt;span class="i"&gt;2&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  options[&lt;span class="sy"&gt;:verbose&lt;/span&gt;] = &lt;span class="pc"&gt;true&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@debug&lt;/span&gt; &amp;gt; &lt;span class="i"&gt;1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@debug&lt;/span&gt; &amp;gt; &lt;span class="i"&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="co"&gt;FileUtils&lt;/span&gt;.cp(filename, archive_dir, options)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;else&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="co"&gt;FileUtils&lt;/span&gt;.mv(filename, archive_dir)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="iv"&gt;@total_emails_archived&lt;/span&gt; += &lt;span class="i"&gt;1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Archives the thread child email into the appropriate maildir&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;archive_thread_child&lt;/span&gt;(thread_head, src_mail_dir, filename)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;tc &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;filename&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;:  &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@thread_heads&lt;/span&gt;[thread_head][&lt;span class="i"&gt;1&lt;/span&gt;]&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; &amp;lt;= &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@cutoff_sum&lt;/span&gt;&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@debug&lt;/span&gt; &amp;gt; &lt;span class="i"&gt;2&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;if&lt;/span&gt; (&lt;span class="iv"&gt;@thread_heads&lt;/span&gt;[thread_head][&lt;span class="i"&gt;1&lt;/span&gt;] &amp;lt;= &lt;span class="iv"&gt;@cutoff_sum&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;tc filename: &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;filename&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@debug&lt;/span&gt; &amp;gt; &lt;span class="i"&gt;2&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    root_archive_dir = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="co"&gt;File&lt;/span&gt;.expand_path(src_mail_dir)&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;.&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@thread_heads&lt;/span&gt;[thread_head].first.to_s&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@thread_heads&lt;/span&gt;[thread_head].last.to_s&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    archive_email(root_archive_dir, filename)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Archives the thread head email into the appropriate maildir&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;archive_thread_head&lt;/span&gt;(email, src_mail_dir, filename)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="c"&gt;# Determine this email's date sum.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  email_sum = (&lt;tt&gt;
&lt;/tt&gt;    email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;date&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].date.year.to_s +&lt;tt&gt;
&lt;/tt&gt;    sprintf(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;%02d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;date&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].date.mon) +&lt;tt&gt;
&lt;/tt&gt;    sprintf(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;%02d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;date&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].date.day)&lt;tt&gt;
&lt;/tt&gt;  ).to_i&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;th &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;filename&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;:  &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;email_sum&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; &amp;lt;= &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@cutoff_sum&lt;/span&gt;&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@debug&lt;/span&gt; &amp;gt; &lt;span class="i"&gt;2&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="c"&gt;# Is the email before the cutoff date?&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;if&lt;/span&gt; email_sum &amp;lt;= &lt;span class="iv"&gt;@cutoff_sum&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# Yes.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;th filename: &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;filename&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@debug&lt;/span&gt; &amp;gt; &lt;span class="i"&gt;2&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    root_archive_dir = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="co"&gt;File&lt;/span&gt;.expand_path(src_mail_dir)&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;.&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;date&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].date.year&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;sprintf(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;%02d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;date&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].date.mon)&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# Archive it.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    archive_email(root_archive_dir, filename)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;#&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Handle the commandline arguments&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;#&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;opts = &lt;span class="co"&gt;OptionParser&lt;/span&gt;.new &lt;span class="r"&gt;do&lt;/span&gt; |opts|&lt;tt&gt;
&lt;/tt&gt;  opts.banner = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Usage: &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="gv"&gt;$0&lt;/span&gt;&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; [OPTIONS] MAILDIR&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  opts.separator(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  opts.separator(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;OPTIONS&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  opts.on(&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;-D&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;--days-ago NUMBER&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Sort and archive mail up to --days-ago&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  ) &lt;span class="r"&gt;do&lt;/span&gt; |days|&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="iv"&gt;@days_ago&lt;/span&gt; = days&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  opts.on(&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;-i&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;--thread-head-index FILE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Specify the thread head index file&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  ) &lt;span class="r"&gt;do&lt;/span&gt; |file|&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="iv"&gt;@thread_head_idx&lt;/span&gt; = file&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  opts.on_tail(&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;-q&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;--quiet&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Turns off all output including error output&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  ) &lt;span class="r"&gt;do&lt;/span&gt; |q|&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="iv"&gt;@quiet&lt;/span&gt; = &lt;span class="pc"&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  opts.on_tail(&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;-d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;--debug&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Turns on debugging output&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  ) &lt;span class="r"&gt;do&lt;/span&gt; |debug|&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="iv"&gt;@debug&lt;/span&gt; += &lt;span class="i"&gt;1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="c"&gt;# help&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  opts.on_tail(&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;-h&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;--help&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Shows this message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  ) &lt;span class="r"&gt;do&lt;/span&gt; ||&lt;tt&gt;
&lt;/tt&gt;    error_exit(opts)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="c"&gt;# version&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  opts.on_tail(&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;-V&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;--version&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Shows the version and copyright of db_diff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  ) &lt;span class="r"&gt;do&lt;/span&gt; ||&lt;tt&gt;
&lt;/tt&gt;    error_exit(opts, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="gv"&gt;$0&lt;/span&gt;&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; version &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@version&lt;/span&gt;&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="ch"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;opts.parse!(&lt;span class="pc"&gt;ARGV&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Make sure that the source Maildir is given and that the directory exists.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="iv"&gt;@src_mail_dir&lt;/span&gt; = &lt;span class="pc"&gt;ARGV&lt;/span&gt;.shift&lt;tt&gt;
&lt;/tt&gt;error_exit(&lt;tt&gt;
&lt;/tt&gt;  opts,&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;ERROR: failed to specify a MAILDIR&lt;/span&gt;&lt;span class="ch"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;) &lt;span class="r"&gt;unless&lt;/span&gt; &lt;span class="iv"&gt;@src_mail_dir&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;error_exit(&lt;tt&gt;
&lt;/tt&gt;  opts,&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;ERROR: MAILDIR does not exist: &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@src_mail_dir&lt;/span&gt;&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="ch"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;) &lt;span class="r"&gt;unless&lt;/span&gt; &lt;span class="co"&gt;File&lt;/span&gt;.directory?(&lt;span class="iv"&gt;@src_mail_dir&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;#&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Determine the cut-off dates.  Used in simple numerical comparison of dates.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;#&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# The cut-off date for determining if thread heads are targeted for archival.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="iv"&gt;@cutoff&lt;/span&gt; = &lt;span class="co"&gt;Date&lt;/span&gt;.today - &lt;span class="iv"&gt;@days_ago&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="iv"&gt;@cutoff_sum&lt;/span&gt; = (&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="iv"&gt;@cutoff&lt;/span&gt;.year.to_s +&lt;tt&gt;
&lt;/tt&gt;  sprintf(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;%02d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="iv"&gt;@cutoff&lt;/span&gt;.mon) +&lt;tt&gt;
&lt;/tt&gt;  sprintf(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;%02d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="iv"&gt;@cutoff&lt;/span&gt;.day)&lt;tt&gt;
&lt;/tt&gt;).to_i&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# The cut-off date for storing thread heads in @thread_heads.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;thi = &lt;span class="co"&gt;Date&lt;/span&gt;.today - &lt;span class="i"&gt;365&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="iv"&gt;@th_index_cutoff_sum&lt;/span&gt; = (&lt;tt&gt;
&lt;/tt&gt;  thi.year.to_s +&lt;tt&gt;
&lt;/tt&gt;  sprintf(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;%02d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, thi.mon) +&lt;tt&gt;
&lt;/tt&gt;  sprintf(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;%02d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, thi.day)&lt;tt&gt;
&lt;/tt&gt;).to_i&lt;tt&gt;
&lt;/tt&gt;&lt;span class="iv"&gt;@th_index_dump_count&lt;/span&gt; = &lt;span class="i"&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Compose the location of the thread head index file&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@thread_head_index&lt;/span&gt;.nil?&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="iv"&gt;@thread_head_index&lt;/span&gt; = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="co"&gt;File&lt;/span&gt;.expand_path(&lt;span class="iv"&gt;@src_mail_dir&lt;/span&gt;)&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;.mail_sort.idx&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Pre-run debugging&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@debug&lt;/span&gt; &amp;gt; &lt;span class="i"&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;@debug: '&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@debug&lt;/span&gt;&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;'&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;@src_mail_dir: '&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@src_mail_dir&lt;/span&gt;&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;'&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;@thread_head_index: '&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@thread_head_index&lt;/span&gt;&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;'&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;@days_ago: '&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@days_ago&lt;/span&gt;&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;'&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;@cutoff: '&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@cutoff&lt;/span&gt;.to_s&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;'&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;@cutoff_sum: '&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@cutoff_sum&lt;/span&gt;.to_s&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;'&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;@th_index_cutoff_sum: '&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@th_index_cutoff_sum&lt;/span&gt;&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;'&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;#&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Do the run.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;#&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Load the thread head index if it exists.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;load_thread_head_index(&lt;span class="iv"&gt;@thread_head_index&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# The location of the Maildir's cur directory.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;src_mail_dir_cur = &lt;span class="co"&gt;File&lt;/span&gt;.join(&lt;span class="co"&gt;File&lt;/span&gt;.expand_path(&lt;span class="iv"&gt;@src_mail_dir&lt;/span&gt;),&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;cur&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Iterate through each file in the Maildir's cur directory.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Dir&lt;/span&gt;.foreach(src_mail_dir_cur) &lt;span class="r"&gt;do&lt;/span&gt; |filename|&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="c"&gt;# Skip . and ..&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;next&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; filename == &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;next&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; filename == &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;..&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  filename = &lt;span class="co"&gt;File&lt;/span&gt;.join(src_mail_dir_cur, filename)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="c"&gt;# Skip any directories.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;next&lt;/span&gt; &lt;span class="r"&gt;unless&lt;/span&gt; &lt;span class="co"&gt;File&lt;/span&gt;.file?(filename)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;filename: &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;filename&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@debug&lt;/span&gt; &amp;gt; &lt;span class="i"&gt;2&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="c"&gt;# Parse the file into an email.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  email = &lt;span class="co"&gt;TMail&lt;/span&gt;::&lt;span class="co"&gt;Mail&lt;/span&gt;.parse(&lt;span class="co"&gt;IO&lt;/span&gt;.read(filename))&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;if&lt;/span&gt; email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;references&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].nil? &amp;amp;&amp;amp; email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;in-reply-to&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].nil?&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# This email is a thread head&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;if&lt;/span&gt; email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;message-id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].id.nil?&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="c"&gt;# This email is a malformed email.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;No message-id for &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;filename&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;unless&lt;/span&gt; &lt;span class="iv"&gt;@quiet&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;else&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="c"&gt;# Add this email as a thread head.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      add_thread_head(email)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="c"&gt;# Archive this email.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      archive_thread_head(email, &lt;span class="iv"&gt;@src_mail_dir&lt;/span&gt;, filename)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;else&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# This email is a thread child&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    thread_head = &lt;span class="pc"&gt;nil&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# Determine the thread's head (Simple case first since it is the most&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# common)&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;if&lt;/span&gt; !email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;references&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].nil? &amp;amp;&amp;amp; !email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;references&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].ids.empty?&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="c"&gt;# This email as a References header and it is not empty&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      thread_head = email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;references&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].ids.first.to_sym&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;elsif&lt;/span&gt; !email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;in-reply-to&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].nil? &amp;amp;&amp;amp; !email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;in-reply-to&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].empty?&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="c"&gt;# This email only has a In-Reply-To header which is not empty&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      thread_head = email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;in-reply-to&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].to_s.to_sym&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# Lookup the thread head in @thread_heads.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@thread_heads&lt;/span&gt;.key?(thread_head)&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="c"&gt;# Found it, so archive this email in the thread head's archive directory.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      archive_thread_child(thread_head, &lt;span class="iv"&gt;@src_mail_dir&lt;/span&gt;, filename)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;else&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="c"&gt;# Possibly an orphaned child.  See if any of its other references are&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="c"&gt;# known thread heads.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      thread_head = &lt;span class="pc"&gt;nil&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="r"&gt;if&lt;/span&gt; email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;references&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].nil? &amp;amp;&amp;amp; !email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;in-reply-to&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].empty?&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="c"&gt;# No References header so use the In-Reply-To header.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        ref = email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;in-reply-to&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].to_s.to_sym&lt;tt&gt;
&lt;/tt&gt;        thread_head = ref &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@thread_heads&lt;/span&gt;.key?(ref)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="r"&gt;elsif&lt;/span&gt; !email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;references&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].nil? &amp;amp;&amp;amp; !email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;references&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].empty?&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="c"&gt;# Use References header.  Iterate through each of the references and&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="c"&gt;# use the first that matches as the thread's head.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        email[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;references&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;].ids.each &lt;span class="r"&gt;do&lt;/span&gt; |ref|&lt;tt&gt;
&lt;/tt&gt;          ref = ref.to_s.to_sym&lt;tt&gt;
&lt;/tt&gt;          &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@thread_heads&lt;/span&gt;.key?(ref)&lt;tt&gt;
&lt;/tt&gt;            thread_head = ref&lt;tt&gt;
&lt;/tt&gt;            &lt;span class="r"&gt;break&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;          &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="c"&gt;# Do we now have the thread's head?&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="r"&gt;if&lt;/span&gt; thread_head&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="c"&gt;# Yes, so archive this email in the thread head's archive directory.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        archive_thread_child(thread_head, &lt;span class="iv"&gt;@src_mail_dir&lt;/span&gt;, filename)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="r"&gt;else&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="c"&gt;# No.  We have an orphan.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;th orphan&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@debug&lt;/span&gt; &amp;gt; &lt;span class="i"&gt;2&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="iv"&gt;@total_orphans&lt;/span&gt; += &lt;span class="i"&gt;1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="c"&gt;# Archive it as a thread head.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        add_thread_head(email)&lt;tt&gt;
&lt;/tt&gt;        archive_thread_head(email, &lt;span class="iv"&gt;@src_mail_dir&lt;/span&gt;, filename)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="iv"&gt;@total_emails&lt;/span&gt; += &lt;span class="i"&gt;1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# The run is done, so save @thread_heads.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;dump_thread_head_index(&lt;span class="iv"&gt;@thread_head_index&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Post-run debugging.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@debug&lt;/span&gt; &amp;gt; &lt;span class="i"&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;@thread_heads.length: &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@thread_heads&lt;/span&gt;.length&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;@total_orphans: &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@total_orphans&lt;/span&gt;&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;@total_emails: &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@total_emails&lt;/span&gt;&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;@total_emails_archived: &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@total_emails_archived&lt;/span&gt;&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="gv"&gt;$stderr&lt;/span&gt;.puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;@th_index_dump_count: &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="iv"&gt;@th_index_dump_count&lt;/span&gt;&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


&lt;p&gt;Invoking it is as simple as &lt;code&gt;./mail_sort.rb -h&lt;/code&gt;.&lt;/p&gt;


</description>
      <pubDate>Fri, 21 Dec 2007 13:32:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:9db50cb6-c51b-4472-a1b4-542885c3e317</guid>
      <author>Kelly McCauley</author>
      <link>http://drotner.org/articles/2007/12/21/getting-a-grip-on-archiving-mail-threads</link>
      <category>Programming</category>
      <category>SysAdmin</category>
      <category>ruby</category>
      <trackback:ping>http://drotner.org/articles/trackback/80</trackback:ping>
    </item>
    <item>
      <title>Ruby Method of the Day - Array.reject!</title>
      <description>&lt;h3&gt;Signature&lt;/h3&gt;




&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;array.reject! {|element| block}  &lt;span class="c"&gt;#=&amp;gt; array or nil&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&lt;code&gt;array.reject {|element| block}&lt;/code&gt; does the exact same thing as
&lt;a href="http://drotner.org/articles/2007/11/14/ruby-method-of-the-day-array-delete-if"&gt;&lt;code&gt;Array.delete_if&lt;/code&gt;&lt;/a&gt;
except that it returns &lt;code&gt;nil&lt;/code&gt; if no changes were made to &lt;code&gt;array&lt;/code&gt;.&lt;/p&gt;

	&lt;h3&gt;Examples&lt;/h3&gt;




&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;15&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;a = [&lt;span class="i"&gt;1&lt;/span&gt;, &lt;span class="i"&gt;2&lt;/span&gt;, &lt;span class="i"&gt;3&lt;/span&gt;, &lt;span class="i"&gt;4&lt;/span&gt;, &lt;span class="i"&gt;5&lt;/span&gt;, &lt;span class="i"&gt;6&lt;/span&gt;, &lt;span class="i"&gt;7&lt;/span&gt;, &lt;span class="i"&gt;8&lt;/span&gt;, &lt;span class="i"&gt;9&lt;/span&gt;, &lt;span class="i"&gt;10&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;b = a.clone                 &lt;span class="c"&gt;#=&amp;gt; [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;b.reject! {&lt;span class="pc"&gt;true&lt;/span&gt;}            &lt;span class="c"&gt;#=&amp;gt; []&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;b                           &lt;span class="c"&gt;#=&amp;gt; []&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;b = a.clone                 &lt;span class="c"&gt;#=&amp;gt; [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;b.reject! {&lt;span class="pc"&gt;false&lt;/span&gt;}           &lt;span class="c"&gt;#=&amp;gt; nil&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;b                           &lt;span class="c"&gt;#=&amp;gt; [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;b = a.clone                 &lt;span class="c"&gt;#=&amp;gt; [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;b.reject! {|n| n == &lt;span class="i"&gt;3&lt;/span&gt;}      &lt;span class="c"&gt;#=&amp;gt; [1, 2, 4, 5, 6, 7, 8, 9, 10]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;b                           &lt;span class="c"&gt;#=&amp;gt; [1, 2, 4, 5, 6, 7, 8, 9, 10]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;b = a.clone                 &lt;span class="c"&gt;#=&amp;gt; [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;b.reject! {|n| n % &lt;span class="i"&gt;2&lt;/span&gt; == &lt;span class="i"&gt;0&lt;/span&gt;}  &lt;span class="c"&gt;#=&amp;gt; [1, 3, 5, 7, 9]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;b                           &lt;span class="c"&gt;#=&amp;gt; [1, 3, 5, 7, 9]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;



	&lt;h3&gt;Documentation Reference&lt;/h3&gt;


	&lt;p&gt;Ruby version 1.8.6&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.ruby-doc.org"&gt;www.ruby-doc.org&lt;/a&gt; : &lt;a href="http://www.ruby-doc.org/core/classes/Array.html#M002220"&gt;Array.reject!&lt;/a&gt;&lt;/p&gt;


</description>
      <pubDate>Wed, 21 Nov 2007 00:01:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:a738fd50-06a5-4fdc-9edb-ef25d2895f47</guid>
      <author>Kelly McCauley</author>
      <link>http://drotner.org/articles/2007/11/21/ruby-method-of-the-day-array-inplace-reject</link>
      <category>Ruby Method of the Day</category>
      <category>Programming</category>
      <category>ruby</category>
      <category>rmotd</category>
      <trackback:ping>http://drotner.org/articles/trackback/75</trackback:ping>
    </item>
    <item>
      <title>Ruby Method of the Day - Array.reject</title>
      <description>&lt;h3&gt;Signature&lt;/h3&gt;




&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;array.reject {|element| block}    &lt;span class="c"&gt;#=&amp;gt; new_array&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&lt;code&gt;array.reject {|element| block}&lt;/code&gt; iterates over
&lt;code&gt;array&lt;/code&gt;&amp;#8217;s elements and returns &lt;code&gt;new_array&lt;/code&gt; that contains any element
in &lt;code&gt;array&lt;/code&gt; where the block returns either &lt;code&gt;nil&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;

	&lt;h3&gt;Examples&lt;/h3&gt;




&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;a = [&lt;span class="i"&gt;1&lt;/span&gt;, &lt;span class="i"&gt;2&lt;/span&gt;, &lt;span class="i"&gt;3&lt;/span&gt;, &lt;span class="i"&gt;4&lt;/span&gt;, &lt;span class="i"&gt;5&lt;/span&gt;, &lt;span class="i"&gt;6&lt;/span&gt;, &lt;span class="i"&gt;7&lt;/span&gt;, &lt;span class="i"&gt;8&lt;/span&gt;, &lt;span class="i"&gt;9&lt;/span&gt;, &lt;span class="i"&gt;10&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;a.reject {|n| &lt;span class="pc"&gt;nil&lt;/span&gt;}                        &lt;span class="c"&gt;#=&amp;gt; [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.reject {|n| &lt;span class="pc"&gt;false&lt;/span&gt;}                      &lt;span class="c"&gt;#=&amp;gt; [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.reject {|n| &lt;span class="pc"&gt;true&lt;/span&gt;}                       &lt;span class="c"&gt;#=&amp;gt; []&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.reject {|n| &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;}                         &lt;span class="c"&gt;#=&amp;gt; []&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.reject {|n| &lt;span class="i"&gt;0&lt;/span&gt;}                          &lt;span class="c"&gt;#=&amp;gt; []&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;a.reject {|n| n == &lt;span class="i"&gt;3&lt;/span&gt;}                     &lt;span class="c"&gt;#=&amp;gt; [1, 2, 4, 5, 6, 7, 8, 9, 10]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.reject {|n| n % &lt;span class="i"&gt;2&lt;/span&gt; == &lt;span class="i"&gt;0&lt;/span&gt; }                            &lt;span class="c"&gt;#=&amp;gt; [1, 3, 5, 7, 9]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.reject {|n| &lt;span class="pc"&gt;true&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; (n % &lt;span class="i"&gt;3&lt;/span&gt; == &lt;span class="i"&gt;0&lt;/span&gt;) || (n % &lt;span class="i"&gt;5&lt;/span&gt; == &lt;span class="i"&gt;0&lt;/span&gt;) }  &lt;span class="c"&gt;#=&amp;gt; [1, 2, 4, 7, 8]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;



	&lt;h3&gt;Documentation Reference&lt;/h3&gt;


	&lt;p&gt;Ruby version 1.8.6&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.ruby-doc.org"&gt;www.ruby-doc.org&lt;/a&gt; : &lt;a href="http://www.ruby-doc.org/core/classes/Array.html#M002219"&gt;Array.reject&lt;/a&gt;&lt;/p&gt;


</description>
      <pubDate>Tue, 20 Nov 2007 00:01:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:1cf13dd6-30e9-4676-b8e6-d51b4bf65fd5</guid>
      <author>Kelly McCauley</author>
      <link>http://drotner.org/articles/2007/11/20/ruby-method-of-the-day-array-reject</link>
      <category>Ruby Method of the Day</category>
      <category>Programming</category>
      <category>ruby</category>
      <category>rmotd</category>
      <trackback:ping>http://drotner.org/articles/trackback/74</trackback:ping>
    </item>
    <item>
      <title>Ruby Method of the Day - Array.last</title>
      <description>&lt;h3&gt;Signature&lt;/h3&gt;




&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;array.last            &lt;span class="c"&gt;#=&amp;gt; object or nil&lt;/span&gt;
array.last(number)    &lt;span class="c"&gt;#=&amp;gt; new_array&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&lt;code&gt;array.last&lt;/code&gt; returns the last element of &lt;code&gt;array&lt;/code&gt; or it returns &lt;code&gt;nil&lt;/code&gt; if
&lt;code&gt;array&lt;/code&gt; is empty.  &lt;code&gt;array.last(number)&lt;/code&gt; returns the last &lt;code&gt;number&lt;/code&gt; elements of
&lt;code&gt;array&lt;/code&gt; or it returns an empty array if &lt;code&gt;array&lt;/code&gt; is empty.&lt;/p&gt;

	&lt;h3&gt;Examples&lt;/h3&gt;




&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;a = [&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;b&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;d&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;e&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;f&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;a.last        &lt;span class="c"&gt;#=&amp;gt; &amp;quot;f&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;[].last       &lt;span class="c"&gt;#=&amp;gt; nil&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;a.last(&lt;span class="i"&gt;0&lt;/span&gt;)     &lt;span class="c"&gt;#=&amp;gt; []&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.last(&lt;span class="i"&gt;1&lt;/span&gt;)     &lt;span class="c"&gt;#=&amp;gt; [&amp;quot;f&amp;quot;]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.last(&lt;span class="i"&gt;4&lt;/span&gt;)     &lt;span class="c"&gt;#=&amp;gt; [&amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.last(&lt;span class="i"&gt;99&lt;/span&gt;)    &lt;span class="c"&gt;#=&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;[].last(&lt;span class="i"&gt;10&lt;/span&gt;)   &lt;span class="c"&gt;#=&amp;gt; []&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;



	&lt;h3&gt;Documentation Reference&lt;/h3&gt;


	&lt;p&gt;Ruby version 1.8.6&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.ruby-doc.org"&gt;www.ruby-doc.org&lt;/a&gt; : &lt;a href="http://www.ruby-doc.org/core/classes/Array.html#M002188"&gt;Array.last&lt;/a&gt;&lt;/p&gt;


</description>
      <pubDate>Mon, 19 Nov 2007 00:01:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:b14ce645-9df5-4443-8fa1-fd6440914ac9</guid>
      <author>Kelly McCauley</author>
      <link>http://drotner.org/articles/2007/11/19/ruby-method-of-the-day-array-last</link>
      <category>Ruby Method of the Day</category>
      <category>Programming</category>
      <category>ruby</category>
      <category>rmotd</category>
      <trackback:ping>http://drotner.org/articles/trackback/73</trackback:ping>
    </item>
    <item>
      <title>Ruby Method of the Day - Array.first</title>
      <description>&lt;h3&gt;Signature&lt;/h3&gt;




&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;array.first           &lt;span class="c"&gt;#=&amp;gt; object or nil&lt;/span&gt;
array.first(number)   &lt;span class="c"&gt;#=&amp;gt; new_array&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&lt;code&gt;array.first&lt;/code&gt; returns the first element of &lt;code&gt;array&lt;/code&gt; or it returns &lt;code&gt;nil&lt;/code&gt; if
&lt;code&gt;array&lt;/code&gt; is empty.  &lt;code&gt;array.first(number)&lt;/code&gt; returns the first &lt;code&gt;number&lt;/code&gt; elements of
&lt;code&gt;array&lt;/code&gt; or it returns an empty array if &lt;code&gt;array&lt;/code&gt; is empty.&lt;/p&gt;

	&lt;h3&gt;Examples&lt;/h3&gt;




&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;a = [&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;b&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;d&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;e&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;f&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;a.first           &lt;span class="c"&gt;#=&amp;gt; &amp;quot;a&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;[].first          &lt;span class="c"&gt;#=&amp;gt; nil&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;a.first(&lt;span class="i"&gt;0&lt;/span&gt;)        &lt;span class="c"&gt;#=&amp;gt; []&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.first(&lt;span class="i"&gt;1&lt;/span&gt;)        &lt;span class="c"&gt;#=&amp;gt; [&amp;quot;a&amp;quot;]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.first(&lt;span class="i"&gt;99&lt;/span&gt;)       &lt;span class="c"&gt;#=&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;[].first(&lt;span class="i"&gt;10&lt;/span&gt;)      &lt;span class="c"&gt;#=&amp;gt; []&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;



	&lt;h3&gt;Documentation Reference&lt;/h3&gt;


	&lt;p&gt;Ruby version 1.8.6&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.ruby-doc.org"&gt;www.ruby-doc.org&lt;/a&gt; : &lt;a href="http://www.ruby-doc.org/core/classes/Array.html#M002187"&gt;Array.first&lt;/a&gt;&lt;/p&gt;


</description>
      <pubDate>Fri, 16 Nov 2007 00:01:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:ac803d19-61bf-461a-ba85-112aba4b804f</guid>
      <author>Kelly McCauley</author>
      <link>http://drotner.org/articles/2007/11/16/ruby-method-of-the-day-array-first</link>
      <category>Ruby Method of the Day</category>
      <category>Programming</category>
      <category>ruby</category>
      <category>rmotd</category>
      <trackback:ping>http://drotner.org/articles/trackback/72</trackback:ping>
    </item>
    <item>
      <title>Ruby Method of the Day - Array.fetch</title>
      <description>&lt;h3&gt;Signature&lt;/h3&gt;




&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;array.fetch(position)             &lt;span class="c"&gt;#=&amp;gt; object&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&lt;code&gt;array.fetch(position)&lt;/code&gt; returns the object located at &lt;code&gt;position&lt;/code&gt;.  If
&lt;code&gt;position&lt;/code&gt; is outside &lt;code&gt;array&lt;/code&gt; an &lt;code&gt;IndexError&lt;/code&gt; is thrown.  Note that if
&lt;code&gt;position&lt;/code&gt; is negative and outside of &lt;code&gt;array&lt;/code&gt; then the index number reported in
the exception will be reported as &lt;code&gt;position - array.length&lt;/code&gt;.  I&amp;#8217;ve
submitted a
&lt;a href="http://rubyforge.org/tracker/index.php?func=detail&amp;#38;aid=15498&amp;#38;group_id=426&amp;#38;atid=1698"&gt;patch&lt;/a&gt;
to fix it.  If &lt;code&gt;position&lt;/code&gt; is 0 or positive then start counting from the
beginning of the array.  If &lt;code&gt;position&lt;/code&gt; is negative then start counting from the
end of the array.&lt;/p&gt;



&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;array.fetch(position, default)    &lt;span class="c"&gt;#=&amp;gt; object&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&lt;code&gt;array.fetch(position, default)&lt;/code&gt; returns the object located at
&lt;code&gt;position&lt;/code&gt;.  If &lt;code&gt;position&lt;/code&gt; is outside of &lt;code&gt;array&lt;/code&gt; then &lt;code&gt;default&lt;/code&gt; is returned.
If &lt;code&gt;position&lt;/code&gt; is 0 or positive then start counting from the beginning of the
array.  If &lt;code&gt;position&lt;/code&gt; is negative then start counting from the end of the
array.&lt;/p&gt;



&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;array.fetch(position) {|position| block}  &lt;span class="c"&gt;#=&amp;gt; object&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&lt;code&gt;array.fetch(position) {|position| block}&lt;/code&gt; returns the object
located at &lt;code&gt;position&lt;/code&gt;.  If &lt;code&gt;position&lt;/code&gt; is outside of &lt;code&gt;array&lt;/code&gt; then
&lt;code&gt;block&lt;/code&gt;&amp;#8217;s returned results is returned.  If &lt;code&gt;position&lt;/code&gt; is 0 or
positive then start counting from the beginning of the array.  If &lt;code&gt;position&lt;/code&gt; is
negative then start counting from the end of the array.&lt;/p&gt;

	&lt;h3&gt;Examples&lt;/h3&gt;




&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;15&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;25&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;28&lt;tt&gt;
&lt;/tt&gt;29&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;31&lt;tt&gt;
&lt;/tt&gt;32&lt;tt&gt;
&lt;/tt&gt;33&lt;tt&gt;
&lt;/tt&gt;34&lt;tt&gt;
&lt;/tt&gt;35&lt;tt&gt;
&lt;/tt&gt;36&lt;tt&gt;
&lt;/tt&gt;37&lt;tt&gt;
&lt;/tt&gt;38&lt;tt&gt;
&lt;/tt&gt;39&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;40&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;41&lt;tt&gt;
&lt;/tt&gt;42&lt;tt&gt;
&lt;/tt&gt;43&lt;tt&gt;
&lt;/tt&gt;44&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;a = [&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;b&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;e&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;f&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;]   &lt;span class="c"&gt;#=&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.fetch(&lt;span class="i"&gt;2&lt;/span&gt;)                      &lt;span class="c"&gt;#=&amp;gt; &amp;quot;c&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.fetch(&lt;span class="i"&gt;-2&lt;/span&gt;)                     &lt;span class="c"&gt;#=&amp;gt; &amp;quot;e&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;begin&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  a.fetch(&lt;span class="i"&gt;99&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;rescue&lt;/span&gt; &lt;span class="co"&gt;Exception&lt;/span&gt; =&amp;gt; e&lt;tt&gt;
&lt;/tt&gt;  e.inspect                     &lt;span class="c"&gt;#=&amp;gt; &amp;quot;#&amp;lt;IndexError: index 99 out of array&amp;gt;&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;begin&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  a.fetch(&lt;span class="i"&gt;-99&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;rescue&lt;/span&gt; &lt;span class="co"&gt;Exception&lt;/span&gt; =&amp;gt; e&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="c"&gt;# Note that it reports an index of -93 (i.e. -99 - a.length).&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  e.inspect                     &lt;span class="c"&gt;#=&amp;gt; &amp;quot;#&amp;lt;IndexError: index -93 out of array&amp;gt;&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;begin&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  a.fetch(&lt;span class="i"&gt;-7&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;rescue&lt;/span&gt; &lt;span class="co"&gt;Exception&lt;/span&gt; =&amp;gt; e&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="c"&gt;# Note that it reports an index of -1 (i.e. -7 - a.length).&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  e.inspect                     &lt;span class="c"&gt;#=&amp;gt; &amp;quot;#&amp;lt;IndexError: index -1 out of array&amp;gt;&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;a.fetch(&lt;span class="i"&gt;4&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;z&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;)                 &lt;span class="c"&gt;#=&amp;gt; &amp;quot;e&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.fetch(&lt;span class="i"&gt;99&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;z&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;)                &lt;span class="c"&gt;#=&amp;gt; &amp;quot;z&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;a.fetch(&lt;span class="i"&gt;4&lt;/span&gt;){&lt;span class="pc"&gt;false&lt;/span&gt;}               &lt;span class="c"&gt;#=&amp;gt; &amp;quot;e&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.fetch(&lt;span class="i"&gt;99&lt;/span&gt;){&lt;span class="pc"&gt;false&lt;/span&gt;}              &lt;span class="c"&gt;#=&amp;gt; false&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;default_fetch&lt;/span&gt;(ary, position)&lt;tt&gt;
&lt;/tt&gt;  element = &lt;span class="pc"&gt;nil&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;if&lt;/span&gt; position &amp;gt; ary.length&lt;tt&gt;
&lt;/tt&gt;    element = ary.last&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;else&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    element = ary.first&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;a.fetch(&lt;span class="i"&gt;99&lt;/span&gt;){|position| default_fetch(a, position)}    &lt;span class="c"&gt;#=&amp;gt; &amp;quot;f&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.fetch(&lt;span class="i"&gt;4&lt;/span&gt;){|position| default_fetch(a, position)}     &lt;span class="c"&gt;#=&amp;gt; &amp;quot;e&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.fetch(&lt;span class="i"&gt;-99&lt;/span&gt;){|position| default_fetch(a, position)}   &lt;span class="c"&gt;#=&amp;gt; &amp;quot;a&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;



	&lt;h3&gt;Documentation Reference&lt;/h3&gt;


	&lt;p&gt;Ruby version 1.8.6&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.ruby-doc.org"&gt;www.ruby-doc.org&lt;/a&gt; : &lt;a href="http://www.ruby-doc.org/core/classes/Array.html#M002186"&gt;Array.fetch&lt;/a&gt;&lt;/p&gt;


</description>
      <pubDate>Thu, 15 Nov 2007 00:01:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:097a38a9-04ca-47a3-a17c-00116bf58b58</guid>
      <author>Kelly McCauley</author>
      <link>http://drotner.org/articles/2007/11/15/ruby-method-of-the-day-array-fetch</link>
      <category>Ruby Method of the Day</category>
      <category>Programming</category>
      <category>ruby</category>
      <category>rmotd</category>
      <trackback:ping>http://drotner.org/articles/trackback/71</trackback:ping>
    </item>
    <item>
      <title>Ruby Method of the Day - Array.delete_if</title>
      <description>&lt;h3&gt;Signature&lt;/h3&gt;




&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;array.delete_if {|element| block}   &lt;span class="c"&gt;#=&amp;gt; array&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&lt;code&gt;array.delete_if {|element| block}&lt;/code&gt; iterates over all elements of
&lt;code&gt;array&lt;/code&gt; and deletes an &lt;code&gt;element&lt;/code&gt; from &lt;code&gt;array&lt;/code&gt; if &lt;code&gt;block&lt;/code&gt; returns &lt;code&gt;true&lt;/code&gt; for that
element.&lt;/p&gt;

	&lt;h3&gt;Examples&lt;/h3&gt;




&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;a = [&lt;span class="i"&gt;1&lt;/span&gt;,&lt;span class="i"&gt;2&lt;/span&gt;,&lt;span class="i"&gt;3&lt;/span&gt;,&lt;span class="i"&gt;4&lt;/span&gt;,&lt;span class="i"&gt;5&lt;/span&gt;,&lt;span class="i"&gt;6&lt;/span&gt;,&lt;span class="i"&gt;7&lt;/span&gt;,&lt;span class="i"&gt;8&lt;/span&gt;,&lt;span class="i"&gt;9&lt;/span&gt;,&lt;span class="i"&gt;10&lt;/span&gt;]    &lt;span class="c"&gt;#=&amp;gt; [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.delete_if {|n| n % &lt;span class="i"&gt;2&lt;/span&gt; == &lt;span class="i"&gt;0&lt;/span&gt;}  &lt;span class="c"&gt;#=&amp;gt; [1, 3, 5, 7, 9]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a                             &lt;span class="c"&gt;#=&amp;gt; [1, 3, 5, 7, 9]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;



	&lt;p&gt;The following is another usage example.&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;15&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;25&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;28&lt;tt&gt;
&lt;/tt&gt;29&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;31&lt;tt&gt;
&lt;/tt&gt;32&lt;tt&gt;
&lt;/tt&gt;33&lt;tt&gt;
&lt;/tt&gt;34&lt;tt&gt;
&lt;/tt&gt;35&lt;tt&gt;
&lt;/tt&gt;36&lt;tt&gt;
&lt;/tt&gt;37&lt;tt&gt;
&lt;/tt&gt;38&lt;tt&gt;
&lt;/tt&gt;39&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;40&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;41&lt;tt&gt;
&lt;/tt&gt;42&lt;tt&gt;
&lt;/tt&gt;43&lt;tt&gt;
&lt;/tt&gt;44&lt;tt&gt;
&lt;/tt&gt;45&lt;tt&gt;
&lt;/tt&gt;46&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="c"&gt;#!/usr/bin/env ruby&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;#&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# A contrived example of using Array.delete_if&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;#&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="gv"&gt;$VERBOSE&lt;/span&gt; = &lt;span class="pc"&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;pp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Member of an organization.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Member&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  attr_accessor &lt;span class="sy"&gt;:name&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  attr_accessor &lt;span class="sy"&gt;:current&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;current?&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="iv"&gt;@current&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Raw member data&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;members_data = [&lt;tt&gt;
&lt;/tt&gt;  [&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="pc"&gt;true&lt;/span&gt;],&lt;tt&gt;
&lt;/tt&gt;  [&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Fred&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="pc"&gt;false&lt;/span&gt;],&lt;tt&gt;
&lt;/tt&gt;  [&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Bill&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="pc"&gt;false&lt;/span&gt;],&lt;tt&gt;
&lt;/tt&gt;  [&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="pc"&gt;true&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;]&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Create the members based on the raw member data&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;members = members_data.map &lt;span class="r"&gt;do&lt;/span&gt; |entry|&lt;tt&gt;
&lt;/tt&gt;  member = &lt;span class="co"&gt;Member&lt;/span&gt;.new&lt;tt&gt;
&lt;/tt&gt;  member.name = entry[&lt;span class="i"&gt;0&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;  member.current = entry[&lt;span class="i"&gt;1&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;  member&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;puts &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Before purging of non-current members...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;pp members&lt;tt&gt;
&lt;/tt&gt;puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="ch"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Purge non-current members.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;members.delete_if {|member| !member.current?}&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;puts &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;After purging of non-current members...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;pp members&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Produces&amp;#8230;&lt;/p&gt;

&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;Before purging of non-current members...
[#&amp;lt;Member:0x87780 @current=true, @name=&amp;quot;Bob&amp;quot;&amp;gt;,
 #&amp;lt;Member:0x877a8 @current=false, @name=&amp;quot;Fred&amp;quot;&amp;gt;,
 #&amp;lt;Member:0x87794 @current=false, @name=&amp;quot;Bill&amp;quot;&amp;gt;,
 #&amp;lt;Member:0x8776c @current=true, @name=&amp;quot;Alice&amp;quot;&amp;gt;]

After purging of non-current members...
[#&amp;lt;Member:0x87780 @current=true, @name=&amp;quot;Bob&amp;quot;&amp;gt;,
 #&amp;lt;Member:0x8776c @current=true, @name=&amp;quot;Alice&amp;quot;&amp;gt;]
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;h3&gt;Documentation Reference&lt;/h3&gt;


	&lt;p&gt;Ruby version 1.8.6&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.ruby-doc.org"&gt;www.ruby-doc.org&lt;/a&gt; : &lt;a href="http://www.ruby-doc.org/core/classes/Array.html#M002218"&gt;Array.delete_if&lt;/a&gt;&lt;/p&gt;


</description>
      <pubDate>Wed, 14 Nov 2007 00:01:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:c3ae3467-4596-4f3a-a549-341832813f9f</guid>
      <author>Kelly McCauley</author>
      <link>http://drotner.org/articles/2007/11/14/ruby-method-of-the-day-array-delete-if</link>
      <category>Ruby Method of the Day</category>
      <category>Programming</category>
      <category>ruby</category>
      <category>rmotd</category>
      <trackback:ping>http://drotner.org/articles/trackback/70</trackback:ping>
    </item>
    <item>
      <title>Ruby Method of the Day - Array.delete</title>
      <description>&lt;h3&gt;Signature&lt;/h3&gt;




&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;array.delete(object)                &lt;span class="c"&gt;#=&amp;gt; object or nil&lt;/span&gt;
array.delete(object) {|o| block }   &lt;span class="c"&gt;#=&amp;gt; object or returned_block_result&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&lt;code&gt;array.delete(object)&lt;/code&gt; removes all occurances of &lt;code&gt;object&lt;/code&gt; from &lt;code&gt;array&lt;/code&gt; and
returns &lt;code&gt;object&lt;/code&gt; if &lt;code&gt;object&lt;/code&gt; is found in &lt;code&gt;array&lt;/code&gt; or it returns &lt;code&gt;nil&lt;/code&gt; if
&lt;code&gt;object&lt;/code&gt; is not found in &lt;code&gt;array&lt;/code&gt;.  If &lt;code&gt;block&lt;/code&gt; is given and &lt;code&gt;object&lt;/code&gt; is not
found in &lt;code&gt;array&lt;/code&gt; then the the &lt;code&gt;block&lt;/code&gt;&amp;#8217;s returned results is returned
by &lt;code&gt;array.delete&lt;/code&gt;.&lt;/p&gt;

	&lt;h3&gt;Examples&lt;/h3&gt;




&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;15&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;a = [&lt;span class="i"&gt;1&lt;/span&gt;,&lt;span class="i"&gt;2&lt;/span&gt;,&lt;span class="i"&gt;3&lt;/span&gt;,&lt;span class="i"&gt;4&lt;/span&gt;,&lt;span class="i"&gt;5&lt;/span&gt;,&lt;span class="i"&gt;6&lt;/span&gt;,&lt;span class="i"&gt;7&lt;/span&gt;]       &lt;span class="c"&gt;#=&amp;gt; [1, 2, 3, 4, 5, 6, 7]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.delete(&lt;span class="i"&gt;7&lt;/span&gt;)               &lt;span class="c"&gt;#=&amp;gt; 7&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a                         &lt;span class="c"&gt;#=&amp;gt; [1, 2, 3, 4, 5, 6]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.delete(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;foo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;)           &lt;span class="c"&gt;#=&amp;gt; nil&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;a = [&lt;span class="i"&gt;7&lt;/span&gt;,&lt;span class="i"&gt;1&lt;/span&gt;,&lt;span class="i"&gt;2&lt;/span&gt;,&lt;span class="i"&gt;3&lt;/span&gt;,&lt;span class="i"&gt;7&lt;/span&gt;,&lt;span class="i"&gt;4&lt;/span&gt;,&lt;span class="i"&gt;5&lt;/span&gt;,&lt;span class="i"&gt;6&lt;/span&gt;,&lt;span class="i"&gt;7&lt;/span&gt;]   &lt;span class="c"&gt;#=&amp;gt; [7, 1, 2, 3, 7, 4, 5, 6, 7]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.delete(&lt;span class="i"&gt;7&lt;/span&gt;)               &lt;span class="c"&gt;#=&amp;gt; 7&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a                         &lt;span class="c"&gt;#=&amp;gt; [1, 2, 3, 4, 5, 6]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;a.delete(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;foo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;) {&lt;span class="pc"&gt;false&lt;/span&gt;}   &lt;span class="c"&gt;#=&amp;gt; false&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;a.delete(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;foo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;) &lt;span class="r"&gt;do&lt;/span&gt; |item|&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;'&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;item&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;' not found&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;                       &lt;span class="c"&gt;#=&amp;gt; &amp;quot;'foo' not found&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;



	&lt;h3&gt;Documentation Reference&lt;/h3&gt;


	&lt;p&gt;Ruby version 1.8.6&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.ruby-doc.org"&gt;www.ruby-doc.org&lt;/a&gt; : &lt;a href="http://www.ruby-doc.org/core/classes/Array.html#M002216"&gt;Array.delete&lt;/a&gt;&lt;/p&gt;


</description>
      <pubDate>Tue, 13 Nov 2007 00:01:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:89422d9d-04bf-4064-b2af-a76d5faea748</guid>
      <author>Kelly McCauley</author>
      <link>http://drotner.org/articles/2007/11/13/ruby-method-of-the-day-array-delete</link>
      <category>Ruby Method of the Day</category>
      <category>Programming</category>
      <category>ruby</category>
      <category>rmotd</category>
      <trackback:ping>http://drotner.org/articles/trackback/69</trackback:ping>
    </item>
    <item>
      <title>Ruby Method of the Day - Array.compact and Array.compact!</title>
      <description>&lt;h3&gt;Signature&lt;/h3&gt;




&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;array.compact   &lt;span class="c"&gt;#=&amp;gt; new_array&lt;/span&gt;
array.compact!  &lt;span class="c"&gt;#=&amp;gt; array or nil&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&lt;code&gt;array.compact&lt;/code&gt; returns &lt;code&gt;new_array&lt;/code&gt; that contains all non-&lt;code&gt;nil&lt;/code&gt;
elements in &lt;code&gt;array&lt;/code&gt; (&lt;code&gt;nil&lt;/code&gt; elements removed).  &lt;code&gt;array.compact!&lt;/code&gt; either returns
&lt;code&gt;array&lt;/code&gt; with all &lt;code&gt;nil&lt;/code&gt; elements removed or returns &lt;code&gt;nil&lt;/code&gt; if no &lt;code&gt;nil&lt;/code&gt;
elements were removed.&lt;/p&gt;

	&lt;h3&gt;Examples&lt;/h3&gt;




&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;a = [&lt;span class="i"&gt;1&lt;/span&gt;, &lt;span class="pc"&gt;nil&lt;/span&gt;, &lt;span class="pc"&gt;nil&lt;/span&gt;, &lt;span class="i"&gt;4&lt;/span&gt;, &lt;span class="pc"&gt;nil&lt;/span&gt;]       &lt;span class="c"&gt;#=&amp;gt; [1, nil, nil, 4, nil]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.compact                       &lt;span class="c"&gt;#=&amp;gt; [1, 4]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a                               &lt;span class="c"&gt;#=&amp;gt; [1, nil, nil, 4, nil]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.compact!                      &lt;span class="c"&gt;#=&amp;gt; [1, 4]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a                               &lt;span class="c"&gt;#=&amp;gt; [1, 4]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;a.compact!                      &lt;span class="c"&gt;#=&amp;gt; nil&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;



	&lt;h3&gt;Documentation Reference&lt;/h3&gt;


	&lt;p&gt;Ruby version 1.8.6&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.ruby-doc.org"&gt;www.ruby-doc.org&lt;/a&gt; : &lt;a href="http://www.ruby-doc.org/core/classes/Array.html#M002239"&gt;Array.compact&lt;/a&gt;, &lt;a href="http://www.ruby-doc.org/core/classes/Array.html#M002240"&gt;Array.compact!&lt;/a&gt;&lt;/p&gt;


</description>
      <pubDate>Mon, 12 Nov 2007 00:01:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:4b468dcf-d320-4602-b0f8-8516042fa23c</guid>
      <author>Kelly McCauley</author>
      <link>http://drotner.org/articles/2007/11/12/ruby-method-of-the-day-array-compact</link>
      <category>Ruby Method of the Day</category>
      <category>Programming</category>
      <category>ruby</category>
      <category>rmotd</category>
    </item>
    <item>
      <title>Ruby Method of the Day - Array.pop</title>
      <description>&lt;h3&gt;Signature&lt;/h3&gt;




&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;array.pop   &lt;span class="c"&gt;#=&amp;gt; object or nil&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&lt;code&gt;array.pop&lt;/code&gt; removes and returns the last object from &lt;code&gt;array&lt;/code&gt;.  &lt;code&gt;nil&lt;/code&gt; is
returned if &lt;code&gt;array&lt;/code&gt; is empty (which is not a good test for an empty array since
the last object of the array could itself be &lt;code&gt;nil&lt;/code&gt;).&lt;/p&gt;

	&lt;h3&gt;Examples&lt;/h3&gt;




&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;stack = []&lt;tt&gt;
&lt;/tt&gt;stack.pop           &lt;span class="c"&gt;#=&amp;gt; nil&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;stack.push(&lt;span class="i"&gt;1&lt;/span&gt;,&lt;span class="i"&gt;2&lt;/span&gt;,&lt;span class="i"&gt;3&lt;/span&gt;)   &lt;span class="c"&gt;#=&amp;gt; [1, 2, 3]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;stack.pop           &lt;span class="c"&gt;#=&amp;gt; 3&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;stack               &lt;span class="c"&gt;#=&amp;gt; [1, 2]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;stack.push(&lt;span class="pc"&gt;nil&lt;/span&gt;)     &lt;span class="c"&gt;#=&amp;gt; [1, 2, nil]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;stack.pop           &lt;span class="c"&gt;#=&amp;gt; nil&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;



	&lt;h3&gt;Documentation Reference&lt;/h3&gt;


	&lt;p&gt;Ruby version 1.8.6&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.ruby-doc.org"&gt;www.ruby-doc.org&lt;/a&gt; : &lt;a href="http://www.ruby-doc.org/core/classes/Array.html#M002192"&gt;Array.pop&lt;/a&gt;&lt;/p&gt;


</description>
      <pubDate>Fri, 09 Nov 2007 00:01:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:c27abb8a-f182-4410-a064-e2062b5ab3df</guid>
      <author>Kelly McCauley</author>
      <link>http://drotner.org/articles/2007/11/09/ruby-method-of-the-day-array-pop</link>
      <category>Ruby Method of the Day</category>
      <category>Programming</category>
      <category>ruby</category>
      <category>rmotd</category>
    </item>
  </channel>
</rss>
