65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.11/5 (5投票s)

2001年11月23日

3分钟阅读

viewsIcon

155896

downloadIcon

1430

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

Sample Image - CPerlString.gif  

引言

字符串操作和正则表达式一直是 Perl 的强项。C 语言功能强大,但进行字符串操作和正则表达式比较困难。尽管有像 PCRE 这样的库可以在 C 中模拟 Perl 的正则表达式,但我发现它们很难使用。所以我认为,最好的方法是在 C 中嵌入 Perl。

在 Perl 文档的帮助下,我成功创建了两个类来封装 Perl 中一些最有用的函数。一个类用于 MFC 用户 (CPerlString.h),另一个类用于非 MFC 用户 (PerlString.h)。封装的函数有:

  1. 模式匹配
  2. 字符串替换
  3. 将数组连接成一个字符串
  4. 将字符串分割成一个数组
  5. 排序(正序或逆序)
  6. Chop (删除字符串的最后一个字符)
  7. Chomp (删除字符串末尾的换行符)

我将讨论 MFC 类的用法。非 MFC 类类似,但它使用 STL 的 stringvector<string> 而不是 CStringCStringArray

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日 - 修复内存泄漏。更新的源文件

© . All rights reserved.