我有一个函数,调用它f,它接受一个字符串并返回一个字符串.
我有一个文件,其行如下所示:
stuff:morestuff:stuff*:otherstuff:otherstuff*\n
冒号只显示为分隔符,*仅出现在每个单词的末尾.我想循环遍历文件并用f(stuff)替换所有东西*.上一行会去
stuff:morestuff:f(stuff):otherstuff:f(otherstuff)\n
我可以在几行中做到这一点,但必须有一种方法可以在一个方面做到这一点.
编辑 要清楚,通过f(stuff),我的意思是f调用"stuff",而不是字符串"f(stuff)".
如果使用e选项,s//那么右手表达式将被评估为代码.所以这很简单:
$line =~ s/([^:]+)\*/f($1)/ge;
Run Code Online (Sandbox Code Playgroud)
打破比赛:
( 开始标记模式的一部分[^:] 除了a之外什么都不是 :+ 表示这些中的一个或多个,即不是冒号的一个或多个字符) 结束标记图案的一部分 $1\* 字面意思是一个 *这种模式依赖于*只出现在每个单词末尾的事实.如果它可能出现在一个字段的中间,你需要稍微调整一下这个模式.
或者,将模式放在一个完整的脚本中:
sub f {
my $word = shift;
$word =~ tr/a-z/A-Z/;
return $word;
}
while (<>) {
s/([^:]+)\*/f($1)/ge;
print;
}
Run Code Online (Sandbox Code Playgroud)