<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: extract code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sat, 17 May 2008 08:42:19 GMT</pubDate>
    <description>DZone Snippets: extract code</description>
    <item>
      <title>decompressing various archive types</title>
      <link>http://snippets.dzone.com/posts/show/5328</link>
      <description>// decompressing various archive types with this python script&lt;br /&gt;// usage unpack &lt;archive filename&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/env python&lt;br /&gt;#&lt;br /&gt;# simple python script for extracting mostly used types of archives&lt;br /&gt;# this script extracts .tar, .tar.gz, .tar.bz2, .gz and .zip archives &lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;import sys	# required for fetching command line arguments &lt;br /&gt;import os	# required for calling commands for archive extracting&lt;br /&gt;&lt;br /&gt;def unpack(s):									# this is definition of depack&lt;br /&gt;	if (s.find('.tar.gz') != -1):				#	function. It takes string&lt;br /&gt;		os.system("tar -xvvzf " + filename)		#   filename as argument.&lt;br /&gt;	elif (s.find('.tar.bz2') != -1):			#	functon than calls &lt;br /&gt;		os.system("tar -xvvjf " + filename)		#   appropriate command according&lt;br /&gt;	elif (s.find('.tar') != -1):				# 	to file extension&lt;br /&gt;		os.system("tar -xvvf " + filename)&lt;br /&gt;	elif (s.find('.gz') != -1):&lt;br /&gt;		os.system("gunzip" + filename)			&lt;br /&gt;	elif (s.find('.zip') != -1):		&lt;br /&gt;		os.system("unzip " + filename)&lt;br /&gt;	else: print "Wrong archive or filename"		# other types not supported&lt;br /&gt;&lt;br /&gt;try:											# this is main program&lt;br /&gt;	filename = sys.argv[1]						# first argument right after&lt;br /&gt;	unpack(filename)							#	'unpack' command goes in the&lt;br /&gt;except IndexError:								#	filename string&lt;br /&gt;	print "Filename is invalid!"				#	than the depack function is called&lt;br /&gt;&lt;br /&gt;# try-except block is used for handling IndexError exception if no argument is passed&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 06 Apr 2008 22:31:57 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5328</guid>
      <author>Tvrtko (Tvrtko)</author>
    </item>
    <item>
      <title>convert apache http combined logs into sql (and import it into a mysql database eventually)</title>
      <link>http://snippets.dzone.com/posts/show/3721</link>
      <description>you need to extract the data in your http server log files and put it in a database to query it with your usual tools using SQL. this perl script does just this.&lt;br /&gt;&lt;br /&gt;it was hard to find it, that's why i put it here.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/perl -w&lt;br /&gt;# Written by Aaron Jenson.&lt;br /&gt;# Original source: http://www.visualprose.com/software.php&lt;br /&gt;# Updated to work under Perl 5.6.1 by Edward Rudd&lt;br /&gt;# Updated 24 march 2007 by Slim Amamou &lt;slim.amamou@alpha-studios.com&gt;&lt;br /&gt;#  - output SQL with the option '--sql'&lt;br /&gt;#  - added SQL create table script to the HELP&lt;br /&gt;#&lt;br /&gt;#  NOTE : you need the TimeDate library (http://search.cpan.org/dist/TimeDate/)&lt;br /&gt;#&lt;br /&gt;use strict;&lt;br /&gt;use Getopt::Long qw(:config bundling);&lt;br /&gt;use DBI;&lt;br /&gt;use Date::Parse;&lt;br /&gt;&lt;br /&gt;my %options = ();&lt;br /&gt;my $i = 0;&lt;br /&gt;my $sql = '';&lt;br /&gt;my $valuesSql = '';&lt;br /&gt;my $line = '';&lt;br /&gt;my $dbh = 0;&lt;br /&gt;my $sth = 0;&lt;br /&gt;my @parts = ();&lt;br /&gt;my $part;&lt;br /&gt;my $TIMESTAMP = 3;&lt;br /&gt;my $REQUEST_LINE = 4;&lt;br /&gt;my @cols = (&lt;br /&gt;	'remote_host',			## 0&lt;br /&gt;	'remote_logname',		## 1&lt;br /&gt;	'remote_user',			## 2&lt;br /&gt;	'request_time',			## 3.string&lt;br /&gt;	'time_stamp',			## 3.posix&lt;br /&gt;	'request_line',			## 5&lt;br /&gt;	'request_method',		## 6&lt;br /&gt;	'request_uri',			## 7&lt;br /&gt;	'request_args',			## 8&lt;br /&gt;	'request_protocol',		## 9&lt;br /&gt;	'status',				## 10&lt;br /&gt;	'bytes_sent',			## 11&lt;br /&gt;	'referer',				## 12&lt;br /&gt;	'agent'					## 13&lt;br /&gt;);&lt;br /&gt;my $col = '';&lt;br /&gt;&lt;br /&gt;GetOptions (\%options,&lt;br /&gt;		"version" =&gt; sub { VERSION_MESSAGE(); exit 0; },&lt;br /&gt;		"help|?" =&gt; sub { HELP_MESSAGE(); exit 0; },&lt;br /&gt;		"host|h=s",&lt;br /&gt;		"database|d=s",&lt;br /&gt;		"table|t=s",&lt;br /&gt;		"username|u=s",&lt;br /&gt;		"password|p=s",&lt;br /&gt;		"logfile|f=s",&lt;br /&gt;		"sql");&lt;br /&gt;&lt;br /&gt;$options{host} ||= 'localhost';&lt;br /&gt;$options{database} ||= '';&lt;br /&gt;$options{username} ||= '';&lt;br /&gt;$options{password} ||= '';&lt;br /&gt;$options{logfile} ||= '';&lt;br /&gt;$options{sql} ||= '';&lt;br /&gt;&lt;br /&gt;if( ! ($options{database} || $options{sql}))&lt;br /&gt;{&lt;br /&gt;	HELP_MESSAGE();&lt;br /&gt;	print "Must supply a database to connect to.\n";&lt;br /&gt;	exit 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if( ! $options{table} )&lt;br /&gt;{&lt;br /&gt;	HELP_MESSAGE();&lt;br /&gt;	print "Must supply table name.\n";&lt;br /&gt;	exit 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if( $options{logfile} )&lt;br /&gt;{&lt;br /&gt;	if( ! -e $options{logfile} )&lt;br /&gt;	{&lt;br /&gt;		print  "File '$options{logfile}' doesn't exist.\n";&lt;br /&gt;		exit 1;&lt;br /&gt;	}&lt;br /&gt;	open(STDIN, "&lt;$options{logfile}") || die "Can't open $options{logfile} for reading.";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if( $options{database} )&lt;br /&gt;{&lt;br /&gt;	$dbh = Connect();&lt;br /&gt;	if (! $dbh) {&lt;br /&gt;		exit 1;&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$sql = "INSERT INTO $options{table} (";&lt;br /&gt;foreach $col (@cols)&lt;br /&gt;{&lt;br /&gt;	$sql .= "$col," if( $col );&lt;br /&gt;}&lt;br /&gt;chop($sql);&lt;br /&gt;$sql .= ') VALUES (';&lt;br /&gt;my ($linecount,$insertcount) = (0,0);&lt;br /&gt;while($line = &lt;STDIN&gt;)&lt;br /&gt;{&lt;br /&gt;	$linecount++;&lt;br /&gt;	@parts = SplitLogLine( $line );&lt;br /&gt;	next if( $parts[$TIMESTAMP+1] == 0 );&lt;br /&gt;	$valuesSql = '';&lt;br /&gt;	for( $i = 0; $i &lt; @cols; ++$i )&lt;br /&gt;	{&lt;br /&gt;		$parts[$i] =~ s/\\/\\\\/g;&lt;br /&gt;		$parts[$i] =~ s/'/\\'/g;&lt;br /&gt;		$valuesSql .= "'$parts[$i]'," if( $cols[$i] );&lt;br /&gt;	}&lt;br /&gt;	chop($valuesSql);&lt;br /&gt;&lt;br /&gt;	if( $options{database} )&lt;br /&gt;	{&lt;br /&gt;		$sth  = $dbh-&gt;prepare("$sql$valuesSql)");&lt;br /&gt;		if( ! $sth-&gt;execute() )&lt;br /&gt;		{&lt;br /&gt;			print "Unable to perform specified query.\n$sql$valuesSql\n" . $sth-&gt;errstr() . "\n";&lt;br /&gt;		} else {&lt;br /&gt;			$insertcount++;&lt;br /&gt;		}&lt;br /&gt;		$sth-&gt;finish();&lt;br /&gt;	}&lt;br /&gt;	if( $options{sql} )&lt;br /&gt;	{&lt;br /&gt;		print "$sql$valuesSql);\n";&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;if( ! $options{sql} )&lt;br /&gt;{&lt;br /&gt;	print "Parsed $linecount Log lines\n";&lt;br /&gt;	print "Inserted $insertcount records\n";&lt;br /&gt;	print "to table '$options{table}' in database '$options{database}' on '$options{host}'\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # &lt;br /&gt;# Connects to a MySQL database and returns the connection.&lt;br /&gt;# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # &lt;br /&gt;sub Connect&lt;br /&gt;{&lt;br /&gt;	my $dsn = "DBI:mysql:$options{database};hostname=$options{host}";&lt;br /&gt;	return DBI-&gt;connect( $dsn, $options{username}, $options{password} );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # &lt;br /&gt;# Splits up a log line into its parts.&lt;br /&gt;# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # &lt;br /&gt;sub SplitLogLine&lt;br /&gt;{&lt;br /&gt;	my $line = shift;&lt;br /&gt;	my $i = 0;&lt;br /&gt;	my $inQuote = 0;&lt;br /&gt;	my $char = '';&lt;br /&gt;	my $part = '';&lt;br /&gt;	my @parts = ();&lt;br /&gt;	my $count = 0;&lt;br /&gt;	chomp($line);&lt;br /&gt;	for( $i = 0; $i &lt; length($line); ++$i )&lt;br /&gt;	{&lt;br /&gt;		$char = substr($line, $i, 1);&lt;br /&gt;		if( $char eq ' ' &amp;&amp; ! $inQuote )&lt;br /&gt;		{&lt;br /&gt;			## print "Found part $part.\n";&lt;br /&gt;			if( $count == $TIMESTAMP )&lt;br /&gt;			{&lt;br /&gt;				push(@parts, "[".$part."]");&lt;br /&gt;				$part = str2time($part);&lt;br /&gt;			}&lt;br /&gt;			push(@parts, $part);&lt;br /&gt;			if( $count == $REQUEST_LINE )&lt;br /&gt;			{&lt;br /&gt;				my @request = split(/[ ?]/, $part);&lt;br /&gt;				push(@parts, $request[0]);&lt;br /&gt;				push(@parts, $request[1]);&lt;br /&gt;				if( $request[3] )&lt;br /&gt;				{&lt;br /&gt;					push(@parts, $request[2]);&lt;br /&gt;					push(@parts, $request[3]);&lt;br /&gt;				}&lt;br /&gt;				else&lt;br /&gt;				{&lt;br /&gt;					push(@parts, '');&lt;br /&gt;					push(@parts, $request[2]);&lt;br /&gt;				}&lt;br /&gt;				$count += 5;&lt;br /&gt;			}&lt;br /&gt;			else&lt;br /&gt;			{&lt;br /&gt;				++$count;&lt;br /&gt;			}&lt;br /&gt;			$part = '';&lt;br /&gt;		}&lt;br /&gt;		elsif( $char eq '"' || $char eq '[' || $char eq ']' )&lt;br /&gt;		{&lt;br /&gt;			$inQuote = !$inQuote;&lt;br /&gt;		}&lt;br /&gt;		else&lt;br /&gt;		{&lt;br /&gt;			$part .= $char;&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	push(@parts,$part) if $part;&lt;br /&gt;&lt;br /&gt;	return @parts;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # &lt;br /&gt;# Prints the usage/help message for this program.&lt;br /&gt;# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # &lt;br /&gt;sub HELP_MESSAGE&lt;br /&gt;{&lt;br /&gt;	print&lt;&lt;EOF;&lt;br /&gt;Imports an Apache combined log into a MySQL database.&lt;br /&gt;Usage: mysql_import_combined_log.pl -d &lt;database name&gt; -t &lt;table name&gt; [-h &lt;hostname&gt;] [-u &lt;username&gt;] [-p &lt;password&gt;] [-f &lt;filename]&lt;br /&gt; --host|-h &lt;host name&gt;         The host to connect to.  Default is localhost.&lt;br /&gt; --database|-d &lt;database name&gt; The database to use.  Required.&lt;br /&gt; --username|-u &lt;username&gt;      The user to connect as.&lt;br /&gt; --password|-p &lt;password&gt;      The user's password.&lt;br /&gt; --table|-t &lt;table name&gt;       The name of the table in which to insert data.&lt;br /&gt; --logfile|-f &lt;file name&gt;      The file to read from.  If not given, data is read from stdin.&lt;br /&gt; --sql                         Output SQL&lt;br /&gt; --help|-?                     Print out this help message.&lt;br /&gt; --version                     Print out the version of this software.&lt;br /&gt;&lt;br /&gt;----------------------------------&lt;br /&gt;-- SQL create statements for the table&lt;br /&gt;--&lt;br /&gt;&lt;br /&gt;create table &lt;TABLE_NAME&gt; (&lt;br /&gt;    remote_host varchar(50) ,&lt;br /&gt;    remote_logname varchar(50) ,&lt;br /&gt;    remote_user varchar(50) ,&lt;br /&gt;    request_time char(28),&lt;br /&gt;    time_stamp varchar(10) ,&lt;br /&gt;    request_line varchar(255),&lt;br /&gt;    request_method varchar(10) ,&lt;br /&gt;    request_uri varchar(255),&lt;br /&gt;    request_args varchar(255),&lt;br /&gt;    request_protocol varchar(10) ,&lt;br /&gt;    status varchar(10) ,&lt;br /&gt;    bytes_sent varchar(10) ,&lt;br /&gt;    referer varchar(255) ,&lt;br /&gt;    agent varchar(255)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;EOF&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # &lt;br /&gt;# Prints the version information for this program&lt;br /&gt;# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # &lt;br /&gt;sub VERSION_MESSAGE&lt;br /&gt;{&lt;br /&gt;	print "mysql_import_combined_log.pl version 1.2\n";&lt;br /&gt;	print "Version 1.0 Written by Aaron Jenson.\n";&lt;br /&gt;	print "Update to work with perl 5.6.1 by Edward Rudd\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;1;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 24 Mar 2007 10:40:53 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3721</guid>
      <author>slim (Slim Amamou)</author>
    </item>
    <item>
      <title>Extracting all subarray indices from a multi-dimensional array</title>
      <link>http://snippets.dzone.com/posts/show/1956</link>
      <description>Note the use of Array#fetch to define return values for missing indices!&lt;br /&gt;Example: ar = []; x = ar.fetch(5, [])  returns an empty array for non-existing index 5.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;class Array&lt;br /&gt;&lt;br /&gt;   def subar_indices(ar=[], temp=[])&lt;br /&gt;      temp = temp.dup&lt;br /&gt;      self.each_with_index { |item, index| &lt;br /&gt;         if item.class == Array&lt;br /&gt;            temp &lt;&lt; index&lt;br /&gt;            ar &lt;&lt; temp&lt;br /&gt;            ar = item.subar_indices(ar, temp)&lt;br /&gt;         end&lt;br /&gt;      }&lt;br /&gt;      ar.uniq&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def extract_subar_indices&lt;br /&gt;      subarray_indices = self.subar_indices  # subarray_indices is a two-dimensional array&lt;br /&gt;      # puts subarray_indices.inspect&lt;br /&gt;      &lt;br /&gt;      return subarray_indices if subarray_indices.empty?&lt;br /&gt;&lt;br /&gt;      first_subar = subarray_indices.shift   # the first subarray contains all two-dimensional subarray indices                &lt;br /&gt;&lt;br /&gt;      subarray_indices.each do |subar|&lt;br /&gt;         subar_size = subar.size&lt;br /&gt;         str = ""&lt;br /&gt;         count = -1&lt;br /&gt;         (subar_size - 1).times { count += 1; str &lt;&lt; ".fetch(subar[#{count}], [])" }&lt;br /&gt;         str &lt;&lt; ".fetch(subar[#{count + 1}], {}"&lt;br /&gt;         str = "self" &lt;&lt; str&lt;br /&gt;         if eval(str).class == Hash then subar.shift; redo end&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      first_subar.reverse.each do |item| subarray_indices.unshift([item]) end&lt;br /&gt;      subarray_indices&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;array = [1, 2, [3, 4, [5, 6]], 7, 8, [9]]&lt;br /&gt;&lt;br /&gt;indices = array.extract_subar_indices&lt;br /&gt;&lt;br /&gt;puts indices.inspect  # [[2], [5], [2, 2]]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 22 Apr 2006 20:14:52 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/1956</guid>
      <author>ntk ()</author>
    </item>
    <item>
      <title>Extracting all keys from a multi-dimensional hash</title>
      <link>http://snippets.dzone.com/posts/show/1908</link>
      <description>Extract all complete key sequences from a multi-dimensional hash (with the last key not pointing to another hash; cf. h[1][2][3] vs h[1][2][3][4] below).&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;class Hash&lt;br /&gt;&lt;br /&gt;   def extract_keys&lt;br /&gt;&lt;br /&gt;      keys = []&lt;br /&gt;&lt;br /&gt;      each_pair do |k1, v1|&lt;br /&gt;&lt;br /&gt;         if v1.is_a?(Hash)&lt;br /&gt;&lt;br /&gt;            v1.each_pair { |k2, v2|&lt;br /&gt;               if !v2.is_a?(Hash) then keys &lt;&lt; [k1, k2]; next end&lt;br /&gt;            v2.each_pair { |k3, v3|&lt;br /&gt;               if !v3.is_a?(Hash) then keys &lt;&lt; [k1, k2, k3]; next end&lt;br /&gt;            v3.each_pair { |k4, v4|&lt;br /&gt;               if !v4.is_a?(Hash) then keys &lt;&lt; [k1, k2, k3, k4]; next end&lt;br /&gt;            v4.each_pair { |k5, v5|&lt;br /&gt;               if !v5.is_a?(Hash) then keys &lt;&lt; [k1, k2, k3, k4, k5]; next end&lt;br /&gt;            v5.each_pair { |k6, v6|&lt;br /&gt;               if !v6.is_a?(Hash) then keys &lt;&lt; [k1, k2, k3, k4, k5, k6]; next end&lt;br /&gt;               # add more v[n].each_pair ... loops to process more hash dimensions&lt;br /&gt;            } } } } }      # "}" * 5&lt;br /&gt;&lt;br /&gt;         else&lt;br /&gt;            keys &lt;&lt; [k1]&lt;br /&gt;         end&lt;br /&gt;&lt;br /&gt;      end&lt;br /&gt;      &lt;br /&gt;      keys&lt;br /&gt;&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def all_values&lt;br /&gt;      extract_keys.map do |subar|&lt;br /&gt;         key = ""&lt;br /&gt;         subar.size.times { |i| key &lt;&lt; "[subar[#{i}]]" }&lt;br /&gt;         hash_str = "self" &lt;&lt; key &lt;&lt; " rescue nil"   # example: "self[subar[0]][subar[1]][subar[2]][subar[3]] rescue nil"&lt;br /&gt;         hash_value = eval(hash_str) &lt;br /&gt;      end&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#-------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   # Find every path and it's value in a Hash, http://snippets.dzone.com/posts/show/3565&lt;br /&gt;   # Author: Florian A&#223;mann&lt;br /&gt;&lt;br /&gt;   def each_path&lt;br /&gt;      raise ArgumentError unless block_given?&lt;br /&gt;      self.class.each_path(self) { |path, object| yield(path, object) }&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   protected&lt;br /&gt;   #def self.each_path(object, path = '', &amp;block)&lt;br /&gt;   def self.each_path(object, path = [], &amp;block)   # alternative&lt;br /&gt;      if object.is_a?(Hash)&lt;br /&gt;         object.each do |key, value|&lt;br /&gt;            #self.each_path(value, "#{ path }#{ key }/", &amp;block)&lt;br /&gt;            self.each_path(value, [path , key].flatten, &amp;block)   # alternative&lt;br /&gt;         end&lt;br /&gt;      else &lt;br /&gt;         yield(path, object)&lt;br /&gt;      end&lt;br /&gt;   end &lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;h = {"a"=&gt;"b", "c"=&gt;"d", 1=&gt;{2=&gt;{"e"=&gt;"f", 3=&gt;{4=&gt;"value"}}}} &lt;br /&gt;&lt;br /&gt;puts h[1][2].class          # Hash&lt;br /&gt;puts h[1][2]["e"].class     # String&lt;br /&gt;&lt;br /&gt;extracted_keys = h.extract_keys&lt;br /&gt;puts extracted_keys.inspect         # [["a"], [1, 2, "e"], [1, 2, 3, 4], ["c"]]&lt;br /&gt;&lt;br /&gt;puts h[1][2].has_key?("e")                 # true&lt;br /&gt;puts extracted_keys.include?([1, 2, "e"])  # true&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;h = {700=&gt;{4=&gt;"value"}, "a"=&gt;"b", 3=&gt;{4=&gt;"value"}, "c"=&gt;"d", 1=&gt;{2=&gt;{"e"=&gt;"f", 3=&gt;{4=&gt;"value"}, 300=&gt;{4=&gt;"value"}}}} &lt;br /&gt;p h&lt;br /&gt;p h.extract_keys    #=&gt; [["a"], [1, 2, "e"], [1, 2, 300, 4], [1, 2, 3, 4], ["c"], [700, 4], [3, 4]]&lt;br /&gt;p h.all_values      #=&gt; ["b", "f", "value", "value", "d", "value", "value"]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#-----------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;paths = []&lt;br /&gt;complex_hash = Hash[&lt;br /&gt;  :a =&gt; { :aa =&gt; '1', :ab =&gt; '2' },&lt;br /&gt;  :b =&gt; { :ba =&gt; '3', :bb =&gt; '4' }&lt;br /&gt;]&lt;br /&gt;complex_hash.each_path { |path, value| paths &lt;&lt; [ path, value ] }&lt;br /&gt;&lt;br /&gt;p paths    # =&gt; [[[:b, :ba], "3"], [[:b, :bb], "4"], [[:a, :ab], "2"], [[:a, :aa], "1"]]&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;h = {"a"=&gt;"b", "c"=&gt;"d", 1=&gt;{2=&gt;{"e"=&gt;"f", 3=&gt;{4=&gt;"value"}}}} &lt;br /&gt;h = {"a"=&gt;"b", "l" =&gt; lambda { |x| x+1 }, 1=&gt;{2=&gt;{"e"=&gt;"f", 3=&gt;{4=&gt;"value"}}}} &lt;br /&gt;h = {700=&gt;{4=&gt;"value"}, "a"=&gt;"b", nil =&gt; "NILVALUE", 3=&gt;{4=&gt;"value"}, "c"=&gt;"d", 1=&gt;{2=&gt;{"e"=&gt;"f", 3=&gt;{4=&gt;"value"}, 300=&gt;{4=&gt;"value"}}}} &lt;br /&gt;&lt;br /&gt;p h&lt;br /&gt;p h.extract_keys&lt;br /&gt;&lt;br /&gt;keys = []&lt;br /&gt;h.each_path { |path, value| keys &lt;&lt; path }&lt;br /&gt;p keys   # complete key sequences (with last key not pointing to another hash)&lt;br /&gt;&lt;br /&gt;paths = []&lt;br /&gt;h.each_path { |path, value| paths &lt;&lt; [ path, value ] }&lt;br /&gt;p paths   # complete key sequences plus values&lt;br /&gt;&lt;br /&gt;vals = []&lt;br /&gt;h.each_path { |path, value| vals &lt;&lt; value }&lt;br /&gt;p vals   # all values of complete key sequences&lt;br /&gt;&lt;br /&gt;p h.all_values   # same&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 12 Apr 2006 20:29:09 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/1908</guid>
      <author>ntk ()</author>
    </item>
  </channel>
</rss>
