CPerlString - 用于利用 Perl 字符串函数的类






4.11/5 (5投票s)
2001年11月23日
3分钟阅读

155896

1430
一个用于利用 Perl 字符串函数的类

引言
字符串操作和正则表达式一直是 Perl 的强项。C 语言功能强大,但进行字符串操作和正则表达式比较困难。尽管有像 PCRE 这样的库可以在 C 中模拟 Perl 的正则表达式,但我发现它们很难使用。所以我认为,最好的方法是在 C 中嵌入 Perl。
在 Perl 文档的帮助下,我成功创建了两个类来封装 Perl 中一些最有用的函数。一个类用于 MFC 用户 (CPerlString.h),另一个类用于非 MFC 用户 (PerlString.h)。封装的函数有:
- 模式匹配
- 字符串替换
- 将数组连接成一个字符串
- 将字符串分割成一个数组
- 排序(正序或逆序)
- Chop (删除字符串的最后一个字符)
- Chomp (删除字符串末尾的换行符)
我将讨论 MFC 类的用法。非 MFC 类类似,但它使用 STL 的 string
和 vector<string>
而不是 CString
和 CStringArray
。
I32 CPerlString::Match (CString inputString, CString pattern)
I32 CPerlString::Matches (CString inputString, CString pattern, CStringArray &matchList)
Match 和 Matches 是两个使用 Perl 模式匹配功能的函数。基本上,Match 发送 Perl 的语句: inputString =~ pattern,而 Matches 发送 Perl 的语句: matchList = (inputString =~ pattern)
。如果找到模式,Match 将返回 1,如果未找到模式,则返回 0。Matches 将返回匹配的数量。
CPerlString perl; CString inputString = "Hello World!"; CString pattern1 = "/Hello/"; CString pattern2 = "/(.o)/g"; CStringArray matchList; if (perl.Match(inputString, pattern1)) printf("Pattern found\n"); else printf("Pattern not found\n"); int num_matches = perl.Matches(inputString, pattern2, matchList); printf("%d matches\n", num_matches); if (num_matches > 0) { for (int i = 0; i < matchList.GetSize(); i++) printf("Match %d: %s\n", i+1, matchList.GetAt(i));
I32 Substitute(CString &inputOutputString, CString pattern)
Substitute 是一个使用 Perl 字符串替换功能的函数。基本上它发送:inputOutputString =~ pattern。如果完成了替换,Substitute 将返回 1,如果没有完成替换,则返回 0。
CPerlString perl; CString inputOutputString = "Hello World!"; CString pattern1 = "s/Hello/Hello Happy/"; perl.Substitute(inputOutputString, pattern1); printf("%s\n", inputOutputString);
void Join(CStringArray &inputStringList, CString pattern, CString &outputString)
Join 是一个使用 Perl 连接功能的函数。它发送: outputString = join (pattern, inputStringList)
。Join 不会返回任何值。
CPerlString perl; CString outputString; CString pattern1 = " "; CStringArray inputStringList; inputStringList.Add("Hello"); inputStringList.Add("Happy"); inputStringList.Add("World"); perl.Join(inputStringList, pattern1, outputString); printf ("%s\n", outputString);
I32 Split(CString inputString, CString pattern, CStringArray &splitList)
Split 执行 Perl 的语句: splitlist = split (pattern, inputString)
。它返回分割项目的数量。
CPerlString perl; CString inputString = "Hello Happy World!"; CString pattern1 = "/\\s/"; CStringArray splitList; int num_split = perl.Split(inputString, pattern1, splitList); printf("%d split\n", num_split); if (num_split > 0) { for (int i = 0; i < splitList.GetSize(); i++) printf("Split %d: %s\n", i+1, splitList.GetAt(i));
void Sort(CStringArray &inputStringList, CStringArray &outputStringList, int Direction = 0)
Sort 通过发送以下内容对数组进行排序:如果 direction 为 0,则 outputStringList = sort (inputStringList)
;如果 direction 不为 0(例如 1),则 outputStringList = reverse sort (inputStringList)
。Sort 不会返回任何值。
CPerlString perl; CStringArray inputStringList, outputStringList; inputStringList.Add("Hello"); inputStringList.Add("Happy"); inputStringList.Add("World"); perl.Sort(inputStringList, outputStringList); // Forward sort for (int i = 0; i < outputStringList.GetSize(); i++) printf("%s\n", outputStringList.GetAt(i)); perl.Sort(inputStringList, outputStringList, 1); // Reverse sort for (int i = 0; i < outputStringList.GetSize(); i++) printf("%s\n", outputStringList.GetAt(i));
void Chomp(CString &inputOutputString)
void Chomp(CStringArray &inputOutputStringList)
void Chop(CString &inputOutputString)
void Chop(CStringArray &inputOutputStringList)
Chop 和 Chomp 是两个执行 Perl 的 chop 和 chomp 的函数。它们被重载以处理字符串和字符串数组。相应的 Perl 语句是: chomp (inputOutputString)
或 chomp (inputOutputStringList)
或 chop (inputOutputString)
或 chop (inputOutputStringList)
。
CPerlString perl; CString inputOutputString = "Hello World!"; CStringArray inputOutputStringList; inputOutputStringList.Add("Hello"); inputOutputStringList.Add("Happy"); inputOutputStringList.Add("World"); perl.Chop(inputOutputString); printf("%s\n", inputOutputString); perl.Chop(inputOutputStringList); for (int i = 0; i < inputOutputStringList.GetSize(); i++) printf("%s\n", inputOutputStringList.GetAt(i));
用法
要使用这两个类,您需要在您的项目中包含它们,通过添加语句
#include "CPerlString.h"
或
#include "PerlString.h"
您还需要有 Perl 的核心库。这将在您安装 Perl 的目录中找到。例如,如果您将 Perl 安装在 C:\Perl 中,则核心库将在 C:\Perl\lib\CORE 中找到。您需要将此目录设置为 Visual C++ 的默认包含和库目录之一。这可以通过 工具->选项->目录,并在“包含文件”和“库文件”部分中添加 C:\Perl\lib\CORE 来完成。
演示
演示程序演示了上述函数的使用,除了 chomp 和 chop。它可以用来帮助测试您的正则表达式模式。
历史
2002年3月6日 - 更新的源文件。
2002年9月1日 - 修复内存泄漏。更新的源文件