我假設某種正則運算式將用于完成此操作?
我需要在每個單詞包含 2 個或更多字符的情況下獲取它,以字母開頭,其余字符由字母、數字和下劃線組成。
這是我目前擁有的代碼,雖然它不是很接近我想要的輸出:
while (my $line=<>) {
# remove leading and trailing whitespace
$line =~ s/^\s |\s $//g;
$line = lc $line;
@array = split / /, $line;
foreach my $a (@array){
$a =~ s/[\$#@~!&*()\[\];.,:?^ `\\\/] //g;
push(@list, "$a");
}
}
示例輸入將是:
#!/usr/bin/perl -w
use strict;
# This line will print a hello world line.
print "Hello world!\n";
exit 0;
所需的輸出將是(按字母順序):
bin
exit
hello
hello
line
perl
print
print
strict
this
use
usr
will
world
uj5u.com熱心網友回復:
my @matches = $string =~ /(\b[a-z][a-z0-9_] )/ig;
如果不區分大小寫的操作只需要應用于子模式,可以嵌入它
/... ((?i)\b[a-z][a-z0-9_] ) .../
(或者,可以在子模式之后關閉,(?i)pattern(?-i))
如果確實需要的話,那就是“[a-zA-Z0-9_]單詞\w字符” 。
上面的正則運算式根據需要選擇單詞,而不需要先在空間上分割行,在所示程式中完成。可以在整行(或整個文本)上應用它,也許在所示的各種特殊字符的剝離之后。?
還有一些其他情況的問題 - 連字符怎么樣?撇號?代字號?這些在識別符號中找不到,雖然這似乎是為了處理編程文本,但包含注釋;可能還有哪些其他合法字符?
關于split空格的注意事項
所示的split / /, $line分割恰好在那個空間上。更好的是split /\s /, $line——或者,更好的是使用split's 的特殊模式split ' ', $line:分割任意數量的任意連續空白,并且丟棄前導和尾隨空格。
? 所示示例僅由給定的正則運算式根據需要正確處理
use strict;
use warnings;
use feature 'say';
use Path::Tiny qw(path); # convenience, to slurp the file
my $fn = shift // die "Usage: $0 filename\n";
my @matches = sort map { lc }
path($fn)->slurp =~ /(\b[a-z][a-z0-9_] )/ig;
say for @matches;
我進行了排序和小寫以匹配問題中的示例代碼,但所有處理都是使用字串中檔案內容上顯示的正則運算式完成的。
輸出是所希望的(除了line這里world來兩次,什么是正確的)。
注意,lc可以應用在帶有檔案內容的字串上,然后用正則運算式處理,這樣效率更高。雖然在這種情況下原則上并不相同,但它可能是
perl -MPath::Tiny -wE'$f = shift // die "Need filename\n";
@m = sort lc(path($f)->slurp) =~ /(\b[a-z]\w )/ig;
say for @m'
這里我實際使用了\w. 如果不同,請調整到要匹配的實際字符。
uj5u.com熱心網友回復:
奇怪的是,這可以用那些長的、典型的 Perl 單行代碼之一來完成
$ perl -lwe'print for sort grep /^\pL/ && length > 1, map { split /\W / } map lc, <>' a.txt
bin
exit
hello
hello
line
line
perl
print
print
strict
this
use
usr
will
world
world
讓我們來看看我們能學到什么。此行從右到左讀取。
a.txt是要讀取的引數檔案<>是菱形運算子,從檔案中讀取行。由于這是串列背景關系,它將耗盡檔案句柄并回傳所有行。map lc, 縮寫map { lc($_) }將在所有行上應用該lc函式并回傳結果。map { split /\W / }是一種多用途操作。它將洗掉不需要的字符(非單詞字符),并在那里拆分行,并回傳所有這些單詞的串列。grep /^\pL/ && length > 1排序以字母開頭\pL且長度大于 1 的字串并回傳它們。sort按字母順序對從右側傳入的串列進行排序,然后將其回傳左側for是一個 for 回圈,應用于傳入串列,采用 post-fix 樣式。print是 的縮寫print $_,它將為 for 回圈中的每個串列項列印一次。- perl 命令中的
-l開關將為我們“修復”行尾(從輸入中洗掉它們,在輸出中添加它們)。這將使列印在最后變得漂亮。
我不會說這會產生完美的結果,但你應該能夠掌握一些技巧來完成你自己的程式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/451564.html
