【发布时间】:2018-10-21 21:53:30
【问题描述】:
对不起,如果这是一个基本问题,但我对 perl 有点陌生,我觉得应该有办法做到这一点,但找不到任何文档。我想知道您是否可以在没有丢弃变量$doto 的情况下执行以下操作:
my $file="foo/bar.c";
my $doto = $file;
$doto =~ s/\.c$/\.o/;
print ".o exists" if ( -f $doto );
也就是说,类似于:
print ".o exists" if ( -f ($file =~ s/\.c$/\.o/gr) );
(但这当然会产生编译错误)。
我的编译错误如下:
在第 2 行,“s/.c$/.o/gr”附近的操作员预期的位置找到了裸字
这是perl, v5.8.9
【问题讨论】:
-
请edit您的问题并告诉我们编译错误。当我适应并在 5.26 上尝试时,您的代码对我有用。
$ perl -E 'my $file = "foo.c"; say ".o exists" if -f $file =~ s/\.c$/\.o/gr;'编译,不打印任何内容。touch foo.c foo.o && perl -E 'my $file = "foo.c"; say ".o exists" if( -f ($file =~ s/\.c$/\.o/gr));'打印一个空行和.o exists。带括号和不带括号。 -
@GerhardBarnard:在此示例中,我想根据 .c 文件的名称来测试 .o 文件是否存在。但这更多是关于如何用更少的变量编写更易维护的代码。
-
@simbabque: 嗯,它不适用于 perl 5.8(实际上我的 perl 不喜欢
-E选项...),但如果我使用带有剪切和粘贴的标准输入你的代码,它抱怨。所以这只是一个版本的事情。我可以用额外的变量来做到这一点,我只是想练习编写更整洁的代码...... -
5.8 没有用于替换的
/r标志。这是在 5.14 中添加的。见perldoc.perl.org/…。 -
注意
/g修饰符在这里没有意义,应该省略。
标签: perl