如何在角色结束后砍掉所有东西?

时间:2019-09-17 00:20:43

标签: perl

我想创建一个Perl程序来接收文件,并针对每一行,将某个字符后的所有内容都切掉(例如/)。例如,考虑以下示例文件:

foo1/thing 1.1.1 bar
foo2/item 2.3.2 bar
foo3/thing 3.4.5 bar

我想删除每行斜杠之后的所有内容并将其打印出来,以便该文件变为:

foo1
foo2
foo3

我尝试在readline循环中使用foreach的程序,但是输出结果不是我期望的:

print ( "Enter file name: " ) ;
my $filename = <> ;
$/ = ''
chomp $filename ;

my $file = undef ;
open ( $file, "< :encoding(UTF-8)", $filename
$/ = '/' ;
foreach ( <$file> ) {
    chomp ;
    print ;
}

但这只是从每行中删除斜线。

foo1thing 1.1.1 bar
foo2item 2.3.2 bar
foo3thing 3.4.5 bar

如何更改此设置以产生所需的输出?

2 个答案:

答案 0 :(得分:3)

就问题而言,输入记录分隔符($/)不允许使用正则表达式。

您可以按照以下步骤操作:

print ( "Enter file name: " ) ;
my $filename = <> ;
chomp $filename ;

open ( my $file, "< :encoding(UTF-8)", $filename ) 
    or die "could not open file $filename: $!";
while ( my $line = <$file> ) {
    $line =~ s{/.*}{}s;
    print "$line\n";
}

Regexp s{/.*}{}s在第一个斜杠和随后的所有斜杠匹配,并抑制它(以及尾随的新行)。

注意:如the documentation所述,在使用open()时始终检查错误:

  

打开文件时,如果请求失败,最好不要继续,因此open经常与die一起使用。

答案 1 :(得分:3)

$line =~ s{/.*}{}s;                       # In-place (destructive)

my ($extracted) = $line =~ m{([^/]*)};    # Returns (non-destructive)