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
Bash 如何在Perl中使用Shell参数扩展?_Bash_Perl_Parameter Expansion - Fatal编程技术网

Bash 如何在Perl中使用Shell参数扩展?

Bash 如何在Perl中使用Shell参数扩展?,bash,perl,parameter-expansion,Bash,Perl,Parameter Expansion,我试图实现一种Bash参数扩展技术来替换Perl脚本中现有的文件扩展名 这是我的bash代码,用于替换工作正常的文件扩展名: mv "$f" "${f%.*}.png" 另一方面,我尝试在Perl脚本中使用它,使用系统: $a保存通过命令行参数传递的目录名 它在%附近抛出语法错误,后跟字符串中缺少右花括号或方括号。错误消息中没有EOF 当我不使用%.*时,它只是在现有文件结束后追加.png,但不替换。我们将非常感谢您的帮助。不要同时使用Bash和Perl语法,这两种语言的语法都很模糊,同时使用

我试图实现一种Bash参数扩展技术来替换Perl脚本中现有的文件扩展名

这是我的bash代码,用于替换工作正常的文件扩展名:

mv "$f" "${f%.*}.png"
另一方面,我尝试在Perl脚本中使用它,使用系统:

$a保存通过命令行参数传递的目录名

它在%附近抛出语法错误,后跟字符串中缺少右花括号或方括号。错误消息中没有EOF


当我不使用%.*时,它只是在现有文件结束后追加.png,但不替换。我们将非常感谢您的帮助。

不要同时使用Bash和Perl语法,这两种语言的语法都很模糊,同时使用它们会让事情变得更糟

狂欢节:

Perl: 使用File::Basename模块

狂欢节:

Perl:

将演示放在一行Perl中: 将foo.jpg重命名为foo.png

使用重命名:

$ perl -MFile::Basename -e '$f_old=$ARGV[0];$f_new=fileparse($f_old,qr/\.[^.]*/);$f_new.=".png";rename $f_old, $f_new' foo.jpg
使用File::Copy

$ perl -MFile::Copy -MFile::Basename -e '$f_old=$ARGV[0];$f_new=fileparse($f_old,qr/\.[^.]*/);$f_new.=".png";File::Copy::move $f_old, $f_new' foo.jpg

不要同时使用Bash和Perl语法,这两种语言都有模糊的语法,同时使用它们会使事情变得更糟

狂欢节:

Perl: 使用File::Basename模块

狂欢节:

Perl:

将演示放在一行Perl中: 将foo.jpg重命名为foo.png

使用重命名:

$ perl -MFile::Basename -e '$f_old=$ARGV[0];$f_new=fileparse($f_old,qr/\.[^.]*/);$f_new.=".png";rename $f_old, $f_new' foo.jpg
使用File::Copy

$ perl -MFile::Copy -MFile::Basename -e '$f_old=$ARGV[0];$f_new=fileparse($f_old,qr/\.[^.]*/);$f_new.=".png";File::Copy::move $f_old, $f_new' foo.jpg

因此,您希望替换扩展名-以更改文件名。一旦使用了Perl脚本,就没有理由使用shell

手动更改扩展名很容易,请参见下面的库。用正则表达式

my $new_filename = $filename =~ s/.*\.\K.*/$new_extension/r;
。*贪婪地匹配到最后一个。在模式中遵循,然后\K删除所有匹配项,以便我们只替换它后面的匹配项。或者,使用绳端锚$

什么匹配和替换了所有非。位于..之后字符串末尾的字符。。 在这两种情况下,修饰符/r使其返回新字符串并保持原始字符串不变;如果没有它,字符串$filename将被更改

现在更改磁盘上文件的名称。标准工具是

如果你注意到了它,保持冷静,走过它。可以查看其链接页面

通常最可靠的方法是使用合适的库,当然也有一些好的库可以用于此。这里是您需要安装的有用工具

use Path::Tiny;

my $path = path($filename);

my $new_fqn = $path->parent->child( $path->basename(qr/[^.]+/) . $new_ext );
请参阅本模块的链接文档,但这里是对上述内容的简要说明

父方法以path::Tiny对象的形式返回最后一个组件文件/目录的路径。然后,对其调用的子方法向其添加另一个组件

为此,我们得到最后一个组件的basename,在本次使用中剥离了扩展,然后将新扩展附加到它。瞧,我们把分机换了,回到了整条路。这会对路径进行两次解析,一次用于父级,一次用于basename

这样做的另一个好处是模块还具有移动方法,因此

$path->move($new_fqn);
完成工作

模块检查错误,并发出咯咯声或抛出异常

旧的、久经考验的UNIX方法是使用内核


然后使用File::Copy::move重命名文件。

因此您希望替换扩展名-以更改文件名。一旦使用了Perl脚本,就没有理由使用shell

手动更改扩展名很容易,请参见下面的库。用正则表达式

my $new_filename = $filename =~ s/.*\.\K.*/$new_extension/r;
。*贪婪地匹配到最后一个。在模式中遵循,然后\K删除所有匹配项,以便我们只替换它后面的匹配项。或者,使用绳端锚$

什么匹配和替换了所有非。位于..之后字符串末尾的字符。。 在这两种情况下,修饰符/r使其返回新字符串并保持原始字符串不变;如果没有它,字符串$filename将被更改

现在更改磁盘上文件的名称。标准工具是

如果你注意到了它,保持冷静,走过它。可以查看其链接页面

通常最可靠的方法是使用合适的库,当然也有一些好的库可以用于此。这里是您需要安装的有用工具

use Path::Tiny;

my $path = path($filename);

my $new_fqn = $path->parent->child( $path->basename(qr/[^.]+/) . $new_ext );
请参阅本模块的链接文档,但这里是对上述内容的简要说明

父方法以path::Tiny对象的形式返回最后一个组件文件/目录的路径。然后,对其调用的子方法向其添加另一个组件

为此,我们得到最后一个组件的basename,在本次使用中剥离了扩展,然后将新扩展附加到它。瞧,我们把分机换了,回到了整条路。这会对路径进行两次解析,一次用于父级,一次用于basename

这样做的另一个好处是模块还具有移动方法,因此

$path->move($new_fqn);
完成工作

该模块检查是否存在错误,以及c 漫游或抛出异常

旧的、久经考验的UNIX方法是使用内核


然后使用File::Copy::move重命名文件。

在Perl中有双引号字符串,这意味着$variables在Perl中插入。这就像用Perl编写一样

my $xx="abc"
my $yy=${xx%.*}

你会得到同样的错误

在Perl中有双引号字符串,这意味着$variables是在Perl中插入的。这就像用Perl编写一样

my $xx="abc"
my $yy=${xx%.*}


你会得到同样的错误

这回答了你的问题吗?另外,check->system的多参数形式根本不运行shell,因此不支持任何shell语法。无论如何,当您使用Perl时,为什么要使用shell PEs?Perl更具表现力。您好,谢谢您提供的信息。我不熟悉Perl和Bash脚本。我设法在bash中执行了任务,但无法在Perl中完成任务。有什么解决方法吗?首先,不能保证系统会使用bash,所以如果您想确保bash执行代码,您应该显式地这样做。但是由于Perl中的参数扩展不是完全在BASH中可用的,而是至少在使用函数的POSIX SHILX中可用的程度上,您可以考虑在Perl中完全编写代码,而不创建子进程。这能回答您的问题吗?另外,check->system的多参数形式根本不运行shell,因此不支持任何shell语法。无论如何,当您使用Perl时,为什么要使用shell PEs?Perl更具表现力。您好,谢谢您提供的信息。我不熟悉Perl和Bash脚本。我设法在bash中执行了任务,但无法在Perl中完成任务。有什么解决方法吗?首先,不能保证系统会使用bash,所以如果您想确保bash执行代码,您应该显式地这样做。但是由于您在Perl中的参数扩展不是完全在BASH中可用的,而是至少在使用函数的POSIX SHILX中可用的程度上,您可以考虑在Perl中完全编写代码,而不创建子进程。谢谢您的回答。我是Perl新手,我理解您的答案并一点一点地实现它;只返回裸名称,不带扩展名,不带路径。这不适合重命名文件。另外,我建议不要重命名,因为太多的细节无法解释。请看文档。@zdim谢谢你的建议,我更新了我的答案。我已经有一段时间没有使用Perl了,TIMTOWTDI的日子似乎已经过去了:一个有趣的观点!当然,虽然蒂姆托瓦蒂还活着,而且身体状况良好,但我要说的是,人们现在确实在区分某些方面优于其他方面。注:方法。复数:@zdim同意!佩勒总是很友善:谢谢你的回答。我是Perl新手,我理解您的答案并一点一点地实现它;只返回裸名称,不带扩展名,不带路径。这不适合重命名文件。另外,我建议不要重命名,因为太多的细节无法解释。请看文档。@zdim谢谢你的建议,我更新了我的答案。我已经有一段时间没有使用Perl了,TIMTOWTDI的日子似乎已经过去了:一个有趣的观点!当然,虽然蒂姆托瓦蒂还活着,而且身体状况良好,但我要说的是,人们现在确实在区分某些方面优于其他方面。注:方法。复数:@zdim同意!佩勒总是很友善:谢谢你的帮助。我将实施你的解决方案。请不要删除您的答案。非常感谢@我只想补充一点,还有两种方法可以做到这一点:谢谢你的努力和解释。终于成功了。早些时候,当我将move函数括在括号中时,它给出了一个错误,在void上下文中无用地使用私有变量,然后我删除了括号并运行了它。知道它为什么说无用吗?不管怎样,它成功了。非常感谢@利昂斯,肯尼迪,嗯。。。你是如何准确地附上的?它应该和帕伦斯一起工作。当然,没有他们我会觉得更干净,这就是为什么我把他们排除在外。感谢您的归属-请继续关注,我将添加…首先我喜欢移动$a/$fileName、$a/$new_fileName或die不能移动:$!;除了无用的用法错误,它还表示用法:moveFROM,to error。然后我去掉了括号,它就像一个符咒谢谢你的帮助。我将实施你的解决方案。请不要删除您的答案。非常感谢@我只想补充一点,还有两种方法可以做到这一点:谢谢你的努力和解释。终于成功了。早些时候,当我将move函数括在括号中时,它给出了一个错误,在void上下文中无用地使用私有变量,然后我删除了括号并运行了它。知道它为什么说无用吗?不管怎样,它成功了。非常感谢@利昂斯,肯尼迪,嗯。。。你是如何准确地附上的?它应该工作 当然,如果没有帕伦斯,我会觉得更干净,这就是为什么我把他们排除在外。感谢您的归属-请继续关注,我将添加…首先我喜欢移动$a/$fileName、$a/$new_fileName或die不能移动:$!;除了无用的用法错误,它还表示用法:moveFROM,to error。然后我去掉了括号,它就像一个符咒
use File::Basename;

my ($name, $path, $ext) = fileparse($filename, qr/\.[^.]*/); 

my $new_fqn = "$path/$name.$new_ext";
my $xx="abc"
my $yy=${xx%.*}