我想搜索一个字符串,并通过Perl脚本从文本文件中获取整行。
因此文本文件将如下所示。
data-key-1,col-1.1,col-1.2
data-key-2,col-2.1,col-2.2
data-key-3,col-3.1,col-3.2
这里我想应用data-key-1
作为搜索字符串,并将整行输入Perl变量。
在这里,我希望在shell中完全替换grep "data-key-1" data.csv
。
在控制台中运行时,某些语法如下所示。
perl -wln -e 'print if /\bAPPLE\b/' your_file
但是如何将它放在脚本中呢?使用perl
关键字,我们无法将其放入脚本中。有没有办法避免循环?
答案 0 :(得分:5)
如果您知道为单行提供的命令行选项,您就会确切地知道在perl
脚本中要写什么。当您读取文件时,您需要一个循环。循环的选择可以产生不同的结果性能。使用for
循环读取一段时间比使用while
循环读取文件更昂贵。
你的单行:
perl -wln -e 'print if /\bAPPLE\b/' your_file
基本上是在说:
-w
:使用警告-l
:在处理之前从每行中压缩换行符,并在打印期间将其放回。 -n
:创建隐式while(<>) { ... }
循环以对每一行执行操作-e
:告诉perl
解释器执行其后的代码。 print if /\bAPPLE\b/
,则APPLE
打印整行。 所以要在perl
脚本中使用上述内容,您可以:
#!usr/bin/perl
use strict;
use warnings;
open my $fh, '<', 'your_file' or die "Cannot open file: $!\n";
while(<$fh>) {
my $line = $_ if /\bAPPLE\b/;
# do something with $line
}
chomp
在这里并不是真的需要,因为除了检查是否存在单词之外,你没有对该行做任何事情。
答案 1 :(得分:2)
open($file, "<filename");
while(<$file>) {
print $_ if ($_ =~ /^data-key-3,/);
}
答案 2 :(得分:0)
use strict;
use warnings;
# the file name of your .csv file
my $file = 'data.csv';
# open the file for reading
open(FILE, "<$file") or
die("Could not open log file. $!\n");
#process line by line:
while(<FILE>) {
my($line) = $_;
# remove any trail space (the newline)
# not necessary, but again, good habit
chomp($line);
my @result = grep (/data-key-1/, $line);
push (@final, @result);
}
print @final;