我是Perl的新手并尝试解决问题,但没有成功。我正在尝试从文本文件中读取数据。代码是:
open FH, 'D:\Learning\Test.txt' or die $!;
my @data_line;
while (<FH>)
{
@data_line = split (/\|\~/);
print @data_line;
}
文件内容如下:
101|~John|~This line is broken and showing space in print|~version123|~data|~|~|~ 102|~Abrahim|~This is a line to be print|~version1.3|~|~|~|~
输出是:
101JohnThis line is broken and showing space in printversion123data 102AbrahimThis is a line to be printversion1.3
我只想在分隔符之间的一行中显示数据,如:
101JohnThis line is broken and showing space in printversion123data 102AbrahimThis is a line to be printversion1.3
请建议我该怎么办。我也尝试了chomp(@data_line)
,但它没有用。
我使用的是Windows操作系统。
我想插入这些&#34; |〜&#34;表的不同字段中的分隔值。我添加了: $ _ = ~s / \ n // g; 在@data_line = split(/ \ | \〜/)之前; 它根据我的要求打印了详细信息,但没有在我的数据库表中正确插入数据。 请建议我该怎么办?提前谢谢。
答案 0 :(得分:1)
稍作重写:
use strict;
use warnings;
use feature qw(say); #See note #1
use autodie; #See note #2
use constant FILE => 'D:/Learning/Test.txt'; #See note #3
open my $fh, "<", FILE; #See note #4
my $desired_output;
while ( my $line = <DATA> ) { #See note #5
chomp $line; #See note #6
$line =~ s/\|~//g;
if ( $desired_output ) {
if ( $line =~ /^\d+/ ) {
$desired_output .= "\n$line";
}
else {
$desired_output .= " $line";
}
}
else { #See note #7
$desired_output = $line;
}
}
close $fh; #See note #8
say "$desired_output";
为什么不使用替换命令完全删除字段分隔符,而不是使用拆分?另请注意,我将输出保存为一条连续线。内部if
结构比我喜欢的要复杂一点,但它很容易理解。如果$desired_output
中没有数据,我只需将$desired_output
设置为等于我的行。否则,我会检查$line
是否以数字开头。如果是,我会将\n
附加到$desired_output
,然后附加$line
。否则,我会添加一个空格,然后$line
。
现在我的笔记。这或多或少都是用现在称为标准Perl风格的方式编写的。这包括一些好的建议(使用strict
,warnings
等)以及现在的方案布局。例如,使用下划线来分隔变量名称中的单词而不是驼峰($desired_output
与$desiredOutput
)。 Damian Conway的Perl Best Practices涵盖了很多这方面的内容。这些可能不是我想做的事情,但我这样做是因为这是其他人都在做的事情。并且,遵循标准通常比投诉更重要。这是关于维护和可读性。你跟随人群。
始终将这三行放在所有程序中。前两个将捕获90%的编程错误,use features qw(say);
允许您使用say
而不是print
。它使您不必在最后添加\n
,这可能比现在听起来更重要。相信我,如果可能,您宁愿使用say
代替print
。
use autodie处理Perl中的许多情况。例如,如果您无法读入文件,则可能无法继续执行您的程序。关于autodie
的好处是,当你忘记测试命令的返回值时,它会阻止你的程序缩短。
如果某些内容没有变化,您应该将其设为constant。这会将您的所有不变的数据放在一个位置,并允许您定义诸如PI = 3.1416
之类的神秘数字。不幸的是,除非你知道Perl deep dark secret,否则常量不能轻易地插入到输出中。
打开文件时,请使用open命令的three parameter form,并使用标量文件句柄。与使用旧的全局句柄相比,您可以更轻松地将标量文件句柄传递给子例程。
除非必须($_
或grep
),否则请勿使用自动变量map
。它不会提高可读性或加快执行速度。而且,它有让你陷入困境的倾向。它是所有包中的全局变量,在您不知情的情况下可能会受到影响。
每次我读取可能在最后都有新行的数据时,我总是chomp
,即使它可能在以后证明方便。行尾的新行可能会导致各种正则表达式的惊愕。这可以在while内部完成:while ( chomp ( my $line = <$fh> ) )
,但这不会增加可读性或速度。
请注意我的缩进以及使用括号的方式。这是现在的首选标准。我花了几年的时间来学习Pascal和K&amp; R风格C这样做的方式。可能在早期以正确的方式学习它。
完成后,始终关闭文件句柄。这是一个很好的形式。
答案 1 :(得分:0)
你需要在拆分之前选择“it”变量。
while (<FH>)
{
chomp ($_);
@data_line = split (/\|\~/);
print @data_line;
}
我通常使用显式变量来使其更具可读性。
while ( my $line= <FH> )
{
chomp ($line);
...
答案 2 :(得分:0)
open FH, 'D:\Learning\Test.txt' or die $!;
my @data_line;
while (<FH>)
{
chomp;
@data_line = split (/\|\~/);
print @data_line;
}
你可以使用chomp擦除文件中的'/ n'。
答案 3 :(得分:0)
这一个班轮将帮助你。但它会改变你的输入文件
perl -pi -e 's/\|\~//g;s/\n/ /g' test.txt