我有多个具有以下格式字符串的变量:
some_text_here__what__i__want_here__andthen_some
我希望能够将第一个变量的what__i__want_here
部分分配给一个变量。换句话说,第一个双下划线之后的所有内容。字符串的其余部分可能会有双下划线,但是我只想在第一对下划线之后加上文字。
例如。
如果我有$var = "some_text_here__what__i__want_here__andthen_some"
,我只想将第二部分分配给新变量,例如$var2 = "what__i__want_here__andthen_some"
我不太擅长匹配,因此我不太确定该怎么做,因此仅在第一个双下划线之后才占用所有内容。
答案 0 :(得分:1)
my $text = 'some_text_here__what__i__want_here';
# .*? # Match a minimal number of characters - see "man perlre"
# /s # Make . match also newline - see "man perlre"
my ($var) = $text =~ /^.*?__(.*)$/s;
# $var is not defined when there is no __ in the string
print "var=${var}\n" if defined($var);
答案 1 :(得分:1)
您可能会认为这是split
的第三个参数有用的示例。 split
的第三个参数限制了要返回的元素数。这是一个示例:
my @examples = (
'some_text_here__what__i_want_here',
'__keep_this__part',
'nothing_found_here',
'nothing_after__',
);
foreach my $string (@examples) {
my $want = (split /__/, $string, 2)[1];
print "$string => ", (defined $want ? $want : ''), "\n";
}
输出将如下所示:
some_text_here__what__i_want_here => what__i_want_here
__keep_this__part => keep_this__part
nothing_found_here =>
nothing_after__ =>
此行有点密集:
my $want = (split /__/, $string, 2)[1];
让我们分解一下:
my ($prefix, $want) = split /__/, $string, 2;
2
参数告诉split
,无论模式/__/
可以匹配多少次,我们只希望第一次发现就分裂一次。再举一个例子:
my (@parts) = split /#/, "foo#bar#baz#buzz", 3;
@parts
数组将接收以下元素:'foo','bar','baz#buzz',因为我们告诉它在第二次拆分后停止拆分,因此我们总共得到三个结果中的元素。
回到您的情况,我们将最大元素数设置为2。然后,通过消除对my ($throwaway, $want) = ...
的需求,我们可以进一步前进。通过提供索引,我们可以告诉Perl我们只关心split
返回的事物列表中的第二个元素。
my $want = ('a', 'b', 'c', 'd')[2]; # c, the element at offset 2 in the list.
my $want = (split /__/, $string, 2)[1]; # The element at offset 1 in the list
# of two elements returned by split.
答案 2 :(得分:0)
您使用方括号来进行排版,然后对字符串进行重新排序,第一组方括号()在替换的下一部分为$ 1,等等...
my $string = "some_text_here__what__i__want_here";
(my $newstring = $string) =~ s/(some_text_here)(__)(what__i__want_here)/$3$2$1/;
print $newstring;
输出
what__i__want_here__some_text_here