【发布时间】:2019-09-17 00:20:43
【问题描述】:
我想创建一个 Perl 程序来接收一个文件,并且对于每一行,在某个字符(比如说 /)之后删除所有内容。例如,考虑这个示例文件:
foo1/thing 1.1.1 bar
foo2/item 2.3.2 bar
foo3/thing 3.4.5 bar
我想删除每行斜线后的所有内容并将其打印出来,以便该文件变为:
foo1
foo2
foo3
我尝试使用这个程序,在 foreach 循环中使用 readline,但输出不是我所期望的:
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
我怎样才能改变它以产生我需要的输出?
【问题讨论】:
-
删除每行第一个或最后一个字符之后的所有内容?
-
第一个斜线。
-
使用
$/不会满足您的需要。该变量设置了被认为是记录结束的内容,可以说是“换行符”。无论设置为什么,readline(又名<>)和chomp等运算符都会使用它作为“行”结束的标记。所以<>读取到第一个这样的字符并将其返回为“行”(在标量上下文中),然后再次......你最终不会删除 anything 除了这些字符本身(@ 987654332@ 这里)。当您说“删除每行斜线后的所有内容”时,您的意思是“正常”(通常)意义上的行;那么你不想重新定义什么是“线”。 -
考虑一个包含字符
abX\nX12X的文件。打开它,设置$/ = 'X';,然后用while (<$fh>)读取。readline(<>) 将读取三个“行”(abX、\nX、12X),如果您还使用chomp,则这些X将被删除。
标签: perl