如何让Perl打印前十行的字符串?

时间:2016-04-23 19:09:30

标签: bash perl

我试图显示大字符串的前十行(段落的前10行)。我试图使用:

 $lines = head-10 $string

我看到一些使用while循环的示例,但我的脚本无法实现这一点,我需要它作为变量。

接下来我尝试使用:

 $string = perl -pe'$.>10&&last'

通过输入

给了我想要的结果
String= "$(string | head -n10)"

3 个答案:

答案 0 :(得分:2)

Perl允许您在字符串上打开文件句柄。然后,您可以使用文件句柄惯用语来阅读"字符串。

my $string = <<"HERE";
This is the first line
This is the second line
3rd
4th
5th
6th
seventh
one plus seventh
eighth
tenth minus one
tenth
should not go this far
way to far
okay stop now, srsly
This is the last line
HERE


open my $fh, '<:utf8', \ $string or die;
while( 0 .. 10 ) {
    print { STDOUT } scalar <$fh>;
    }
close $fh;

在这个例子中,我给open一个标量的引用而不是文件名。现在我在该标量上有一个文件句柄。

while中,我使用触发器操作符。它看起来像范围运算符,但在布尔上下文中它是不同的。当第一个条件为真时确实如此,并且在第二个条件为真之前保持为真。也就是说,它会打开,保持打开然后关闭。

当您使用触发器的数字文字时,它会查看当前读取的文件句柄的行号(在本例中为$ fh)。因此,当行号为0时我们将其打开,当行号为10时将其关闭。这意味着当行号为10时循环不会执行,因为条件现在为假。但是,这很好,因为它实际上是第11行。

或者,您可以使用计数for循环来执行此操作:

open my $fh, '<:utf8', \ $string or die;
for( my $i = 0; $i <= 10; $i++ ) {
    print { STDOUT } scalar <$fh>;
    }
close $fh;

在这两个示例中,我使用scalar <$fh>来获取下一行,因为我使用内联print列表上下文运算符。我不想要所有的线条。我将输出手柄环绕在支架上,使其与其他正在进行的操作区别开来。

但是,你在询问它是否处于bash脚本中。你可以在&#34;正常&#34;你可以在-e的参数中执行perl程序:

perl -e 'open my $fh, q(<:utf8), \ $ARGV[0] or die;
    for( my $i = 0; $i <= 10; $i++ ) {
        print { STDOUT } scalar <$fh>;
        }
    close $fh;' string_arg

答案 1 :(得分:1)

>>>> START...<<<< END...注释之间尝试以下解决方案(其余部分是包装器代码,将其转换为独立脚本以进行演示/测试)。在解决方案部分之后,$s_start将包含$s_raw的前10行:

#!/usr/bin/perl
#
use warnings;

my (
      $n_lines
    , $s_raw
    , $s_start
    , $s_thisline
);

{ local $/ = undef; $s_raw = <DATA>; }

#>>>> START of core code section
$n_lines = 0;
open $fh_raw, "<", \$s_raw;
while ( ($n_lines < 10) && ($s_thisline = <$fh_raw>) ) {
    $s_start .= $s_thisline;
    $n_lines++;
}
close $fh_raw;
#<<<< END of core code section

print $s_start;
exit(0);

__DATA__
This is a test
with lots of lines
and
a bit
repetitive in nature
however
it 
serves the purpose
of demonstrating
the
code above
...(arbitrarily more stuff) ...

答案 2 :(得分:-1)

如果要在代码中执行此操作,请将段落拆分为列表,使用数组切片获取前10个元素,然后通过添加换行符将它们重新连接在一起。

VBScript