2013-01-22 51 views
-1

我试图从排序文件中的字母A到Z 例如:a AB DRG 排序:A A B DGRPERL:排序从A字母A到Z

@ARGV == 2 or die "Usage: $0 infile outfile\n"; 
open $old, '<', $ARGV[0] or die $!; 
open $new, '>', $ARGV[1] or die $!; 
@mass=<$old>; 
@array=qw(@mass); 
@sort=sort @array; 
@mass1=sort {uc $a cmp uc $b} @sort; 
print $new @mass1; 

我要去哪里错误?

+0

你想对信件或文字进行分类吗?你的输入文件包含什么内容?像“A B d r g”这样的东西?如果是这样,它包含多行? – Faiz

+0

我有一个包含文字和字母的文件,所以我必须按字母排序 – PYPL

+0

因此'ba ab a'应该像'a ab ba'一样变成? – Faiz

回答

2

我不确定您打算如何处理qw,但 就足以说明将不会使用@mass的内容。

@array = qw(hello world); 

会造成@array被定义为包含2个helloworld。这是刚刚简写:

@array = ('hello', 'world'); 

这就是为什么

@array=qw(@mass); 

则计算结果为('@mass') - 用5个字符@mass单一的文字字符串数组。

也许这就是你做错了。如果您尝试

@array = map { split /\s+/} @mass; 

@mass是行列表。每行有空格分隔的单词或只是字母。这将每个 线像'ba ab a G'分成列表('ba', 'ab', 'a', 'G')@array将 成为字/字母一个列表 - 什么最后一行所做的就是以split /\s+/每一行映射。

然后,这是一个你想如何排序的问题。另请参阅其他答案。

哦,记得把后面的空间,当你写出你的文件:

print $new (join " ", @mass1); 

如果你想在每行被相互依赖对方的排序,这是一件容易的事:

$mass1 = join "\n", map { join " ", sort (split /\s+/) } @mass 

这表示'对于@mass中的每一行,在空间上分割,按空格重新排序并返回',并使用结果数组加入newline以产生文件的输出。

注意,您可以在sort用比较喜欢滴等sort { $a cmp $b }

如果你的文件过大,则循环也许是谨慎的:

for my $mass (<$old>) { 
    my $sorted_line = join " ", sort (split /\s+/, $mass); 
    print $new "$sorted_line\n"; 
} 
+0

注意到它正在删除所有行并将所有内容写入1行 – PYPL

+0

您必须尽可能具体。如果你有多行文字,并且希望它们被排序,那么你可以:(a)希望每行独立排序;或者(b)希望将整个文件中的所有单词排序为一组。不是(b)意味着你会得到没有行的输出!所以我认为你想要(a)不是(b)? – Faiz

+0

我想分类整个文件,所以也许可以通过循环文件来完成? – PYPL

3

我不认为你明白标准文本排序是基于ASCII的。因为所有大写字母都是小写字母,所以输入也是如此。因此,您直接订购sort将为('A', 'B', 'a', 'd', 'g', 'r')

你想比较两个字符串。在这种情况下,你将需要传递一个例程进行排序。

@sort= sort { lc $a cmp lc $b or $a cmp $b } @array; 
1

您需要找到正确的LOCALE才能使用,以便所有函数(排序等)使用的顺序都使用正确的语言环境并对其进行相应排序。

请参阅this page showing most of the variables defining locales,然后查找LANG和LC_ALL。和LC_COLLATE(我不得不承认我不太确定哪个是在什么时候使用的,LC_ALL应该优先于其他的,所以这是你可以改变所有LC_ *值设置...请测试,ymmv)

我相信你可能需要使用其中一个unicode语言环境。 Ascii不会做你想做的事情,因为CAPS在ascii中定期发信之前。

要找出哪些区域设置可以使用:locale -a

要查看哪些区域设置您的当前设置为:locale(用户和系统范围值是可能的)

你可能需要包含一些“UTF -8" 有你求

然后顺序:(例如如果是en_US.UTF-8可):

只是用它的排序,确定要使用的语言环境排序前:

LC_ALL=en_US.UTF-8 

(或任何你需要它的设定,可如图“区域设置-a”的值)

(保存/如果你需要恢复周围调用先前的值)

在shell中,您可能最好希望对那些重新定义的变量进行“导出”,以确保子shell也使用新值(如:something | sort:在bash中,sort将位于子shell中,因此使用默认值LC_ *的值,或者如果导出它,则使用导出的值!)