Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果Perl文件中存在特定的regexp,如何获取文件名_Regex_Perl_Format_Filenames_Cpan - Fatal编程技术网

如果Perl文件中存在特定的regexp,如何获取文件名

如果Perl文件中存在特定的regexp,如何获取文件名,regex,perl,format,filenames,cpan,Regex,Perl,Format,Filenames,Cpan,在包含许多文件的目录中,如果在文件中找到特定的regexp(或格式),则获取该文件名 例如: 如果在名为ramayana的文件中找到“rama”一词,请打印文件名“ramayana” 如果文件名table中包含类似“(TEXT-NUMBERS)”的particualr格式,请打印该文件名表 在贝壳里,这很容易,就像 grep“mytext”*| cut-d':'-f1 | uniq 但是如何在perl中实现呢 如果有任何特殊的CPAN模块对此有帮助,请建议我 谢谢 perl -ne 'END {

在包含许多文件的目录中,如果在文件中找到特定的regexp(或格式),则获取该文件名

例如:

  • 如果在名为ramayana的文件中找到“rama”一词,请打印文件名“ramayana”
  • 如果文件名table中包含类似“(TEXT-NUMBERS)”的particualr格式,请打印该文件名表
  • 在贝壳里,这很容易,就像

    grep“mytext”*| cut-d':'-f1 | uniq 但是如何在perl中实现呢

    如果有任何特殊的CPAN模块对此有帮助,请建议我

    谢谢

    perl -ne 'END { print join("\n", sort keys %found)} if (/PATTERNTOMATCH/) {$found{$ARGV[0]}=1;}' *
    
    我的第一次尝试是:

    perl -ne 'if (/PATTERNTOMATCH/) {print "$ARGV[0]\n";}' *
    
    但如果它在一个文件中匹配多次,则会打印出多个文件名。为了停止显示重复,我尝试使用“last”来打破隐式循环,但它似乎不起作用。因此,上面的示例是,每当找到匹配项(if(/PATTERNTOMATCH…)时,将文件名放入哈希中,然后在结束块(在开头!)中,它从哈希中打印密钥(以删除重复的文件名)

    恐怕有点可怕。我会坚持上面DavidO提到的CPAN模块

    我的第一次尝试是:

    perl -ne 'if (/PATTERNTOMATCH/) {print "$ARGV[0]\n";}' *
    
    但如果一个文件中匹配多次,则会打印出多个文件名。为了停止显示重复项,我尝试使用“last”来打破隐式循环,但似乎不起作用。因此,上面的示例在找到匹配项时(if(/PATTERNTOMATCH…)将文件名放入哈希,然后在结束块中(在开头!),它从散列中打印密钥(以删除重复的文件名)


    恐怕这有点可怕。我坚持使用上面DavidO提到的CPAN模块

    您的示例听起来比shell一行程序复杂。这相当于perl中的一行程序:

    perl -nlwe 'if (/mytext/) { print $ARGV; close ARGV }' *
    

    -n
    打开文件并读取内容。
    -l
    添加换行符以打印(为方便起见)。如果找到文本,我们将关闭文件句柄以避免打印多个匹配项。如果要处理更多文件,它将再次打开。

    您的示例听起来比shell one liner更复杂。这相当于perl中的one liner:

    perl -nlwe 'if (/mytext/) { print $ARGV; close ARGV }' *
    

    -n
    打开文件并读取内容。
    -l
    添加换行符以打印(为方便起见)。如果找到文本,我们将关闭文件句柄以避免打印多个匹配项。如果要处理更多文件,它将再次打开。

    file::Find或file::Find::Rule。剩下的只是读取这些模块之一的POD,并提供必要的“want()”函数(file::Find),或必要的规则和操作(File::Find::Rule)。如果您只关心一个目录(而不是递归深度),只需opendir、readdir、打开每个文件等。您知道……programming.Hmm:)感谢您介绍itFile::Find或File::Find::Rule。剩下的只是阅读其中一个模块的POD,并提供必要的“想要的()”函数(File::Find),或必要的规则和操作(File::Find::Rule)。如果您只关心一个目录(而不是递归深度),只是opendir,readdir,打开每个文件,等等。你知道…programming.Hmm:)谢谢你的介绍,非常抱歉打扰你。实际上我有一个数组,其中包含一个单词列表,可以在文件目录中搜索(有时是递归的)。但是当我尝试使用while()对于同一个程序中的不同任务,它会两次进入等待模式(既不显示任何错误也不打印输出),如何避免我有一个包含100多个元素的数组@list_代码。当我试图这样搜索它们时,foreach$ele(@list_代码){while(){if(/\Q$ele\E/){print“$ARGV\n”;close ARGV;}}提示变为等待模式,这有点不同,知道吗!!对于第一个ele循环,操作员正在检查所有文件。一旦进入第二个循环,它就没有什么可读取的了,所以等待标准输入。我不知道如何“重置”它以在文件上重新开始,所以可能将foreach放在while循环中(这样它会在第一个文件中查找所有元素,然后在第二个文件中查找所有元素)。我不确定这是否破坏了您正在尝试的操作。是的,您明白我的意思,但现在的问题是如何重置它!!这是“foreach解决方案”我的问题不起作用它将显示数组元素包含的所有文件列表,这不是预期的。所需的输出应该是这样的,第一个数组元素在这么多的文件及其文件名中找到。第二个数组元素在这么多的文件及其文件名中找到。第三个数组元素..等等!!希望这次我在我的q中是清楚的很抱歉打扰您。实际上,我有一个数组,其中包含要在文件目录中搜索的单词列表(有时是递归的)。但是,当我尝试对同一程序中的不同任务使用while()两次时,它进入了等待模式(既不显示任何错误,也不打印输出),如何避免这种情况,我有一个数组@list_代码,它包含100多个元素。当我试图像这样搜索它们时,每个$ele(@list_代码){while(){if(/\Q$ele\E/){print“$ARGV\n”;close ARGV;}}提示变为等待模式,这有点不同,知道吗!!对于第一个ele循环,操作员正在检查所有文件。一旦进入第二个循环,它就没有什么可读取的了,所以等待标准输入。我不知道如何“重置”它以在文件上重新开始,所以可能将foreach放在while循环中(这样它会在第一个文件中查找所有元素,然后在第二个文件中查找所有元素)。我不确定这是否破坏了您正在尝试的操作。是的,您明白我的意思,但现在的问题是如何重置它!!这是“foreach解决方案”对我的问题不起作用它将显示数组元素包含的所有文件列表,这不是预期的。所需的输出应该是,第一个数组e