2009-07-08 23 views
0

ABS、TVS、PERLなどのファイルから特定の略語を抽出する必要があります。大文字の略語。私は、通常、これを正規表現で行うのが好きです。どんな助けもありがとうございます。Perlを使用してファイルから略語を抽出するにはどうすればよいですか?

+0

単語が省略形であるかどうかはどのように判断するのですか?あなたが得ることができるすべての略語を持つ別のファイルのように、またはあなたが照会することができるデータベースのような、ある種のデータベースがなければなりません。 – ghostdog74

+0

nieveの実装では、2文字より長いすべての大文字の文字列を省略形として扱うことがあります。 –

+0

もしも、5,6文字以上の長さであれば、それは略語であると疑うでしょうから、上限を追加します; – fortran

答えて

2

未テスト:


my %abbr; 
open (my $input, "<", "filename") 
    || die "open: $!"; 
for (< $input >) { 
    while (s/([A-Z][A-Z]+)//) { 
    $abbr{$1}++; 
    } 
} 

は、少なくとも2つの連続した大文字を探すために、それを修正しました。

+0

これを代用する必要はなく、処理する前にファイル全体を読み込む必要もありません(余分なスペースのためにreadline()ではなくglob()です)。 – ysth

+0

あなたはおそらく正しいですが、エディタはスペースなしでは許可しませんでした。私は "ドル"のシーケンスがスペースなしで切り取られたと思う。 –

+0

あなたが担当していることをエディタに伝える必要があります。 – Telemachus

4

あなたが特に問題を抱えていた部分を聞くのはうれしいことでした。

my $text; 
# Slurp all text 
{ local $/ = undef; $text = <>; } 
# Extract all sequences of 2 or more uppercase characters 
my @abbrevs = $text =~ /\b([[:upper:]]{2,})\b/g; 
# Output separated by spaces 
print join(" ", @abbrevs), "\n"; 

注POSIX文字クラス[の使用:上部テキストは標準入力から検索し、スペースで区切られた標準出力に見出さ すべての略語を、書き込みする読み取り

my %abbr; 
open my $inputfh, '<', 'filename' 
    or die "open error: $!\n"; 
while (my $line = readline($inputfh)) { 
    while ($line =~ /\b([A-Z]{2,})\b/g) { 
     $abbr{$1}++; 
    } 
} 

for my $abbr (sort keys %abbr) { 
    print "Found $abbr $abbr{$abbr} time(s)\n"; 
} 
2
#!/usr/bin/perl 

use strict; 
use warnings; 

my %abbrs =(); 

while(<>){ 
    my @words = split ' ', $_; 

    foreach my $word(@words){ 
     $word =~ /([A-Z]{2,})/ && $abbrs{$1}++; 
    } 
} 

# %abbrs now contains all abreviations 
+0

そこに '$ word =〜'がありません。キックの場合は、 '$ word =〜y/A-Z // cまたは$ abbrs {$ word} ++;'と言うことができます。 – ysth

+0

ありがとう – dsm

+0

私はABCやBAVのような略語を抽出する必要があります。たとえば、私の文書にもABC123、CMV002があります。これは抽出しています...この場合はABCとCMVだけを抽出したいだけです。 .. 手伝って頂けますか? – User1611

3

:]は、一致します すべて大文字だけでなく、英語のもの(AZ)。

+0

先頭と末尾に '\ b'を置きます。 –

+0

良いアイデア、私は私の答えを更新しました。 –

関連する問題