向 chat.deepseek.com 提问:请将这个 python 脚本翻译为 perl 语言脚本
参阅:Python 调用 DeepSeek API 完整指南
将 Python 脚本翻译为 Perl 语言脚本时,需要注意两种语言之间的语法差异。以下是将给定的 Python 脚本翻译为 Perl 的版本: test_deepseek_v1.pl
perl
use strict;
use warnings;
use utf8;
use JSON;
use LWP::UserAgent;
use HTTP::Request::Common;
use POSIX qw(strftime);
use Encode qw(encode decode);
# 保存对话内容到文件
sub save_to_file {
my ($file, $content, $is_question) = @_;
my $timestamp = strftime("%Y-%m-%d %H:%M:%S", localtime);
if ($is_question) {
print $file "\n[$timestamp] Question:\n$content\n\n[$timestamp] Answer:\n";
} else {
print $file $content;
}
}
# 主函数
sub main {
# 配置
my $url = "https://api.siliconflow.cn/v1/chat/completions";
my $headers = {
"Content-Type" => "application/json",
"Authorization" => "Bearer YOUR_API_KEY" # 替换为你的 API Key
};
# 打开文件用于保存对话
open(my $file, '>>:encoding(UTF-8)', "conversation.txt") or die "无法打开文件: $!";
while (1) {
# 获取用户输入
print "\n请输入您的问题 (输入 q 退出): ";
my $question = <STDIN>;
chomp($question);
$question =~ s/^\s+|\s+$//g;
if (lc($question) eq 'q') {
print "程序已退出\n";
last;
}
# 保存问题
save_to_file($file, $question, 1);
# 准备请求数据
my $data = {
"model" => "deepseek-ai/DeepSeek-V3",
"messages" => [
{
"role" => "user",
"content" => $question
}
],
"stream" => JSON::true,
"max_tokens" => 2048,
"temperature" => 0.7,
"top_p" => 0.7,
"top_k" => 50,
"frequency_penalty" => 0.5,
"n" => 1,
"response_format" => {
"type" => "text"
}
};
my $ua = LWP::UserAgent->new;
my $request = POST($url, $headers, Content => encode_json($data));
try {
# 发送流式请求
my $response = $ua->request($request);
if ($response->is_success) {
# 处理流式响应
my @lines = split /\n/, $response->decoded_content;
foreach my $line (@lines) {
if ($line) {
if ($line =~ /^data: /) {
if ($line eq 'data: [DONE]') {
next;
}
my $json_str = substr($line, 6); # 去掉 'data: ' 前缀
my $content = decode_json($json_str);
if ($content->{choices}[0]{delta}{content}) {
my $chunk = $content->{choices}[0]{delta}{content};
print $chunk;
print $file $chunk;
$file->flush();
}
}
}
}
# 添加分隔符
print "\n----------------------------------------\n";
print $file "\n----------------------------------------\n";
$file->flush();
} else {
die "请求失败: " . $response->status_line;
}
} catch {
my $error_msg = "请求错误: $_\n";
print $error_msg;
print $file $error_msg;
$file->flush();
}
}
close($file);
}
# 执行主函数
main();
运行 cmd
chcp 65001
perl test_deepseek_v1.pl
说明:
-
模块导入 :Perl 使用
use
来导入模块,例如use JSON;
和use LWP::UserAgent;
。 -
文件操作 :Perl 使用
open
和close
来打开和关闭文件。 -
JSON 处理 :Perl 使用
JSON
模块来处理 JSON 数据。 -
HTTP 请求 :Perl 使用
LWP::UserAgent
来发送 HTTP 请求。 -
异常处理 :Perl 使用
try
和catch
来处理异常(需要Try::Tiny
模块,但在这个例子中简化了异常处理)。 -
流式处理:Perl 通过逐行处理响应内容来模拟流式处理。
注意事项:
-
Perl 的
try
和catch
语法需要Try::Tiny
模块,如果没有安装,可以使用eval
来替代。 -
Perl 的
print
和flush
操作与 Python 类似,但需要显式调用flush
来确保数据写入文件。