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

📄 string.pm

📁 普通的ETL工具
💻 PM
📖 第 1 页 / 共 2 页
字号:
# vim:ts=4 sw=4
# ----------------------------------------------------------------------------------------------------
#  Name		: ETL::Pequel3::Type::Macros::String.pm
#  Created	: 8 May 2006
#  Author	: Mario Gaffiero (gaffie)
#
# Copyright 1999-2007 Mario Gaffiero.
# 
# This file is part of Pequel(TM).
# 
# Pequel is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
# 
# Pequel is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with Pequel; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
# ----------------------------------------------------------------------------------------------------
# Modification History
# When          Version     Who     What
# ----------------------------------------------------------------------------------------------------
require 5.005_62;
use strict;
use warnings;
use vars qw($VERSION $BUILD);
$VERSION = 0.01;
$BUILD = 'Friday September 22 21:19:58 BST 2006';
use ETL::Pequel3::Type::Macros;
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::String::Abstract;
	use base qw(ETL::Pequel3::Type::Macros::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'category', default => 'string');
	use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Trim;
	use base qw(ETL::Pequel3::Type::Macros::String::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'The <&trim()> macro returns I<expr> with the specified leading and trailing I<trim-chars> character(s) removed. If I<trim-chars> is not specified, then the default value is space character.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&trim(E<lt> I<expr> E<gt>, [ E<lt> I<trim-chars> E<gt> ])'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'trim');
	use Class::STL::ClassMembers::Constructor;
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		my $trim_chars = $_[1] || '\s';
		$trim_chars =~ s/['"]//g;
		$c->code("&{sub{");
		$c->over();
		$c->code("my \$tmp=$_[0]; ");
		$c->code("while (\$tmp ne '' && substr(\$tmp, 0, 1) =~ /[$trim_chars]/) ");
		$c->code("{ \$tmp = substr(\$tmp, 1); }");
		$c->code(" while (\$tmp ne '' && substr(reverse(\$tmp), 0, 1) =~ /[$trim_chars]/) ");
		$c->code("{ \$tmp = reverse(substr(reverse(\$tmp), 1)); }");
		$c->code(" \$tmp; ");
		$c->back();
		$c->code("}}");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Length;
	use base qw(ETL::Pequel3::Type::Macros::String::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => ''),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&length(E<lt> I<expr> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'length');
	use Class::STL::ClassMembers::Constructor;
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("length($_[0])");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Substr;
	use base qw(ETL::Pequel3::Type::Macros::String::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'The F<&substr()> macro extracts a substring of length I<length> staring at position I<offset> out of I<expr> and returns it. If I<offset> is negative, counts from the end of the string. If I<length> is omitted, return all characters till the end of string.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&substr(E<lt> I<expr> E<gt>, E<lt> I<offset> E<gt> [, E<lt> I<length> E<gt> ])'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'substr');
	use Class::STL::ClassMembers::Constructor;
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("substr($_[0], $_[1]@{[ defined($_[2]) ? ', ' . $_[2] : '' ]})");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Index;
	use base qw(ETL::Pequel3::Type::Macros::String::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'The F<&index()> macro returns the position of I<substr> in I<expr> at or after I<offset>. If I<substr> is not found, returns -1. If I<offset> is not specified then the search will begin at position 0.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&index(E<lt> I<expr> E<gt>, E<lt> I<substr> E<gt> [, E<lt> I<offset> E<gt> ])'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'index');
	use Class::STL::ClassMembers::Constructor;
	sub translate # field, substr [, offset ]
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("index($_[0], $_[1] @{[ defined($_[2]) ? ', ' . $_[2] : '' ]})");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::RightIndex;
	use base qw(ETL::Pequel3::Type::Macros::String::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'The F<&index()> macro returns the position of B<last> I<substr> in I<expr> at or after I<offset>. If I<substr> is not found, returns -1. If I<offset> is not specified then the search will begin at position 0.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&rindex(E<lt> I<expr> E<gt>, E<lt> I<substr> E<gt> [, E<lt> I<offset> E<gt> ])'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'rindex');
	use Class::STL::ClassMembers::Constructor;
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("rindex($_[0], $_[1] @{[ defined($_[2]) ? ', ' . $_[2] : '' ]})");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Sprintf;
	use base qw(ETL::Pequel3::Type::Macros::String::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns a string resulting from formatting, according to I<format>, the list of values in I<expr>. Please refer to Perl B<sprintf> formats.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&sprintf(E<lt> I<format> E<gt>, E<lt> I<expr> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'sprintf');
	use Class::STL::ClassMembers::Constructor;
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("sprintf(@{[ join(',', @_) ]})");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Lc;
	use base qw(ETL::Pequel3::Type::Macros::String::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the value in I<expr> with all the characters converted to lower-case.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&lc(E<lt> I<expr> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'lc');
	use Class::STL::ClassMembers::Constructor;
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("lc($_[0])");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Uc;
	use base qw(ETL::Pequel3::Type::Macros::String::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the value in I<expr> with all the characters converted to upper-case.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&uc(E<lt> I<expr> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'uc');
	use Class::STL::ClassMembers::Constructor;
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("uc($_[0])");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::LcFirst;
	use base qw(ETL::Pequel3::Type::Macros::String::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the value in I<expr> with the first character converted to lower-case.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&lc_first(E<lt> I<expr> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'lc_first');
	use Class::STL::ClassMembers::Constructor;
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("lcfirst($_[0])");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::UcFirst;
	use base qw(ETL::Pequel3::Type::Macros::String::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the value in I<expr> with the first character converted to upper-case.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&uc_first(E<lt> I<expr> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'uc_first');
	use Class::STL::ClassMembers::Constructor;
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("ucfirst($_[0])");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::LcFirstAbbr;
	use base qw(ETL::Pequel3::Type::Macros::LcFirst);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&lcfirst(E<lt> I<expr> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'lcfirst');
	use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::UcFirstAbbr;
	use base qw(ETL::Pequel3::Type::Macros::UcFirst);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&ucfirst(E<lt> I<expr> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'ucfirst');
	use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::TrimTrailing;
	use base qw(ETL::Pequel3::Type::Macros::String::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'The <&trim()> macro returns I<expr> with the specified trailing I<trim-chars> character(s) removed. If I<trim-chars> is not specified, then the default value is space character.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&trim_trailing(E<lt> I<expr> E<gt>, [ E<lt> I<trim-chars> E<gt> ])'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'trim_trailing');
	use Class::STL::ClassMembers::Constructor;
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		my $trim_chars = $_[1];
		$trim_chars =~ s/['"]//g;	# only remove quotes at start and end
		#return "&{sub{ my \$tmp=$_[0]; \$tmp =~ s/[!@#\$\%^*()+{}\[\]\\:;<>?/]+//g; \$tmp; }}"
		$c->newline_off();
		$c->code("&{sub{");
		$c->code("my \$tmp=$_[0]; ");
		$c->code("while (\$tmp ne '' && substr(reverse(\$tmp), 0, 1) =~ /[$trim_chars]/) ");
		$c->code("{ \$tmp = reverse(substr(reverse(\$tmp), 1)); }");
		$c->code(" \$tmp; ");
		$c->code("}}");
		return $c;

⌨️ 快捷键说明

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