perl - 如何在终端管道中运行 perl 文件

标签 perl terminal

可能是一个非常简单的问题: 我有一个 perl 文件 sed.perl,它将字符串作为输入,进行一些替换并将其打印在标准输出上。

#!/usr/bin/perl
use warnings;
use strict;
use diagnostics;
use feature 'say';
#use Cwd;

my ($text) = @ARGV; 

$text =~ s/\.\)\n/'\.'\)\n/;

print $text;

我想向脚本提供来自终端管道的字符串输出。我们这样说吧:

cat input.txt | perl sed.perl

但这不起作用:在替换中使用未初始化的值 $text (s///) at

使用分数符号也不起作用:

cat input.txt | perl sed.perl -

最佳答案

@ARGV不做你认为它做的事。它实际上是传递给 perl 的参数。

例如:

myscript.pl some arg

@ARGV将主持'some', 'arg'

你想要的是STDIN文件句柄。

例如

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

while ( <STDIN> ) {
    s/something/somethingelse/g; 
    print;
}

现在,它正在执行的操作是读取 STDIN逐行。您的模式包括 \n 。你真的需要它吗?看起来您“只是”将其用作线 anchor ,因此您可以使用:

s/\.\)$/'\.'\)/g;

$是“行尾”的正则表达式 - 请参阅 perlre 了解更多。

但是,正如 reinierpost 的评论中所述- 还有一件事可能很有用 - Perl 有“钻石运算符”<>它做了两件事:

  • 如果为脚本指定了文件名,则打开它们并从中读取。
  • 如果未指定参数,则读取 STDIN

所以你可以这样做:

while ( <> ) {
    s/something/somethingelse/g; 
    print;
}

然后您的脚本可以通过以下方式调用:

cat input.txt | ./yourscript.pl

或者:

./yourscript.pl input.txt

你会得到相同的结果。

关于perl - 如何在终端管道中运行 perl 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30169496/

相关文章:

linux - 每个命令都会产生段错误

java - 如何清理 Runtime.exec() 中使用的用户输入?

macos - 如何将 osx 中的 GCC 从 xcode 移动到/usr/bin

linux - Perl 脚本将换行符添加到文本文件末尾

linux - Perl 脚本异常行为/回收内存

javascript - 有没有办法只使用 New Relic 的 RUM 功能?

python - 如何获取 ANSI 终端中光标的位置?

perl - 如何使 Perl 脚本仅在用户单击链接/按钮等时执行

perl - 如何找到这一行引用的 Perl 代码?

linux - FTP 文件上传 - 脚本卡住