我想创建一个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
如何更改此设置以产生所需的输出?
答案 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)