免费注册 查看新帖 |

Chinaunix

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

[文本处理] perl字符串排序去重 [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-06-21 05:59 |只看该作者 |倒序浏览
大家好!
我有一个问题向大家请教。
有两个字符串$all和$new,其中$all有可能是空字符串,也可能是一个或者以空格分隔的多个字符串;$new是一个或多个以空格分隔的字符串。
例如:
$all="ezard.lai bol romeots ntsai thsiao tosian.yang";
$new="chaol jzhu039 thsiao bol xinrong";
现在希望将$new中的内容加入到$all中去,但是将其中重复的内容去掉并排序。
得到以下内容:
"bol chaol ezard.lai jzhu039 ntsai romeots thsiao tosian.yang xinrong"
请问用perl应该如何写?

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2018-06-21 11:09 |只看该作者
回复 1# bikkuri

  1. perl -le '$all="ezard.lai bol romeots ntsai thsiao tosian.yang";
  2. $new="chaol jzhu039 thsiao bol xinrong";
  3. print join " ",grep{!$x{$_}++}sort{$a cmp $b}(split / /,$all." ".$new)'
  4. bol chaol ezard.lai jzhu039 ntsai romeots thsiao tosian.yang xinrong
复制代码

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
3 [报告]
发表于 2018-06-21 18:20 |只看该作者
非常感谢!

回复 2# yinyuemi



论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
4 [报告]
发表于 2018-06-21 23:38 |只看该作者
谢谢您的帮助。
但是我对您的代码做了以下修改后却不能得到期望的结果。
请问是什么原因呢?
#! /usr/bin/perl
sub addnew()
{
$new="chaol jzhu039 thsiao bol xinrong";
$out=join " ",grep{!$x{$_}++}sort{$a cmp $b}(split / /,$all." ".$new);
print "all=$all\n";
print "new=$new\n";
print "out=$out\n\n";
}

$all="";
&addnew($all);
$all="ezard.lai bol romeots ntsai thsiao tosian.yang";
&addnew($all);


以下是执行结果:
[root@apaciprtac:~]# ./addnew.pl
all=
new=chaol jzhu039 thsiao bol xinrong
out= bol chaol jzhu039 thsiao xinrong


all=ezard.lai bol romeots ntsai thsiao tosian.yang
new=chaol jzhu039 thsiao bol xinrong
out=ezard.lai ntsai romeots tosian.yang


第一个all为空值的时候的结果是对的,但是第二个all不为空值时只对原值进行了排序而不但没有把gtac中的值加进去,反而把原值中含有的new元素删除了?

回复 2# yinyuemi



论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
5 [报告]
发表于 2018-06-22 08:30 |只看该作者
回复 4# bikkuri

sub函数要设置接受参数,和返回值另外,变量定义最好用my $var, 尽量不要使用全局变量

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
6 [报告]
发表于 2018-06-22 11:23 |只看该作者
那应该怎么改?
我不会Perl,能帮我改一下吗?

回复 5# yinyuemi



论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
7 [报告]
发表于 2018-06-25 10:45 |只看该作者
Hello Yinyuemi, 能帮我改一下吗?谢谢!
回复 5# yinyuemi



论坛徽章:
0
8 [报告]
发表于 2018-06-25 14:38 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
4
15-16赛季CBA联赛之青岛
日期:2018-07-09 14:17:2815-16赛季CBA联赛之八一
日期:2018-08-06 15:30:0515-16赛季CBA联赛之广东
日期:2018-08-09 09:11:2115-16赛季CBA联赛之佛山
日期:2019-02-14 09:26:31
9 [报告]
发表于 2018-06-25 14:55 |只看该作者
本帖最后由 christmas1102 于 2018-06-25 16:08 编辑
  1. #!/usr/bin/perl
  2. sub addnew{
  3.         my $new='chaol jzhu039 thsiao bol xinrong';
  4.         my $out=join " ",grep{!$x{$_}++}sort{$a cmp $b}(split / /,$all." ".$new);
  5.         undef %x;
  6.         return $out
  7. }

  8. $all='';
  9. print &addnew() . "\n";

  10. $all="ezard.lai bol romeots ntsai thsiao tosian.yang";
  11. print &addnew() . "\n";
复制代码


需要清理 %hash

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
10 [报告]
发表于 2018-06-25 18:50 |只看该作者
非常感谢!

回复 9# christmas1102



您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP