⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 array.pm

📁 普通的ETL工具
💻 PM
📖 第 1 页 / 共 2 页
字号:
	use Class::STL::ClassMembers::Constructor;
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		foreach (@_) { $_ = "&to_array($_)" unless (/^@/); }
		$c->code("(sort{ \$a <=> \$b }grep(/^[\\d|\\.|\\-]+\$/, (@{[ join(',', @_) ]})))[0] || ''");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::ArrMaxNumeric;
	use base qw(ETL::Pequel3::Type::Macros::Array::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the element value in array I<expr> with the highest numeric value.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&arr_max_numeric(E<lt> I<expr> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'arr_max_numeric');
	use Class::STL::ClassMembers::Constructor;
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		foreach (@_) { $_ = "&to_array($_)" unless (/^@/); }
		$c->code("(sort{ \$a <=> \$b }grep(/^[\\d|\\.|\\-]+\$/, (@{[ join(',', @_) ]})))[-1] || ''");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::ArrMin;
	use base qw(ETL::Pequel3::Type::Macros::Array::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the element value in array I<expr> with the lowest value.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&arr_min(E<lt> I<expr> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'arr_min');
	use Class::STL::ClassMembers::Constructor;
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		foreach (@_) { $_ = "&to_array($_)" unless (/^@/); }
		$c->code("(sort (@{[ join(',', @_) ]}))[0] || ''");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::ArrMax;
	use base qw(ETL::Pequel3::Type::Macros::Array::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the element value in array I<expr> with the highest value.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&arr_max(E<lt> I<expr> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'arr_max');
	use Class::STL::ClassMembers::Constructor;
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		foreach (@_) { $_ = "&to_array($_)" unless (/^@/); }
		$c->code("(sort (@{[ join(',', @_) ]}))[-1] || ''");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::ArrLookup;
	use base qw(ETL::Pequel3::Type::Macros::Array::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the I<count> of elements in array I<expr> that match the reqular expression in I<patt>.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&arr_lookup(E<lt> I<patt> E<gt>, E<lt> I<expr> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'arr_lookup');
	use Class::STL::ClassMembers::Constructor;
	sub translate # pattern, field [, field ...]
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		my $patt = shift;
		foreach (@_) { $_ = "&to_array($_)" unless (/^@/); }
		$patt =~ s/['"]//g;
		$c->code("grep(/^$patt\$/, @{[ join(',', @_) ]})");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::ArrUnpack;
	use base qw(ETL::Pequel3::Type::Macros::Array::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Use the pack-format in I<format> to unpack the value in I<expr> to produce an array string with elements delimited by the I<default_list_delimiter> property.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&arr_unpack(E<lt> I<format> E<gt>, E<lt> I<expr> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'arr_unpack');
	use Class::STL::ClassMembers::Constructor;
	sub translate # format, packed_str
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		my $delim = $self->configuration()->default_list_delimiter();
		$#_ > 1 
			? $c->code("join('$delim', unpack($_[0], join('', @{[ join(',', @_[1..$#_]) ]}) ) )")
			: $c->code("join('$delim', unpack($_[0], $_[1] ) )");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::ArrPack;
	use base qw(ETL::Pequel3::Type::Macros::Array::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Use the pack-format in I<format> to pack the array in I<expr> to produce a string containing the packed value.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&arr_pack(E<lt> I<format> E<gt>, E<lt> I<expr> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'arr_pack');
	use Class::STL::ClassMembers::Constructor;
	sub translate # format, array
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		my @orig = @_[1..$#_];
		foreach (@_[1..$#_]) { $_ = "&to_array($_)" unless (/^@/); }
		$_[0] =~ s/['"]//g;
		$_[0] =~ /^\[(.*)\]$/
			? $c->code("pack('$1' x &arr_size(@orig), @{[ join(',', @_[1..$#_]) ]})")
			: $c->code("pack('$_[0]', @{[ join(',', @_[1..$#_]) ]})");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::ArrShift;
	use base qw(ETL::Pequel3::Type::Macros::Array::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'arr_shift');
	use Class::STL::ClassMembers::Constructor;
	sub code_init_global
	{
		my $self = shift;
		my $c = $self->SUPER::code_init_global(@_);
		$c->code("my  \%_ARR_SHIFT; # \&$self->name() ]}()");
		return $c;
	}
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("(@{[ join(',', @_) ]})[\$_ARR_SHIFT{_@{[ $_[0] =~ /^@/ ? substr($_[0], 1) : $_[0] ]}}++]");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::ArrPop;
	use base qw(ETL::Pequel3::Type::Macros::Array::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'arr_pop');
	use Class::STL::ClassMembers::Constructor;
	sub code_init_global
	{
		my $self = shift;
		my $c = $self->SUPER::code_init_global(@_);
		$c->code("my  \%_ARR_POP; # \&$self->name() ]}()");
		return $c;
	}
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate();
		$c->code("(reverse (@{[ join(',', @_) ]}))[\$_ARR_POP{_@{[ $_[0] =~ /^@/ ? substr($_[0], 1) : $_[0] ]}}++]");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::ArrPush;
	use base qw(ETL::Pequel3::Type::Macros::Array::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'arr_push');
	use Class::STL::ClassMembers::Constructor;
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("push($_[0])");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Array;
	use ETL::Pequel3::Type::Extension;
	use base qw(ETL::Pequel3::Type::Extension::Abstract);
	use Class::STL::ClassMembers;
	use Class::STL::ClassMembers::SingletonConstructor;
	sub new_extra
	{
		my $self = shift;
		$self->catalogue()->macros()->push_front(
        	ETL::Pequel3::Type::Macros::ToArray->_new(),
        	ETL::Pequel3::Type::Macros::ArrSize->_new(),
        	ETL::Pequel3::Type::Macros::ArrSort->_new(),
        	ETL::Pequel3::Type::Macros::ArrSortNumeric->_new(),
        	ETL::Pequel3::Type::Macros::ArrReverse->_new(),
        	ETL::Pequel3::Type::Macros::ArrValuesUniq->_new(),
        	ETL::Pequel3::Type::Macros::ArrSum->_new(),
        	ETL::Pequel3::Type::Macros::ArrAvg->_new(),
        	ETL::Pequel3::Type::Macros::ArrMean->_new(),
        	ETL::Pequel3::Type::Macros::ArrFront->_new(),
        	ETL::Pequel3::Type::Macros::ArrBack->_new(),
        	ETL::Pequel3::Type::Macros::ArrFirst->_new(),
        	ETL::Pequel3::Type::Macros::ArrLast->_new(),
        	ETL::Pequel3::Type::Macros::ArrMin->_new(),
        	ETL::Pequel3::Type::Macros::ArrMax->_new(),
        	ETL::Pequel3::Type::Macros::ArrMinNumeric->_new(),
        	ETL::Pequel3::Type::Macros::ArrMaxNumeric->_new(),
        	ETL::Pequel3::Type::Macros::ArrLookup->_new(),
        	ETL::Pequel3::Type::Macros::ArrUnpack->_new(),
        	ETL::Pequel3::Type::Macros::ArrPack->_new(),
#>	       	ETL::Pequel3::Type::Macros::ArrSetAnd->new(),
#>	       	ETL::Pequel3::Type::Macros::ArrSetOr->new(),
#>	       	ETL::Pequel3::Type::Macros::ArrSetXor->new(),
#?        	ETL::Pequel3::Type::Macros::ArrShift->new(),
#?        	ETL::Pequel3::Type::Macros::ArrPop->new(),
#?        	ETL::Pequel3::Type::Macros::ArrPush->new(),
#>			ArrResize(array, newsize) -- truncate array
#>			ArrShift(array, n) -- This function returns a new valarray object whose elements have all been rotated n places to left or right with respect to self. A positive value of n shifts the elements to the left, a negative value to the right. For example, applying shift(2) to an array corresponding to [3,4,5,6] results in [5,6,3,4], and applying shift(-1) to [3,4,5,6] results in [6,3,4,5].
#>			ArrRotate -- alternate name for ArrShift
#>			ArrApply(<macro_name>, array) -- returns array with all elements applied to <macro_name>
#>			ArrBindFirst(<macro_name>, array, arg), ArrBindSecond
#<			ETL::Pequel3::Type::Macros::ArrPeek->new,			# return last element in array
#>			ETL::Pequel3::Type::Macros::ArrAvgDistinct->new,	# return average for distinct values in array
#>			ETL::Pequel3::Type::Macros::ArrSumDistinct->new,	# return sum for distinct values in array
#>			ETL::Pequel3::Type::Macros::ArrSelect->new,	# or ArrFilter: &arr_select(<field>, <value|/regex/>)
#>			ETL::Pequel3::Type::Macros::ArrDistinct->new,		# return count of distinct values
#>			ETL::Pequel3::Type::Macros::ArrMedian->new,
#>			ETL::Pequel3::Type::Macros::ArrVariance->new,
#>			ETL::Pequel3::Type::Macros::ArrStddev->new,
#>			ETL::Pequel3::Type::Macros::ArrRange->new,
#>			ETL::Pequel3::Type::Macros::ArrMode->new,
#>			ETL::Pequel3::Type::Macros::ArrLongest->new,		# return longest string in array
#>			ETL::Pequel3::Type::Macros::ArrShortest->new,		# return longest string in array
#>			ETL::Pequel3::Type::Macros::ArrWidthBucket,
#>			ETL::Pequel3::Type::Macros::ArrNtile,
#>			ETL::Pequel3::Type::Macros::ArrRank,
#>			ETL::Pequel3::Type::Macros::ArrCorr,
#>			ETL::Pequel3::Type::Macros::ArrCumeDist,
#>			ETL::Pequel3::Type::Macros::ArrCovarPop,
#>			ETL::Pequel3::Type::Macros::ArrCovarSamp,
#>			ETL::Pequel3::Type::Macros::ArrPercentRank,
#>			ETL::Pequel3::Type::Macros::ArrPercentileCont,
#>			ETL::Pequel3::Type::Macros::ArrPercentileDisc,
		);
		return $self;
	}
}
# ----------------------------------------------------------------------------------------------------
1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -