[码海拾贝 之Perl]在字符串数组中查找特定的字符串是否存在

前言

检索一个字符串是否存在于一个数组中, 最基本的想法应该就是对数组进行循环, 逐个判断数组的每个元素值和给定的值是否相等。

(在Java语言还可以把数组转成 List , 在 list 中直接有 contains 方法可以使用)

看一段简单的代码:

my @arr2 = qw(str1 str2 str3 str4);
foreach(@arr2)
{
	if($_ eq "str2")
    {
    	print "str2 exist in Array!\n";
    	last;
    }
}

这段代码看起来挺简洁,也不难理解。 但是在Perl 在还有另外一种方法,只需要一行代码就能达成这样的效果。 就是使用 grep 函数

grep 简介

grep 的全称是 Global Regular Expression Print, 翻译一下是全局正则表达式版本。

如果使用过Linux命令的话对这个词应该不陌生。

看一个常见的linux 命令

ps -ef | grep java

ps -ef 是查看所有的进程

加上 grep java 的意思是 搜索系统进程中包含 java 名字的进程。

也就是说在linux 中, grep 能使用正则表达式搜索文本, 并把匹配的行打印出来。

触类旁通, 在Perl 中  grep 函数的作用也类似

Perl grep 函数

在Perl 中 , grep 函数的调用方式有两种:

方式1. grep BLOCK LIST

方式2. grep EXPT, LIST

BLOCK: 表示一个Code 块, 通常用 {}表示;

EXPR 表示一个表达式, 通常是正则表达式

LIST: 要匹配的列表

grep函数对列表里的每个元素进行BLOCK或EXPR匹配,它遍历列表,并临时设置元素为$_。

在列表上下文里,grep返回匹配命中的所有元素,结果也是个列表。

在标量上下文里,grep返回匹配命中的元素个数。

比较一下下面的代码:

my @arr3 = qw(str1 str2 str3 str4 str11);
my $str = "str1";
my $result =grep /^$str/, @arr3;
my @result2 =grep /^$str/, @arr3;
print "grep result=$result \n";            # 返回个数
print "grep [email protected] \n";       # 返回元素

这里在数组中匹配以str1 开头的字符串元素

(提示 在正则表达是中:^-- 表示开头  , $ 表示结尾 )

所以要精确匹配到某个字符串, 使用如下方式:

my $result =grep /^$str$/, @arr3;

到此 , 标题所给出的议题也就达成了。

时间: 2024-10-13 16:09:49

[码海拾贝 之Perl]在字符串数组中查找特定的字符串是否存在的相关文章

纯JS实现在一个字符串b中查找另一个字符串a出现的所有位置,并且不使用字符串的方法(递归)

问题:判断字符串A在中所有出现字符串B中(长度大于1)的索引.不得使用字符串方法indexof,substring等 有小伙伴在面试遇到了这个问题,乍一看如果使用使用字符串方法indexof,substring,很简单容易实现,但如果不使用这些方法,怎么样才能实现这个需求呢 // 思路: 如果不能使用字符串的相应方法,我们可以把字符串转换成数组,使用递归函数不断去比对相应的数组索引,然后把满足条件的索引打印出来,其实很多现在前后端交互处理数据的方法,用的都是递归偏多,千万别小瞧递归! 话不多说,

[Matlab] 如何在矩阵中查找特定的字符串

题目 A = {'abcd','efgh','ijkl'; 'bd3','skge','zxe2'}:怎样查找A中字符串的是否含有字符串"bd3",如有返回字符串所在的行号和列号. 解决办法 使用 strcmp(A,'YourKeyString') >> A = {'abcd','efgh','ijkl'; 'bd3','skge','zxe2'}[i,j] = find(strcmp(A, 'bd3')) A =     'abcd'    'efgh'    'ijkl

[码海拾贝 之Perl]获取日期以及日期的加减

前言 在Perl 中, 不安装其他模组的状况下, 可以使用 localtime 来获取当地日期和时间. 在标量上下文中, 返回的是字符串格式. my $localtime = localtime(); print "\n$localtime\n"; 返回: Thu Jan  1 18:17:56 2015 在列表上下文中, 返回的是描述当前时间的一个元素列表 my ($sec,$min,$hour,$mday,$mon,$year_off,$wday,$yday,$isdat) = l

实现字符串数组中字符串交换

实现字符串数组中字符串交换 2015-06-01  青岛  张俊浩 <实现字符串数组字符串交换>分为三部分: [1]论坛帖子 [2]代码思路 [3]代码.运行结果 1.论坛帖子 2.代码思路 (1)两个字符串等长正常交换即可: (2)两个字符串不等长交换短字符串宽度的字符数据(包括结束符),拷贝长字符剩余字符到短字符串数据区(此时长字符串剩余数据还在内存只是被结束符'\0'分割). 3.代码.运行结果 #include<stdio.h> void swap(char *a,char

字符串数组 输入3个字符串,要求按由小到大的字母顺序输出; 输入n个学生的姓名和学号到字符串数组中,在输入一个姓名,如果班级有该生则返回其信息,否则返回本班无此人

输入3个字符串,要求按由小到大的字母顺序输出 如 输入franch england china,输出结果是china england franch 三个数排序输出,比较三个数的大小怎么做? a=18 b= 9 c=30 a>b 交换 a=9 b=18 可不可以用选择法?可不可以用冒泡法?但是这里用不着 例题: string1 string2 string3 temp a=18 b= 9 c=30 b>c? 交换 b中放的是b 和 c 中小的数,c中放的是bc中大的数. 如果a<b,则输出

07.C#中如何排除/过滤/清空/删除掉字符串数组中的空字符串

方式一:使用lambda表达式筛选过滤掉数组中空字符串         1 /// <summary> 2 /// 使用lambda表达式排除/过滤/清空/删除掉字符串数组中的空字符串 3 /// </summary> 4 /// <param name="args"></param> 5 static void Main(string[] args) 6 { 7 string[] strArray = { "",&q

前台传过来的字符串数组,无缝转化为字符串

前台传过来的字符串数组,无缝转化为字符串 比如刚开始的字符串数组:<11,111,111>,需要转换为11,111,111 代码如下: String keyResult=null; StringBuffer stringBuffer=new StringBuffer(); if (keyword!=null){ for (int i = 0; i < keyword.length; i++) { stringBuffer.append(keyword[i]+','); } stringB

将字符串s1中的任何与字符串s2中字符匹配的字符都删除

编写一个程序,将字符串s1中的任何与字符串s2中字符匹配的字符都删除. 函数原型:void my_squeeze(char s1[], char s2[]) #include <stdio.h> void my_squeeze(char s1[], char s2[]) { int i = 0; int j = 0; while (s2[j]) { while(s1[i]) { if (s2[j]==s1[i]) { while (s1[i+1]) { s1[i] = s1[i + 1]; i

14.输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)

待完善! 转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4259199.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目: 输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.要求时间复杂度是O(n).如果有多对数字的和等于输