免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3600 | 回复: 4
打印 上一主题 下一主题

[转]perl使用LWP模块写的翻译小程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-11 10:20 |只看该作者 |倒序浏览
本帖最后由 paktc 于 2014-01-11 10:22 编辑

原文地址:http://www.cnblogs.com/caibird/archive/2013/03/22/2974999.html
作者:第2012位菜鸟
  1. #! /usr/bin/perl
  2. #学习perl LWP时用post做的翻译小脚本
  3. #调用的是有道词典
  4. use strict;
  5. use warnings;
  6. use LWP::UserAgent;
  7. use JSON ;
  8. #use Data::Dumper;

  9. my $browser = LWP::UserAgent->new();
  10. print "Please input the word:";
  11. chomp (my $input = <STDIN>);
  12. my $response = $browser->post(
  13. #    'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=https://www.google.com.hk/',
  14.     'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null',
  15.     [
  16.         'type' => 'AUTO',
  17.         'i' => "$input",
  18.         'doctype' => 'json',
  19.     ],
  20.     );

  21. if($response->is_success){
  22.     my $result = $response->content;
  23.     my $json = new JSON;
  24.     my $obj = $json->decode($result);
  25.     #print Dumper $obj;
  26.     my $trans = @{$obj->{'translateResult'}[0]}[0]->{"tgt"};
  27.     $trans = "翻译结果:$trans" if $trans;
  28.     my $string;
  29.     eval{
  30.         $string  = join " ", @{$obj->{'smartResult'}->{"entries"}};
  31.     };
  32.     $trans = "$trans\n其他结果:$string" if $string;
  33.     print $trans."\n" // "Not found\n";
  34. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2014-01-11 10:22 |只看该作者
本帖最后由 paktc 于 2014-01-11 13:12 编辑

在windows用cmd,改了一下,信息重新编码为CP936规范再输出:
  1. #! /usr/bin/perl
  2. # 学习perl LWP时用post做的翻译小脚本
  3. # 调用的是有道词典
  4. # 作者:第2012位菜鸟
  5. # 原文链接 http://www.cnblogs.com/caibird/archive/2013/03/22/2974999.html

  6. use strict;
  7. use warnings;
  8. use LWP::UserAgent;
  9. use JSON ;
  10. use Encode;
  11. #use Data::Dumper;

  12. binmode(STDOUT,':encoding(CP936)');

  13. my $browser = LWP::UserAgent->new();
  14. print "Please input the word:";
  15. chomp (my $input = <STDIN>);
  16. my $response = $browser->post(
  17. #    'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=https://www.google.com.hk/',
  18.     'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null',
  19.     [
  20.         'type' => 'AUTO',
  21.         'i' => "$input",
  22.         'doctype' => 'json',
  23.     ],
  24.     );

  25. if($response->is_success){
  26.     my $result = $response->content;
  27.     my $json = new JSON;
  28.     my $obj = $json->decode($result);
  29.     #print Dumper $obj;
  30.     my $trans = @{$obj->{'translateResult'}[0]}[0]->{"tgt"};
  31.     my $string;
  32.     eval{
  33.         $string  = join " ", @{$obj->{'smartResult'}->{"entries"}};
  34.     };

  35.     my $say1="\x{7ffb}\x{8bd1}\x{7ed3}\x{679c}\x{ff1a}";
  36.     my $say2="\x{5176}\x{4ed6}\x{7ed3}\x{679c}\x{ff1a}";
  37.     $trans=decode('UTF-8',$trans) if $trans;
  38.     $string=decode('UTF-8',$string) if $string;

  39.     print $say1, $trans, "\n", $say2, $string, "\n";
  40. }
  41. <STDIN>;
复制代码

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
3 [报告]
发表于 2014-01-11 16:24 |只看该作者
大神~ 膜拜一个,太感谢了。{:2_172:}
这个比较茫然望指点
  1.     my $string;
  2.     eval{
  3.         $string  = join " ", @{$obj->{'smartResult'}->{"entries"}};
  4.     };
复制代码
我认为这就可以了。
  1.     my $string = join " ", @{ $obj->{'smartResult'}->{"entries"} };
复制代码

论坛徽章:
0
4 [报告]
发表于 2014-01-11 16:42 |只看该作者
回复 3# pitonas


    eval的话如果不成功 $string 就会变成未定义吧?
   

后面不是有一句:    print $trans."\n" // "Not found\n";
如果$trans和$string 都未定义,那么结果显示为“not found”。
前面的几句  if $trans  if $string 也都是层层相扣的。

目测是这个原因,没有具体实践。

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
5 [报告]
发表于 2014-01-11 16:53 |只看该作者

挺有意思的
  1.         my $string = join " ", @{ $obj->{'smartResult'}->{"entries"} };
复制代码
input: abble
输出:Can't use an undefined value as an ARRAY reference

这就可以了。
  1.     my $string = join " ", @{ $obj->{'smartResult'}->{"entries"} || [] };
复制代码
输出:
翻译结果:abble
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP