我有一行看起来像这样:
(ABCD)(ABCDE)(ABCDEF)(ABCDEFG)
但我希望像这样存储它:
ABCDABCDEABCDEFABCDEFG
在一个名为parser的变量中。我正在使用的代码是
my ($parser) = $subckt =~ m/\s*(\(.*?)\);
这里$subckt
变量用括号存储实际行。
如何在变量$parser
中获取所需数据。
请帮忙。
谢谢
答案 0 :(得分:2)
翻译运算符tr
是您所需要的。使用/d
(删除)修饰符,您可以删除列表中没有相应替换的所有字符。
如果你有Perl 5的14或更高版本,那么/r
(非破坏性)修饰符会使它更加整洁。
该程序演示
use 5.014;
my $subckt = '(ABCD)(ABCDE)(ABCDEF)(ABCDEFG)';
my $parser = $subckt =~ tr/()//dr;
print $parser;
<强>输出强>
ABCDABCDEABCDEFABCDEFG
答案 1 :(得分:2)
只需使用:
$subckt =~ s/[()]//g;
答案 2 :(得分:1)
如果您只想删除标题所示的括号,
替换运算符s///
是自然选择:
my $subckt = '(ABCD)(ABCDE)(ABCDEF)(ABCDEFG)';
my $parser = $subckt;
$parser =~ s/[()]//g;
也就是说,要猜测你真正想要做什么以及你有什么样的可能输入是有点困难的。
基于帖子中破坏的正则表达式,也许你真正想要的是改变\s*\(X\)
到X
的模式。如果是这种情况,那么使用与捕获组匹配的匹配将更容易,而不是替换,类似于您似乎尝试过的方式:
my $subckt = '(ABCD)(ABCDE)(ABCDEF)(ABCDEFG)';
my ($parser) = join('', $subckt =~ m/\s*\((.*?)\)/g);
这也适用于这样的输入:
my $subckt = ' (ABCD) (ABCDE)(ABCDEF)(ABCDEFG)';
这种方式有效:
m/...(...).../g
返回(...)
(
和)
中的内容,因此表达式实际上应该看起来像m/...\((...)\).../g
,请注意\(
和{{1}在\)
捕获(...)
标志很重要(在您的标签中丢失),否则模式匹配将在第一场比赛后停止答案 3 :(得分:1)
初始化新变量,然后删除所有非单词字符
( my $parser = $subckt ) =~ s/\W//g;
或使用/r
Modifier:
my $parser = $subckt =~ s/\W//gr;
答案 4 :(得分:0)
尝试替换g标志所有出现的括号
$subckt =~ s/\(//g;
$subckt =~ s/\)//g;