运行以#!/usr/bin/perl -w
开头的文件时,出现错误:
第153行“ =〜?”附近的语法错误
我尝试添加“#!/ bin / bash”,此错误未附加,但是我得到另一个
错误: “第34行:意外令牌'('”附近的语法错误
文件中的第153行:
($output_volume =~ ?^([\S]+).mnc?) && ($base_name = $1) ||
die "sharpen_volume failed: output volume does not appear to be"
." a minc volume.\n";
第34行在我的文件中: 使用MNI :: Startup qw(nocputimes);
答案 0 :(得分:9)
$output_volume =~ ?^([\S]+).mnc?
此二手是有效的perl,因此可能会出现在旧的代码和说明材料中。
来自perlop:
过去,m中的前m个?是可选的,但是省略它会产生弃用警告。从v5.22.0开始,省略它会产生语法错误。如果您在较早的代码中遇到此构造,则只需添加m。
答案 1 :(得分:8)
这是Perl代码,因此第一个错误消息是有意义的。
在match运算符中使用[TestFixture]
public class DirectSoundTests
{
[Test]
[Category("IntegrationTest")]
public void CanEnumerateDevices()
{
foreach(var device in DirectSoundOut.Devices)
{
Debug.WriteLine(String.Format("{0} {1} {2}", device.Description, device.ModuleName, device.Guid));
}
}
}
以外的定界符时,您必须具有明确的//
,因此
m
只有$output_volume =~ m?^([\S]+).mnc?
分隔符才可以省略//
;来自Regex Quote-Like Operators (perlop)
如果
m
是定界符,则初始"/"
是可选的。
有关正则表达式的教程介绍,请参见perlretut;有关参考,请参见perlre。
还要注意,m
的特定定界符在特殊情况下会触发特定的正则表达式行为。上面链接的?
中文档部分的末尾对此进行了讨论。
答案 2 :(得分:5)
您已经有两个答案可以解释问题了。
? ... ?
不再是匹配运算符的有效语法。您需要使用m? ... ?
。但是,还有其他几点可能值得提出。
#!/usr/bin/perl -w
更改为#!/bin/bash
来进行调查。我不确定您怎么看这会有所帮助。该行定义了用于运行代码的程序。有了Perl代码后,您需要使用Perl运行它。尝试使用bash运行它很有用。m? ... ?
(或以前的? ... ?
)语法触发了晦涩而又特殊的行为。在我看来,您的情况并不需要这种行为,因此您可以将其更改为更常见的/ ... /
。\.
),以使其与实际的点(而不是任何字符)匹配。