====== Perl ====== ===== Pseudo XML configreader ===== * Pseudo XML [[configreader]] ===== Walk a hash ===== while (my ($key,$val) = each(%hash) ){ print "$key:$val\n"; } An alternative way: foreach my $key (keys %hash) { print "$key:$hash{$key}\n"; } > An more common and elegant way is to use the built-in variable $_: > foreach (keys %hash) { print $_, ":", $hash{$_}, "\n"; # or "$_:$hash{$_}\n" instead } ===== Removing duplicates from an array ===== These three lines will remove all duplicate entries from the ''@myarray'' array. The array will be sorted, too. undef %temp; @temp{@myarray} = (); @myarray = sort keys %temp; ===== Recursive Directory Listing ===== sub readFiles($) { my $path=$_[0]; opendir(ROOT, $path); my @files = readdir(ROOT); closedir(ROOT); foreach my $file (@files) { next if($file =~ /^\./); #skip upper dirs and hidden files my $fullFilename = "$path/$file"; if (-d $fullFilename) { readFiles($fullFilename); #Recursion next; } #do something with the files } } # See also: File::Find ===== URL-Encode a string ===== This is a nice sub to URL-encode a string for passing it to a CGI or something. sub ue($){ my $url = $_[0]; $url =~ s/([\W])/"%" . uc(sprintf("%2.2x",ord($1)))/eg; return $url; } ===== Check if a value is in an array ===== This sub returns true if $needle is found in the @haystack. sub isin($@){ my $needle = shift; chomp($needle); my @haystack = @_; foreach my $row (@haystack){ return 1 if ($needle eq $row); } return 0; } # or: sub isin { my ($needle, @haystack) = @_; my %lookup = map {$_=>1} @haystack; return 1 if $lookup{$needle}; return 0; } # or: sub isin { my ($needle, @haystack) = @_; return 1 if (grep $needle eq $_, @haystack); return 0; } ===== Shuffle an Array ===== This is a nice one from the cookbook # fisher_yates_shuffle( \@array ) : generate a random permutation # of @array in place sub fisher_yates_shuffle { my $array = shift; my $i; for ($i = @$array; --$i; ) { my $j = int rand ($i+1); next if $i == $j; @$array[$i,$j] = @$array[$j,$i]; } } fisher_yates_shuffle( \@array ); # permutes @array in place ===== Get current time ===== ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time); or to just print the time print scalar localtime(); or to get the time in epoch $epoch = time(); //time passes print scalar localtime($epoch); * for accurate time measurement use Time::HiRes * for date parsing use Data::Manip ===== mkdir -p ===== This creates a full directory structure like ''mkdir -p'' on the shell. sub mkdirp(){ my $dir = shift(); my @parts = split('/',$dir); my $path = ''; foreach my $part (@parts){ $path .= "/$part"; unless(-d $path){ my $ok = mkdir($path); return $ok unless($ok); } } return 1; } ===== Ask for confirmation ===== Simple sub to ask a user for confirming a given Question sub yesno { print shift().' [Y/n]: '; return !~/^\s*n\s*$/i; } ===== Access MySQL ===== use DBI; $dbh = DBI->connect("dbi:mysql:$db_database:$db_server",$db_user,$db_password) || die("Can't connect"); # select $SELECT = "SELECT * FROM table"; $result = $dbh->selectall_arrayref($SELECT); $row=0; while (defined($result->[$row][0])){ #do somthing with $result->[$row][0] $row++ } # insert $value = $dbh->quote($value); $INSERT = "INSERT INTO table SET foo=$value"; $dbh->do($INSERT); $insertid = $dbh->{'mysql_insertid'}; # use parameters my $statement = $dbh->prepare(q{ SELECT field FROM table WHERE id = ? }); $statement->execute($id); my ($fieldValue) = $statement->fetchrow_array; ===== UTF8 to latin1 in Perl 5.8 ===== Perl tries to be clever about Unicode in Version 5.8 - if you want to force an encoding (eg. for inserting into a DB) use the encode function: use Encode; $octets = encode("iso-8859-15", $utf8string); ===== latin1 to UTF8 ===== And the other way around... To use in an XML file or for an HTML page use HTML::Entities; $utf8string = $iso-8859-15string; encode_entity($utf8string); ===== Print a sourcefile with linenumbers ===== perl -ne 'printf("%0.3d %s", ++$i, $_)' < source.php > source.txt ===== Parse a CSV line ===== sub parseline(){ my $line = $_[0]; $line =~ s/^\s+//; $line =~ s/\s+$//; my @chars = split(//,$line); my $quote="'"; my $sep=','; my @fields; my $current = ''; my $istext = 0; for($i=0;$inew(); $csv->parse($line); my @fields = $csv->fields(); # also backwards: $csv->combine(@fields); $line = $csv->string;