[英]Perl, match one pattern multiple times in the same line delimited by unknown characters
我已經能夠找到類似但不完全相同的問題。 如何在由未知字符分隔的同一行中多次匹配一個正則表達式模式?
例如,假設我想匹配模式HEY。 我想要認識到以下所有方面:
嘿
嘿嘿
HEYxjfkdsjfkajHEY
所以我在那里算了5個HEY。 所以這是我的程序,它適用於除最后一個之外的所有內容:
open ( FH, $ARGV[0]);
while(<FH>)
{
foreach $w ( split )
{
if ($w =~ m/HEY/g)
{
$count++;
}
}
}
所以我的問題是如何替換foreach循環以便我可以識別由未知配置中的奇怪字符分隔的模式(如上例所示)?
編輯:
感謝迄今為止的出色回應。 我剛才意識到我需要另外一件事,我在下面的評論中提到了這一點。
但有一個問題是:有沒有辦法保存匹配的條款? 所以在我的情況下,有沒有辦法引用$ w(比如說正則表達式更復雜,我想將它存儲在具有出現次數的哈希值中)
因此,如果我匹配一個真正的正則表達式(比如一系列字母數字字符)並希望將其保存在哈希中。
一種方法是捕獲字符串的所有匹配項,看看你得到了多少。 像這樣:
open (FH, $ARGV[0]);
while(my $w = <FH>) {
my @matches = $w =~ m/(HEY)/g;
my $count = scalar(@matches);
print "$count\t$w\n";
}
編輯:
就在這里! 只需遍歷所有匹配項,並使用捕獲變量增加哈希中的計數:
my %hash;
open (FH, $ARGV[0]);
while (my $w = <FH>) {
foreach ($w =~ /(HEY)/g) {
$hash{$1}++;
}
}
問題是你真的不想調用split()。 它將事物分成單詞,你會注意到你的最后一行只有一個“單詞”(盡管你不會在字典中找到它)。 一個詞以白色空間為界,因此只是“除了空白之外的所有東西”。
你真正想要的是繼續查看計算每個HEY的每一行,從你每次離開的地方開始。 這需要最后的/ g,但要繼續尋找:
while(<>)
{
while (/HEY/g)
{
$count++;
}
}
print "$count\n";
當然,有不止一種方法可以做到,但這很貼近你的榜樣。 其他人也會發布其他精彩的例子。 向他們學習!
上述答案都不適用於我的類似問題。 $ 1似乎沒有改變(perl 5.16.3)所以$ hash {$ 1} ++將只計算第一場比賽n次。
要獲得每個匹配,foreach需要分配一個局部變量,然后包含匹配變量。 這是一個匹配並打印每個(數字)的腳本。
#!/usr/bin/perl -w
use strict;
use warnings FATAL=>'all';
my (%procs);
while (<>) {
foreach my $proc ($_ =~ m/\((\d+)\)/g) {
$procs{$proc}++;
}
}
print join("\n",keys %procs) . "\n";
我這樣使用它:
pstree -p | perl extract_numbers.pl | xargs -n 1 echo
(除了該管道中的一些相關過濾器)。 任何模式捕獲也應該起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.