2
我需要使用perl對散列鍵進行排序,我還需要允許key中的重複。所以我打算檢查exists
方法perl
如果它存在然後我增加最後一位數然後我將存儲到哈希。 我嘗試下面的代碼:使用perl進行散列鍵排序?
use strict;
use warnings;
use iPerl::Basic qw(_save_file _open_file);
my $xml = $ARGV[0];
my ($xmlcnt,$backcnt,$refcnt,$name,$year) = "";
my %sort =();
if(($#ARGV != 0) or(not -f "$xml") or($xml!~ m{\.xml$}i)){
print_exit("\t\tSYSTAX ERROR: <EXE> <xml File>\n\n")
};
$xmlcnt=_open_file($xml);
$xmlcnt =~ s{<back(?: [^>]+)?>(?:(?!</?back[ >]).)*</back>}{
$backcnt = $&;
while($backcnt =~ m{<ref(?: [^>]+)?>(?:(?!<ref[ >]).)*</ref>}igs){
$refcnt = $&;
$name = $1 if($refcnt =~ m{<person-group(?: [^>]+)?>((?:(?!</?person-group[ >]).)*)</person-group>}is);
$year = $1 if($refcnt =~ m{<year>((?:(?!</?year[ >]).)*)</year>}is);
$name =~ s{</?(?:string-name|surname|given-names)>}{}ig;
my $count = 1;
my $keys="$name $year\E$count";
if(exists ($sort{$keys})){
$keys =~ s{(\d)$}{my $icr=$1;$icr++;qq($icr)}e;
#print"$keys\n";
$sort{$keys}="$refcnt";
}
else
{
$sort{$keys}="$refcnt";
}
print join("\n",keys %sort);
}
qq($backcnt)
}igse;
my @keys = sort {
$sort{$a} <=> $sort{$b}
# or
# "\L$a" cmp "\L$b"
} keys %sort;
# print join("\n",@keys);
sub print_exit {
my $msg = shift;
#print "\n$msg";
exit;
}
請誰能告訴我出了什麼錯在這裏?
輸入:
thieooieroh
apple
apple
highefhfe
bufghifeh
輸出:
apple
apple
bufghifeh
highefhfe
thieooieroh
預先感謝。
哎唷!我的眼睛!替換命令替換部分中的25行塊可執行代碼殘酷地可怕!我甚至不想看它;真是太可怕了。如果您必須執行代碼,請將其放入函數中,並使用substitute命令調用該函數。 –
這裏他們使用替代,希望在散列鍵中存儲文本。問題是如果文本已經存在於文本末尾,則爲重複值添加整數,然後最後對鍵進行排序。 – depsai
請勿使用正則表達式來分析xml。永遠。看看'死亡'。這是你的'print_exit'的正確替代。出於性能原因,你應該避免'$&'(你可以,如果你引入一個匹配組並使用'$ 1')。簡單的散列可能是錯誤的數據結構。你可以使用數組的散列。 –