我想使用 Perl 从文件中取出四行。我有四个整数变量;例如:
a= 5;
b = 45;
c=30;
d=8;
是否可以将文件中与这些值对应的行号(即第 5 行、第 45 行、第 30 行、第 8 行)中的行号抓取并存储为四个字符串?我一直在玩
-ne 'print if($.==5)';
但是有没有更雄辩的方式呢?这似乎只是检查我目前在哪条线上......
我想使用 Perl 从文件中取出四行。我有四个整数变量;例如:
a= 5;
b = 45;
c=30;
d=8;
是否可以将文件中与这些值对应的行号(即第 5 行、第 45 行、第 30 行、第 8 行)中的行号抓取并存储为四个字符串?我一直在玩
-ne 'print if($.==5)';
但是有没有更雄辩的方式呢?这似乎只是检查我目前在哪条线上......
如果你想要它作为一个单行,使用散列会很容易:
perl -ne '%lines = map { $_ => 1 } 23, 45, 78, 3; print if exists $lines{$.}' test.txt
这将创建一个看起来像的哈希,( 23 => 1, 45 => 1, 78 => 1, 3 => 1 )
然后用于exists
检查当前行号是否是哈希中的键。
如果您正在使用一个小文件并且有内存将内容添加到脚本中,您可以将文件添加到一个数组中,然后将这些行作为数组元素访问:
# define the lines you want to capture
$a=5;
$b=45;
$c=30;
$d=8;
# slurp the file into an array
@file = <>;
# push the contents of the array back by one
# so that the line numbers are what you expect
# (otherwise you would have to add 1 to get the
# line you are looking for)
unshift (@file, "");
# access the desired lines directly as array elements
print $file[$a];
print $file[$b];
print $file[$c];
print $file[$d];
如果您正在寻找命令行单行,您也可以尝试 awk 或 sed:
awk 'NR==5' file.txt
sed -n '5p' file.txt
一个班轮
perl -ne 'print if ( $. =~ /^45$|^30$|^8$|^5$/ )' file.txt
这正是适合的工作Tie::File
。
代码看起来像这样
use strict;
use warnings;
use Tie::File;
tie my @file, 'Tie::File', 'myfile.txt';
print $file[$_-1], "\n" for qw/ 5 45 30 8 /;