grep 函数

2023-11-16

  grep函数

(如果你是个Perl的新手,你可以先跳过下面的两段,直接到 Grep vs.loops 样例这一部分,放心,在后面你还会遇到它)

grep BLOCK LIST
grep EXPR, LIST

grep 函数会根据 LIST 中的元素对 BLOCK 或 EXPR 做出评估,而且会把局部变量 $_ 设置为当前所用的 LIST 中的元素。BLOCK 块是一个或多个由花括号分隔开的Perl 语句。而 List 则是一串被排序的值。EXPR 是一个或多个变量,操作符,字符,函数,子程序调用的综合体。Grep 会返回一组经 BLOCK 或 EXPR 块的估值后是真的元素。如果 BLOCK 块由多个语句组成,那么 Grep 以 BLOCK 中的最后一条语句的估计值为准。LIST 可以是一个列表也可以是一个数组。在标量上下文中,grep 返回的是可以被 BLOCK 或 EXPR 估为真的元素个数。

请避免在 BLOCK 或 EXPR 块中修改 $_ ,因为这会相应的修改 LIST 中的元素。同时还要避免把 grep 返回的列表做为左值使用,因为这也会修改 LIST 中的元素。(所谓左值变量就是一个在赋值表达式左边的变量)。一些 Perl hackers 可能会利用这个所谓的"特性",但是我建议你不要使用这种混乱的编程风格.

grep 与循环

这个例子打印出 myfile 这个文件中含有 terriosm 和 nuclear 的行(大小写不敏感).

open FILE "<myfile" or die "Can't open myfile: $!";
print grep /terrorism|nuclear/i, <FILE>;

对于文件很大的情况,这段代码耗费很多内存。因为 grep 把它的第二个参数作为一个列表上下文看待,所以 < > 操作符返回的是整个的文件。更有效的代码应该这样写:

while ($line = <FILE>) {
    if ($line =~ /terrorism|nuclear/i) { print $line }
}

通过上面可以看到,使用循环可以完成所有 grep 可以完成的工作。那为什么我们还要使用 grep 呢?一个直观的答案是 grep 的风格更像 Perl,而 loops(循环)则是 C 的风格。一个更好的答案是,首先, grep 很直观的告诉读者正在进行的操作是从一串值中选出想要的。其次,grep 比循环简洁。(用软件工程的说法就是 grep 比循环更具有内聚力)。基本上,如果你对 Perl 不是很熟悉,随便你使用循环。否则,你应该多使用像 grep 这样的强大工具.

计算数组中匹配给定模式的元素个数

在一个标量上下文中,grep 返回的是匹配的元素个数.

$num_apple = grep /^apple$/i, @fruits;

^ 和 $ 匹配符的联合使用指定了只匹配那些以 apple 开头且同时以 apple 结尾的元素。这里 grep 匹配 apple 但是 pineapple 就不匹配。

输出列表中的不同元素

@unique = grep { ++$count{$_} < 2 } 
               qw(a b a c d d e f g f h h);
print "@unique/n";

输出结果: a b c d e f g h

$count{$_} 是 Perl 散列中的一个元素,是一个键值对 ( Perl中的散列和计算机科学中的哈希表有关系,但不完全相同) 这里 count 散列的键就是输入列表中的各个值,而各键对应的值就是该键是否使 BLOCK 估值为真的次数。当一个值第一次出现的时候 BLOCK 的值被估为真(因为小于2),当该值再次出现的时候就会被估计为假(因为等于或大于2)。

取出列表中出现两次的值

@crops = qw(wheat corn barley rice corn soybean hay 
            alfalfa rice hay beets corn hay);
@duplicates = grep { $count{$_} == 2 } 
              grep { ++$count{$_} > 1 } @crops;
print "@duplicates/n";

在 grep 的第一个列表元素被传给 BLOCK 或 EXPR 块前,第二个参数被当作列表上下文看待。这意味着,第二个 grep 将在左边的 grep 开始对 BLOCK 进行估值之前完全读入 count 散列。

列出当前目录中的文本文件

@files = grep { -f and -T } glob '* .*';
print "@files/n";

glob 函数是独立于操作系统的,它像 Unix 的 shell 一样对文件的扩展名进行估计。单个的 * 表示匹配所以当前目录下不以 . 开头的文件, .* 表示匹配当前目录下以 . 开头的所有文件. 如果一个文件是文本文件 -f 和 -T 文件测试符则返回真。使用 -f and -T 进行测试要比单用 -T 进行测试有效,因为如果一个文件没有通过 -f 测试,那么 -T 测试就不会进行,而 -f 测试比 -T 耗时更少.

从数组中选出元素并消除重复

@array = qw(To be or not to be that is the question);
print "@array/n";
@found_words = 
    grep { $_ =~ /b|o/i and ++$counts{$_} < 2; } @array;
print "@found_words/n";

输出结果: 
To be or not to be that is the question
To be or not to questio

逻辑表达式 $_ =~ /b|o/i 匹配包含有 b 或 o 的元素(区别大小写)。把匹配操作放在计数工作前要比把计数工作放在前面有效些。比如,如果左边的表达式测试失败,那么右边的表达式就不会被计算.

选出二维坐标数组中横坐标大于纵坐标的元素

# An array of references to anonymous arrays
@data_points = ( [ 5, 12 ], [ 20, -3 ], 
                 [ 2, 2 ], [ 13, 20 ] );
@y_gt_x = grep { $_->[0] < $_->[1] } @data_points;
foreach $xy (@y_gt_x) { print "$xy->[0], $xy->[1]/n" }

输出结果: 
5, 12
13, 20 

在数据库中查找餐馆

这个例子实现数据库的方法不适合在实际中使用的,但是它说明了使用 grep 函数的时候,只要你的内存够用, BLOCK 块的复杂度基本没有限制.

# @database is array of references to anonymous hashes 
@database = ( 
    { name      => "Wild Ginger", 
      city      => "Seattle",
      cuisine   => "Asian Thai Chinese Korean Japanese",
      expense   => 4, 
      music     => "/0", 
      meals     => "lunch dinner",
      view      => "/0", 
      smoking   => "/0", 
      parking   => "validated",
      rating    => 4, 
      payment   => "MC VISA AMEX", 
    },
#   { ... },  etc.
);

sub findRestaurants {
    my ($database, $query) = @_;
    return grep {
        $query->{city} ? 
            lc($query->{city}) eq lc($_->{city}) : 1 
        and $query->{cuisine} ? 
            $_->{cuisine} =~ /$query->{cuisine}/i : 1 
        and $query->{min_expense} ? 
           $_->{expense} >= $query->{min_expense} : 1 
        and $query->{max_expense} ? 
           $_->{expense} <= $query->{max_expense} : 1 
        and $query->{music} ? $_->{music} : 1 
        and $query->{music_type} ? 
           $_->{music} =~ /$query->{music_type}/i : 1 
        and $query->{meals} ? 
           $_->{meals} =~ /$query->{meals}/i : 1 
        and $query->{view} ? $_->{view} : 1 
        and $query->{smoking} ? $_->{smoking} : 1 
        and $query->{parking} ? $_->{parking} : 1 
        and $query->{min_rating} ? 
           $_->{rating} >= $query->{min_rating} : 1 
        and $query->{max_rating} ? 
           $_->{rating} <= $query->{max_rating} : 1 
        and $query->{payment} ? 
           $_->{payment} =~ /$query->{payment}/i : 1
    } @$database;
}

%query = ( city => 'Seattle', cuisine => 'Asian|Thai' );
@restaurants = findRestaurants(/@database, /%query);
print "$restaurants[0]->{name}/n";

输出结果: Wild Ginger
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

grep 函数 的相关文章

  • 检查一个数字是 int 还是 float

    在perl中 我想检查给定变量是否包含浮点数 为了检查我正在使用的 my Var 0 02 Floating point number if int Var Var floating point number 但上面的代码对于 0 0 不起
  • mysql表中的数据非常大。即使 select 语句也需要很多时间

    我正在开发一个数据库 它是一个相当大的数据库 有 13 亿行和大约 35 列 这是我检查表状态后得到的结果 Name Table Name Engine InnoDB Version 10 Row format Compact Rows 1
  • 在android中创建SQLite数据库

    我想在我的应用程序中创建一个 SQLite 数据库 其中包含三个表 我将向表中添加数据并稍后使用它们 但我喜欢保留数据库 就好像第一次安装应用程序时它会检查数据库是否存在 如果存在则更新它 否则如果不存在则创建一个新数据库 此外 我正在制作
  • Perl 语言的目标是在运行时生成快速的程序吗?

    最近有朋友告诉我 看 Perl 从来就不是为了快而设计的 真的吗 我能找到的相关信息是来自维基百科 http en wikipedia org wiki Perl Overview 该语言旨在实用 易于使用 高效 完整 而不是美观 微小 优
  • 使用 Cygwin 安装 CPAN GD 模块失败

    我已经尝试解决为什么 CPAN GD 模块无法使用 Cygwin 安装 2 天了 任何帮助深表感谢 谢谢 cpan install GD Going to read home xxxxxxxxxx cpan Metadata Databas
  • postgresql 不同的不工作

    我使用以下代码从数据库获取值 但是当我编写这段代码时 测试看看问题出在哪里 我注意到查询没有从数据库中获取不同的值 这是查询 select distinct ca id as id acc name as accName pIsu name
  • 巩固 Django 南迁移

    在我的项目的初始阶段 我对模型进行了很多更改 因此我最终为我的应用程序生成了很多向南迁移 在转到我的生产服务器执行迁移之前 是否可以以任何方式整合它们 这样我就不会为每个应用程序进行一百万次迁移 如果是这样 我该怎么做呢 您始终可以删除现有
  • 客户端浏览器关闭时服务器端 Perl CGI 脚本中断

    我已经尝试解决一个小问题很长一段时间了 但似乎我无法解决 我编写了一个 HTML 页面 它在提交表单时调用 perl CGI 脚本 该 CGI 在服务器端执行一定数量的任务 我让脚本将这些任务的步骤打印到 HTML 页面上的 iframe
  • SQL Server 2005 是否有与 MySql 的 ENUM 数据类型等效的数据类型?

    我正在开发一个项目 我想在表中存储一些容易枚举的信息 MySql 的枚举数据类型正是我想要的 http dev mysql com doc refman 5 0 en enum html http dev mysql com doc ref
  • Perl 和 Selenium::远程::驱动程序

    再次编辑 我在弗吉尼亚州北部某处的 AWS 上有一台服务器 这是我的监控服务器 我从另一个状态 ssh 进入这个 Ubuntu 服务器来进行系统管理 我想在这台服务器上进行 Web 自动化测试 它将测试互联网上的 Web 应用程序 点击 U
  • 在 MySQL 数据库中保持 TEXT 字段唯一的最佳方法

    我想让 TEXT 字段的值在我的 MySQL 表中唯一 经过小型研究 我发现由于性能问题 每个人都不鼓励在 TEXT 字段上使用 UNIQUE INDEX 我现在想用的是 1 创建另一个字段来包含 TEXT 值的哈希值 md5 text v
  • 迭代 pandas 数据框的最快方法?

    如何运行数据框并仅返回满足特定条件的行 必须在之前的行和列上测试此条件 例如 1 2 3 4 1 1 1999 4 2 4 5 1 2 1999 5 2 3 3 1 3 1999 5 2 3 8 1 4 1999 6 4 2 6 1 5 1
  • 我应该使用排队系统来处理付款吗?

    我在用着Slim https www slimframework com和这个结合Stripe 的 PHP 库 https stripe com docs api php在我的应用程序中处理付款 一切都很好 但是直到最近 我在我的系统中发现
  • 如何在 Perl 中循环访问类的所有方法?

    如何在 Perl 中循环访问一个类的所有方法 有没有关于 Perl 内省或反射的好的在线参考 Todd Gardner 使用 Moose 的建议很好 但他选择的示例代码并不是很有帮助 如果你正在检查一个非 Moose 使用类 你会这样做 u
  • 要做或不做:将图像存储在数据库中[重复]

    这个问题在这里已经有答案了 在 Web 应用程序的上下文中 我的前老板总是说在数据库中放置对图像的引用 而不是图像本身 我倾向于同意在数据库中存储 url 与图像本身是一个好主意 但在我现在工作的地方 我们在数据库中存储大量图像 我能想到的
  • 在 Android 中获取联系方式需要花费大量时间?

    您好 目前正在做一个与联系人相关的项目 我正在从联系人中获取详细信息 电子邮件 电话号码和联系人姓名 效果很好 但问题是获取联系方式需要很长时间 超过 1000 个联系人 包括从社交网站同步的联系人 这样我就放了一个Asynchronous
  • using 块会关闭数据库连接吗?

    using DbConnection conn new DbConnection do stuff with database 会不会using块调用conn Close 是的 它会 实施DbConnection Dispose calls
  • 打包/解包 - 小端 - 64 位 - 问题

    usr bin env perl use warnings use 5 012 my var 1 lt lt 31 say unpack B pack N var 10000000000000000000000000000000 我怎样才能
  • 如何按关系的数量或成员对 Doctrine DQL 查询进行排序?

    我正在尝试创建一个查询 用于从 Doctrine 数据库中检索对象 并按特定一对多关系的成员数量排序 更具体地说 我有两个实体 Person 和 Federation 一个人可以是一个联盟的成员 人具有 联盟 关系 并且一个联盟可以有n人
  • PDO获取最后插入的ID

    我有一个查询 我想获取插入的最后一个 ID 字段ID是主键并且自动递增 我知道我必须使用这个声明 LAST INSERT ID 该语句适用于如下查询 query INSERT INTO cell place ID VALUES LAST I

随机推荐

  • 常用的医学图像分割评价指标

    常用的图像分割评价指标非常多 论文中常用的指标包括像素准确率 交并比 IOU Dice系数 豪斯多夫距离 体积相关误差 下面提到的所有案例都是二分类 标签中只有0和1 目录 一 像素准确率 二 交并比IOU 三 骰子系数Dice 四 Hau
  • 【JavaScript高级】原型和继承相关:原型对象、函数原型、原型链和继承、继承的优化、对象判断相关方法

    文章目录 原型对象 对象的原型 函数的原型 函数原型作用 new操作原型的赋值 将方法放在原型上 constructor属性 在原型中新增属性 重写函数原型对象 原型链和继承 原型链 原型链实现方法的继承 借用构造函数属性继承 继承的优化
  • java8 stream 转换list、map、set

    一 Collection Collections collect Collector Collectos Collection是Java集合的祖先接口 Collections是java util包下的一个工具类 内涵各种处理集合的静态方法
  • 基于FPGA的正弦波发生器设计与实现

    基于FPGA的正弦波发生器设计与实现 摘要 本文介绍了一种基于FPGA的正弦波发生器的设计与实现 通过使用FPGA的数字信号处理功能 可以实现高精度 高性能的正弦波生成 文章首先介绍了DDS Direct Digital Synthesis
  • vs2008中,在OCX控件中应用doc/view基本步骤

    1 利用向导创建一个MFC ActiveX Control控件CMyOCX 2 在工程中加入ActivDoc头文件和执行文件 class CActiveXDocTemplate public CSingleDocTemplate enum
  • 阿里-淘菜菜一面(电话面试)面经

    上来我先给面试官打预防针 我说我准备时间不长 可能不太行 意思是想推迟一段时间再面试 他让我别紧张 面试时间定下来不容易 就先直接面试 问题如下 1 在学校还是在家里 课程怎么样了 在学校 学分修完了 目前在学技术 2 自我介绍 人工智能学
  • Android LayoutInflater原理分析,带你一步步深入了解View(一)

    相信接触Android久一点的朋友对于LayoutInflater一定不会陌生 都会知道它主要是用于加载布局的 而刚接触Android的朋友可能对LayoutInflater不怎么熟悉 因为加载布局的任务通常都是在Activity中调用se
  • 数字化转型背景-数字化转型网

    数字化转型网szhzsw cn 数字化转型是指企业或组织将传统业务模式 流程 技术和文化等方面与数字技术相融合 实现数字化升级和转型的过程 数字化转型的背景有以下几个方面 技术发展 随着科技的不断进步 各种数字技术不断涌现 包括人工智能 物
  • Android Switch控件修改样式

    Android中自带的Switch控件在很多时候总觉得和整体系统风格不符 很多时候 自定义Switch是一种方法 但其实不用这么麻烦 安卓自带的Switch通过修改一些属性 也可以达到和自定义Switch差不多的一个效果 个人感觉 Swit
  • 对java中char的取值范围思考

    主要说一下我遇到的一个问题 就是网上关于char字符的取值范围定义 有的说是0 255 有的说是 u0000 uffff 其实 这两种说法都对 我们都知道 java中给char字符的解释是十六位 双字节 也就是按照补码的方式寻求取值范围 就
  • 延时任务-基于redis zset的完整实现

    所谓的延时任务给大家举个例子 你买了一张火车票 必须在30分钟之内付款 否则该订单被自动取消 订单30分钟不付款自动取消 这个任务就是一个延时任务 我之前已经写过2篇关于延时任务的文章 完整实现 通过DelayQueue实现延时任务 延时任
  • Elasticsearch --- 向es中导入数据

    一 从文件导入 用django启动 def zi dr request f open c txt r encoding utf 8 action index c12 type doc source title i strip 去掉 空 fo
  • 关于ES集群规模规划

    在搭建正式的生产集群之前 充分做好硬件和服务器配置以及集群规划是重中之重 磨刀不误砍柴工 硬件配置推荐 内存 ES排序以及聚合都是高度需求内存的 单机 单节点 64GB是很理想的配置 32GB或16GB也很常见 不推荐低于8GB 性价比较低
  • Elastic-Job - 分布式定时任务框架

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Elastic Job是ddframe中dd job的作业模块中分离出来的分布式弹性作业框架 去掉了和dd job中的监控和ddframe接入规范部分 该项目基于成熟的开源
  • STM32移植FATFS时处理 warning: #188-D: enumerated type mixed with another type

    在STM32上移植FATFS时disk read 函数返回类型是DRESULT 而DRESULT是一个枚举类型 所以老是会提醒 warning 188 D enumerated type mixed with another type 主要
  • 前端歌谣的刷题之路-第二十一题-css单位二

    目录 前言 题目 核心代码 总结 前言 我是歌谣 歌谣的意志是永恒的 放弃很容易 但是坚持一定很酷 本题目源自于牛客网 微信公众号前端小歌谣 题目 请将html模块div元素的宽度和高度设置为html根元素字体大小的4倍 注意 只需在css
  • 实现TextView垂直滚动以及监听

    由于新的项目中在广告轮播用到了垂直滚动显示 所以也当学习 自己定义了一个垂直滚动的view以及监听 用到TextSwitcher和ViewFactory TextSwitcher 字面理解是文字交换器 是ViewSwitcher的子类 从V
  • 【转】你在读博士期间明白的最深刻的道理是什么?

    写在前面 读博不是跟着老师学知识 都读到博士阶段了 知识的学习方法应该早已经熟练掌握 也早应该形成了一套成熟的 适合自己的知识学习方法 基础学科知识应该由自我驱动 自学来完成 那么读博期间的目标应该是培养什么 学会什么 读博的这4 6年一个
  • Express初学之入门

    1 Express简介 基于Node的极简MVC框架 提供灵活的路由功能 提供强大的中间件机制 内核极小 扩展性很好 使用广泛 2 路由机制 Express概念 定义了Api的地址 请求 响应方式 方法 天然支持HTTP Method 中的
  • grep 函数

    grep函数 如果你是个Perl的新手 你可以先跳过下面的两段 直接到 Grep vs loops 样例这一部分 放心 在后面你还会遇到它 grep BLOCK LIST grep EXPR LIST grep 函数会根据 LIST 中的元