-1

在我的 Perl 程序中,我正在获取一封加密的电子邮件,对其进行解码并进一步处理。我面临一个问题,因为数据包含:%localappdata% 我无法直接使用 qw() 函数,因为数据是从邮箱中获取的。有没有办法应用这个功能?如何使用它才能使特殊字符不被识别为特殊字符而是普通字符?或者是否有正则表达式可以这样做?

更新:我正在做的处理是将数据转换为 HTML 并使用 Curl 将其发送到 REST API。

更新 2:这是代码:https $description ://gist.github.com/8cd801fedeb90a5ca7fc包含%localappdata%

4

2 回答 2

2

好的,感谢您显示完整的代码。问题是您将 的内容$body作为 URL 参数传递,因此 HTTP 协议需要转义各种字符才能正确传递它们。

您可以使用该模块来实现这一点URI::Escape,并且您将不再需要像在第 125 行和后面的行中那样进行清理# clean the body

该程序使用包含您已识别的所有问题字符的字符串,并使用模块对其进行翻译。如果uri_escape在将内容$body附加到 Curl 的 URL 之前使用它,那么一切都应该正常工作。

use strict;
use warnings;

use URI::Escape 'uri_escape';

my $body = '%localappdata% â & ';

print uri_escape $body;

输出

%25localappdata%25%20%E2%20%26%20

更新

对于一般的 URL 操作,最好使用该URI模块,该模块将为您在 URL 的路径和查询部分进行所有必要的转义。

下面的程序显示了如何$curl->setopt使用此方法生成您需要传递给的 URL

use strict;
use warnings;

use URI;

my $url = URI->new('https://this/is/the/url');
my $body = '%localappdata% â & ';

$url->query_form(body => $body);
print $url, "\n";

输出

https://this/is/the/url?body=%25localappdata%25+%E2+%26+

(请注意,此方法使用空格字符+而不是%20空格字符。在 URL 的查询部分中任何一个都可以接受。)

这个 URL 可以通过写直接设置为 Curl 选项

$curl->setopt(CURLOPT_URL, $url);
于 2012-07-13T17:41:17.770 回答
-1

要转义某些内容,请使用正则表达式来处理您的数据:

my $email = "To: foo@example.com\n\nHi Rad,\nI just opened %appdata% and...";
$email =~ s/ % /\\%/xg; # escapes all percent signs

这将替换%appdata%\%appdata\%. 我不知道您的 API 如何喜欢它的输入数据,请相应调整。

编辑:您将标量 $description 放入 URL(Git 第 30 和 41 行)!百分号是那里的转义字符!因此,只需s/%/%%/g对您放入任何 url 的任何数据进行操作,然后永远快乐 :)

于 2012-07-13T15:56:07.950 回答