[[Perl]]

*小物関数

#contents

**形式変換

桁数にあわせて無理矢理切る。~
早そうだが未確認。

	sub dec2bin
	{
		my $value	= int(shift);
		my $figure	= int(shift);
		$figure = 1 if ($figure <= 0);
	
		return substr(unpack("B32", pack("N", $value)), -$figure);
	}


	sub dec2bin
	{
		my $value	= int(shift);
		my $figure	= int(shift);
		$figure = 1 if ($figure <= 0);
	
		while ($value > 0) {
			$retval = ($val % 2) . $retval;
			$val >>= 1;
			$figure--;
		}	
		return (0 x $figure) . $retval;
	}

**パス関係

	package Path;
	
	use strict;
	
	=head2 chompSlash($path)
	
		最後の / を削除する
		$/ = '/'としているだけでchompと同様
	
	=cut
	
	sub chompSlash
	{
		local $/ = '/';
		chomp @_;
	}
	
	
	=head2 absolute2relative2($base,$target)
	
		2つの絶対パスから相対パスを求める
		$base(のあるディレクトリ)から$targetへのパス
	
		@param	$baseはディレクトリ
	
		@return	ディレクトリの場合最後に/は含まない
	
	=cut
	
	sub absolute2relative2
	{
		&chompSlash(@_);
		my ($base,$target) = @_;
	
		# 合っていることが確定したディレクトリ のインデックス
		my $indexDir = 0;
		# 合っていることが確認した文字列のインデックス
		my $index = 0;
		# チェックする長さ
		my $length = (length($base) < length($target)) ? length($base) : length($target);
	
		foreach my $i (0..$length-1) {
			if (substr($base,$i,1) eq substr($target,$i,1)) {
				# base[i] == target[i] (char単位)
				$index = $i;
				if (substr($base,$i,1) eq '/') {
					$indexDir = $i;
				}
			}
		}
		# 最後までマッチした場合の処理
		#
		# 片方の次の文字が /	→ foo と foo/〜
		# 両方''				→ foo と foo
		#
		# indexDir最後のディレクトリまで進める
		$indexDir = $length
			if ($index == $length-1
				and (	substr($base,$length,1) eq '/'
					or	substr($target,$length,1) eq '/'
					or	substr($base,$length,1) eq '' && substr($target,$length,1) eq '') );
	
		my $count = (substr($base,$indexDir) =~ s|/| |g);
		return '.' . ('/..' x $count) . substr($target,$indexDir);
	}
	
	1;

トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS