perl + 如何声明数组

2024-02-10

以下脚本 (test.pl) 在 myfile.txt 文件的 $first_line[1] 和 $second_line[1] 之间附加 $insert[1] 文本,并将输出发送到 output.txt

但如果我将数组声明为

 my $first_line[1]=")"; 
 my $second_line[1]="NIC Hr_Nic ("; 
 my $insert[1]="hello world
                line 2
                line3 "

I get

 syntax error at ./test.pl line 10, near "$first_line["
 syntax error at ./test.pl line 11, near "$second_line["
 syntax error at ./test.pl line 12, near "$insert["
 Execution of ./test.pl aborted due to compilation errors.

如何声明以下数组?

备注:(如果数组上没有 my,脚本工作正常)

lidia

 #!/usr/bin/perl

 # Slurp file myfile.txt into a single string 
 open(FILE,"myfile.txt") || die "Can't open file: $!"; 
 undef $/; 
 my $file = <FILE>; 

 # Set strings to find and insert 
 my $count=1;
 my $first_line[1]=")"; 
 my $second_line[1]="NIC Hr_Nic ("; 
 my $insert[1]="hello world
          line 2 
           line 3 " ;

对于数组和哈希之类的复合类型,您只需将复合类型声明为词法变量:

 my @first_line = ...;

从那里,您不需要像您所做的那样声明复合元素。

您可以从一本书开始,例如学习 Perl学习该语言的基础知识。预先进行一点研究将为您节省以后的很多痛苦。

看起来您正在尝试影响文件的前几行。在这种情况下,请参阅答案如何更改、删除或在文件中插入一行,或附加到文件的开头? http://faq.perl.org/perlfaq5.html#How_do_I_change_dele:


如何更改、删除或在文件中插入一行,或附加到文件的开头?

(布莱恩·D·福伊供稿)

从文本文件中插入、更改或删除行的基本思想包括读取并打印文件到要进行更改的位置,进行更改,然后读取并打印文件的其余部分。 Perl 不提供对行的随机访问(特别是因为记录输入分隔符 $/ 是可变的),尽管 Tie::File 等模块可以伪造它。

执行这些任务的 Perl 程序采用的基本形式是打开文件、打印其行,然后关闭文件:

open my $in,  '<',  $file      or die "Can't read old file: $!";
open my $out, '>', "$file.new" or die "Can't write new file: $!";

while( <$in> )
    {
    print $out $_;
    }

平仓$; 在该基本表单中,添加插入、更改或删除行所需的部分。

要将行添加到开头,请在进入打印现有行的循环之前打印这些行。

open my $in,  '<',  $file      or die "Can't read old file: $!";
open my $out, '>', "$file.new" or die "Can't write new file: $!";

print $out "# Add this line to the top\n"; # <--- HERE'S THE MAGIC

while( <$in> )
    {
    print $out $_;
    }

平仓$; 要更改现有行,请插入代码以修改 while 循环内的行。在这种情况下,代码找到“perl”的所有小写版本并将它们转为大写。每行都会发生这种情况,因此请确保您应该在每行上执行此操作!

open my $in,  '<',  $file      or die "Can't read old file: $!";
open my $out, '>', "$file.new" or die "Can't write new file: $!";

print $out "# Add this line to the top\n";

while( <$in> )
    {
    s/\b(perl)\b/Perl/g;
    print $out $_;
    }

平仓$; 要仅更改特定行,输入行号 $. 很有用。首先阅读并打印直到您要更改的行。接下来,读取要更改的单行,更改它,然后打印它。之后,阅读其余行并打印它们:

while( <$in> )   # print the lines before the change
    {
    print $out $_;
    last if $. == 4; # line number before change
    }

my $line = <$in>;
$line =~ s/\b(perl)\b/Perl/g;
print $out $line;

while( <$in> )   # print the rest of the lines
    {
    print $out $_;
    }

要跳过行,请使用循环控件。本示例中的下一个会跳过注释行,最后一个一旦遇到以下任一情况就会停止所有处理END or DATA.

while( <$in> )
    {
    next if /^\s+#/;             # skip comment lines
    last if /^__(END|DATA)__$/;  # stop at end of code marker
    print $out $_;
    }

通过使用 next 跳过您不想在输出中显示的行,执行相同的操作来删除特定行。此示例每隔五行跳过一次:

while( <$in> )
    {
    next unless $. % 5;
    print $out $_;
    }

如果出于某种奇怪的原因,您确实想立即查看整个文件而不是逐行处理,则可以将其吞入其中(只要您可以将整个文件放入内存!):

open my $in,  '<',  $file      or die "Can't read old file: $!"
open my $out, '>', "$file.new" or die "Can't write new file: $!";

my @lines = do { local $/; <$in> }; # slurp!

    # do your magic here

print $out @lines;

File::Slurp 和 Tie::File 等模块也可以提供帮助。但是,如果可以的话,请避免一次读取整个文件。在进程完成之前,Perl 不会将内存返还给操作系统。

您还可以使用 Perl 语句就地修改文件。以下命令将 inFile.txt 中的所有“Fred”更改为“Barney”,并用新内容覆盖该文件。使用 -p 开关,Perl 会在您使用 -e 指定的代码周围包装一个 while 循环,并且 -i 打开就地编辑。当前行的单位是 $。使用 -p,Perl 自动打印 $ 的值在循环的末尾。有关详细信息,请参阅 perlrun。

perl -pi -e 's/Fred/Barney/' inFile.txt

要备份 inFile.txt,请为 -i 添加文件扩展名:

perl -pi.bak -e 's/Fred/Barney/' inFile.txt

要仅更改第五行,您可以添加一个测试检查 $.(输入行号),然后仅在测试通过时执行操作:

perl -pi -e 's/Fred/Barney/ if $. == 5' inFile.txt

要在某一行之前添加行,您可以在 Perl 打印 $_ 之前添加一行(或多行!):

perl -pi -e 'print "Put before third line\n" if $. == 3' inFile.txt

您甚至可以在文件的开头添加一行,因为当前行打印在循环的末尾:

perl -pi -e 'print "Put before first line\n" if $. == 1' inFile.txt

要在文件中已有的一行之后插入一行,请使用 -n 开关。它就像 -p 一样,只不过它不会在循环末尾打印 $_ ,因此您必须自己执行此操作。在这种情况下,首先打印 $_,然后打印要添加的行。

perl -ni -e 'print; print "Put after fifth line\n" if $. == 5' inFile.txt

要删除行,只打印您想要的行。

perl -ni -e 'print unless /d/' inFile.txt

    ... or ...

perl -pi -e 'next unless /d/' inFile.txt
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

perl + 如何声明数组 的相关文章

  • 如何在 Perl 中将多个哈希值合并为一个哈希值?

    在 Perl 中 我如何得到这个 VAR1 999 gt 998 gt 908 906 0 998 907 VAR1 999 gt 991 gt 913 920 918 998 916 919 917 915 912 914 VAR1 99
  • api网关CORS设置

    我正在尝试在部署脚本中使用 aws cli 从命令行设置 aws CORS 我使用以下 perl to shell 命令创建了 POST 资源 我正在尝试将集成响应设置为 就像启用核心一样 aws apigateway put method
  • Emacs cperl - 常量块中的缩进

    我正在运行基于 GNU Emacs 24 3 50 2 的 Aquamacs 3 0a cperl 版本是 6 2 当我编辑 Perl 常量块时 我得到了我不想要的额外缩进 use constant ONE gt 1 TWO gt 2 TH
  • 无法在 Mac 上安装 DBD::mysql

    第一次发帖 格式可能不太对 请见谅 我一直在尝试使用 cpan 在 macOS Catalina 上安装 DBD mysql 但尚未成功 我使用了perlbrew 并尝试了mysql和mariaDB 但仍然没有成功 另外 我在网上研究了不同
  • 使用 Perl 写入文件的最简单方法是什么?

    目前我正在使用 system echo panel login panel password root name root pass port panel type gt gt home shared ftp 使用 Perl 做同样的事情最
  • 在 Perl 中组装 XML

    我需要对 NetApp 文件管理器进行 API 调用 我知道我需要发送什么原始 XML
  • 在 Perl 中优雅地确定系统架构

    我正在寻找一种简单的方法来确定 Perl 5 中的系统是 32 位还是 64 位 我已阅读perlvar来回翻阅手册页 并没有发现包含系统 CPU 架构的变量 编译 Perl 的 CPU 架构将足够接近 这是我最接近的 chomp my a
  • Perl 中的 Fork 无法在从文件读取的 while 循环内工作

    我正在运行一个 while 循环来读取文件中的每一行 然后使用该行的数据将进程分叉给子进程 N 行之后 我想等待子进程结束并继续接下来的 N 行 等等 它看起来像这样 while w
  • 结束 perl 脚本而不等待系统调用返回

    我在 Linux Ubuntu 14 04 上运行一个简单的 apache Web 服务器 并使用 perl CGI 脚本处理一些请求 该脚本使用以下命令启动系统命令system函数 但我希望它立即返回 无论系统调用的结果如何 我一直在传递
  • Perl LWP::简单 HTTPS 错误

    我正在尝试获取网站的内容并打印 该代码按照我希望的方式在常规 HTTP 网站上运行 但它不适用于 HTTPS 我已经查找了此问题的修复程序 但它们在我的程序中不起作用 这是我目前拥有的代码 usr bin perl use strict u
  • Perl 脚本(或任何东西)来合计 CSV 列

    我写了 在其他人的很多帮助下 awk command https stackoverflow com questions 4159224 excel and awk disagree about csv totals 4159404 415
  • Perl - 以相反的顺序逐行读取文件[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Perl 中从文件末尾读取行 https stackoverflow com questions 303053 how can i read lines from the end of fil
  • Perl 中的布尔函数应该返回什么值?

    简短的问题 在 Perl 代码库中一致表示真假的最佳方法是什么 1 0 1 Perl 原生布尔运算符的特殊空字符串 return undef 即空列表 问题背景 我们都知道 Perl 在布尔值方面非常灵活 就像大多数事情一样 例如 Perl
  • Path::Class::File 或 ::Dir & Moose 初始化和强制

    目前有 package Local use warnings use Moose use Method Signatures Simple use Path Class File use Path Class Dir method buil
  • Perl YAML 模块无法识别标量类型

    我加载以下 yaml 文件 foo bar s 1 hx 0x34 用这段代码 use YAML qw LoadFile Dump use Data Dumper my d LoadFile test yaml print Dumper d
  • 如何让 mod_perl 在更改时重新加载源文件?

    我正在开发一个带有 mod 的应用程序 perl 并在每次更改代码时重新启动服务器是一个巨大的阻力 我还是想用mod perl 用于开发 因为我计划将其用于实时服务器 我在文档中没有看到有关如何执行此操作的任何内容 想法 我认为 Apach
  • 使用 LWP::Agent 的 Perl JSON::RPC::Client

    我被要求不使用 JSON RPC Client 而是使用 LWP 进行调用 这是我的代码 Server usr bin perl use strict use lib use ServerLib use JSON RPC Server Da
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • 在perl中更改多维哈希的第一个键

    我在 perl 中有一个多维哈希 我想更改所选值的第一个键 例如 我有哈希 my Hash1 Hash1 1 12 1 Hash1 1 10 1 Hash1 2 31 1 Hash1 3 52 1 Hash1 3 58 1 Hash1 4
  • 在 Perl 中如何用空格填充字符串的一部分?

    你更喜欢哪个版本 usr bin env perl use warnings use strict use 5 010 my p 7 33 my prompt my key very important text my value Hell

随机推荐

  • 如何在 Java DateUtils.parseDate 中识别祖鲁时区?

    我有以下格式的日期2008 12 23T00 00 00Z 这看起来很像ISO 8601 格式 http en wikipedia org wiki ISO 8601采用祖鲁语 UTC 时区 我虽然下面的代码会解析它 使用公共语言 http
  • 在python中如何在其静态方法中获取类的名称

    如何在静态方法中获取类的名称 我有继承 并想要派生类的名称 在下面的例子中 应该用什么来代替XXX在方法 my name 中 class snake staticmethod def my name print XXX name class
  • 为什么C的printf格式字符串同时有%c和%s?

    为什么C的printf格式字符串两者都有 c and s 我知道 c代表单个字符并且 s表示一个以 null 结尾的字符串 但是仅仅字符串表示还不够吗 可能是为了区分以空结尾的字符串和字符 如果他们刚刚有 s 那么每个字符也必须以空字符结尾
  • PHP 中包含缓存以供迭代重用

    有没有办法缓存 PHPinclude有效地重复使用 无需 APC 等 Simple 尽管愚蠢 例子 rand php return rand 0 999 index php file rand php while i lt 1000 ech
  • 如何从我的网站禁用(查看源代码)和(Ctrl + C)

    是否有机会从我的网站禁用这两个功能 查看源代码 和 Ctrl C 这是不可能的 您可以尝试以某种方式混淆代码 但您需要向客户端发送一些内容 不是吗 您可以使用 AJAX 调用来加载 html 这样 浏览器将显示的源几乎是空的 但是 您无法阻
  • PHP:使用准备好的语句并防止 SQL 注入与转义

    我确实明白准备好的语句是寻求防止 SQL 注入的最终方法 然而 它们提供的保险范围有限 例如 在我让用户决定操作顺序的情况下 即 是 ASC 还是 DESC 等 我没有得到准备好的语句的覆盖 据我所知 我可以将用户输入映射到预定义的白名单
  • Azure 上的 IISNode 定期失败并显示 HTTP 500.1001

    该站点定期因 HTTP 500 错误而变得不可用 到目前为止我能从日志中找到的是 ModuleName iisnode Notification EXECUTE REQUEST HANDLER HttpStatus 500 HttpReas
  • 使用 python-pptx 将文本/幻灯片标题添加到幻灯片上的占位符

    我正在尝试为我的幻灯片添加标题 我正在查找文档here http python pptx readthedocs io en latest user placeholders using html它说 设置幻灯片标题 几乎所有幻灯片布局都有
  • ObjectMapper 无法正确处理 UTF-8?

    我正在使用 ObjectMapper 将系统中的帖子序列化为 json 这些帖子包含来自世界各地的条目并包含 utf 8 字符 问题是 ObjectMapper 似乎没有正确处理这些字符 例如 字符串 Mus e d Orsay 被序列化为
  • 使用 Connect 或将数据作为道具传递给孩子

    我是反应和还原的新手 我有一个场景 其中有这样的嵌套组件 A gt B gt C gt D A 组件中使用了一个属性 D 组件中也会使用该属性 所以 我有两种方法 从组件 A 中的 redux 存储获取状态 然后将其作为 props 传递给
  • 无法在 Mac 上访问 std 向量迭代器 _Ptr

    在 Visual Studio 上 这段代码就像一个魅力 auto child node childs begin while child node childs end vector
  • Matlab 样条插值 从 Y 中找到 X

    我需要找到当 y 0 时 x 的值 这是我的代码 x 2 3 4 5 6 y 10 8 4 1 2 xi linspace 2 6 100 yi interp1 x y xi spline plot x y o xi yi xlabel x
  • Rails:查找父对象的所有关联对象

    我在 Rails 中创建了一个复杂的对象 其主要父对象 Resume 它的每个部分都有多个子对象 objective section contact section 等 有没有一种方法可以将所有关联的对象获取到父对象恢复 如果 获取 是指在
  • RESTful API 密钥建议 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在寻找有关 RESTful API 设计的建议 我已经阅读了很多有关 REST API 方案 身份验证 授权方式等的内容 我无法决定的是我是
  • 如何最大化背景窗口?

    我需要最大化背景中的窗口 这意味着不激活 聚焦 它 SetWindowPlacement 函数不提供此功能 有任何想法吗 WINDOWPLACEMENT wp new WINDOWPLACEMENT GetWindowPlacement h
  • 程度报告问题并行测试

    我有以下报告代码 public class Reporting private ExtentHtmlReporter extentHtmlReporter private static ThreadLocal
  • 如何在 React Native 中获取组件在屏幕上的位置?

    我正在开发一个反应本机应用程序 我想处理屏幕上的触摸 一个用例是当用户在屏幕上 按下 时 我希望能够获取屏幕上特定组件的位置 x y 以了解它是否与触摸的 x y 匹配 我已经搜索过堆栈溢出 但给定的解决方案都不起作用 在我的根组件中 on
  • 分析 pyomo 中的解决方案 (.sol) 文件

    我在机器 1 中有一个 pyomo 模型 在机器 2 中有 CPLEX 求解器 我转换 pyomo 模型 ConcreteModel 变成problem lp带有函数的文件model write problem lp 在机器 1 中 然后我
  • jQuery 在两个类之间滚动切换

    默认情况下 我有一个具有红色背景颜色的导航栏 我想要做的是 当用户向下滚动超过 100px 将背景更改为蓝色 并且如果他返回到 0px 将背景更改为其默认状态 例如 我想通过在两个类之间切换来做到这一点 div class navigati
  • perl + 如何声明数组

    以下脚本 test pl 在 myfile txt 文件的 first line 1 和 second line 1 之间附加 insert 1 文本 并将输出发送到 output txt 但如果我将数组声明为 my first line