Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
Regex perl中正则表达式的特殊问题_Regex_Perl - Fatal编程技术网

Regex perl中正则表达式的特殊问题

Regex perl中正则表达式的特殊问题,regex,perl,Regex,Perl,我正在尝试打印当前目录中没有尾随“~”字符的所有文件名。 目录中的文件包括: mnt.txt xyz.pl abc.pl abc.pl~ 输出应该是 mnt.txt xyz.pl abc.pl 我使用以下逻辑: @arr= qx( ls -A ); $pattern = "[a-z|A-Z|0-9]*\.[a-z]*[^~]"; foreach $fname (@arr){ if ( $fname =~ m/${pattern}/g ) { print $fname; } 但它不起作用,它

我正在尝试打印当前目录中没有尾随“~”字符的所有文件名。 目录中的文件包括:

mnt.txt
xyz.pl
abc.pl
abc.pl~
输出应该是

mnt.txt
xyz.pl
abc.pl
我使用以下逻辑:

@arr= qx( ls -A );
$pattern = "[a-z|A-Z|0-9]*\.[a-z]*[^~]";
foreach $fname (@arr){
if ( $fname =~ m/${pattern}/g )
{
print $fname;
}
但它不起作用,它需要所有的文件名

但是,如果我将
$pattern
更改为
“[a-z | a-z | 0-9]*\.pl[^~]”
,则其输出是正确的


我能做些什么来解决这个问题?请引导,因为我希望显示包括文本在内的所有文件。

尽量避免解析
ls
的输出。或者,您可以使用
opendir()
readdir()
函数读取目录内容,并使用
grep()
对其进行过滤,如:

perl -e '
    opendir $dh, q|.|; 
    for ( grep { ! m/~$/ } readdir $dh ) { 
        printf "%s\n", $_ 
    }
'

尽量避免分析
ls
的输出。或者,您可以使用
opendir()
readdir()
函数读取目录内容,并使用
grep()
对其进行过滤,如:

perl -e '
    opendir $dh, q|.|; 
    for ( grep { ! m/~$/ } readdir $dh ) { 
        printf "%s\n", $_ 
    }
'

@Birei的回答是正确的,但要回答您的问题,您必须锚定您的正则表达式:

$pattern = qr"^[a-zA-Z0-9]+\.[a-z]+[^~]$";

@Birei的回答是正确的,但要回答您的问题,您必须锚定您的正则表达式:

$pattern = qr"^[a-zA-Z0-9]+\.[a-z]+[^~]$";

但是我得到了模式“[a-z | a-z | 0-9]*\.pl[^~]”的o/p。为什么它匹配一个而不匹配另一个?@Samboy786:character类中的管道没有您认为它具有的含义。Last
[^~]
使正则表达式至少匹配一个字符。
\.pl
txt
文件不匹配。您的正则表达式既不使用锚点作为字符串的开头也不使用锚点作为字符串的结尾。它在很多方面都失败了,非常感谢。我从@M42那里得到了答案。我注意到我在结尾没有使用\$,这造成了问题。但是我得到了模式“[a-z | a-z | 0-9]*\.pl[^~]”的o/p。为什么它匹配一个而不匹配另一个?@Samboy786:character类中的管道没有您认为它具有的含义。Last
[^~]
使正则表达式至少匹配一个字符。
\.pl
txt
文件不匹配。您的正则表达式既不使用锚点作为字符串的开头也不使用锚点作为字符串的结尾。它在很多方面都失败了,非常感谢。我从@M42那里得到了答案。我注意到我在结尾没有使用\$,这造成了问题。不需要解析整个文件名
qr/[^~]$/
就可以了。不需要解析整个文件名
qr/[^~]$/
就可以了。