ウインドウズ環境でファイルロックを使ってもエラーを出さないようにするには
eval{flock(READ,2);};
を使うと思うのですが
ある書籍に
eval{flock(READ,2)};
とブロック内の「;」が抜けて表記されているものがありました。
ただの誤植かなともおもったのですが付属のCD-ROMにもそうなっていましたし、その本のなかでは一貫して前述した通りの表記になっていました。
これではUNIX上でファイルロックがかからないと思うのですが、、、、
ただの作者の認識違いで片付けてしまっていいのでしょうか??
それとも、ブロック内に「;」をつけてはいけないのでしょうか?そんなハズはないとおもうのですが・・・

このQ&Aに関連する最新のQ&A

A 回答 (1件)

{}(ブロック)を使用して内部に文を書く場合基本的にセミコロンを付けますが、ブロック内の最後の文に限ってセミコロンは省略可能です。


今回の例ではブロック内は単文ですから、即ち最後の文となりセミコロンを省略しても良いことになります。
    • good
    • 0
この回答へのお礼

今、単純な変数展開をして確かめたところ、おっしゃるとおりちゃんと実行されていました!
既に納品したあとに気付いたのでアセリマシタ。
perlをあまり使ったことがないので、自信がなくしょうもない質問をしてしまいました。
答えてくださってありがとうございます!

お礼日時:2001/09/27 16:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q{ブロック}の外でのみ use utf8; したいのだが・・・

連投申し訳ありません。
「まるごとPerl」(2006年9月、インプレス刊)という本の「まるごとEncode」という記事に従ってEncodeの勉強をしています。
原記事は UNIX(というか端末コードをUTF-8に出来る環境)ですが、それをWindowsに移植しようとして苦労しています。

#! perl
# list3 -- UTF-8モードとバイトモードの切り替え
#      インデントを表現するために全角空白を使っています

use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 追加

# ブロックの外側ではUTF-8文字単位で解釈される
use utf8;

{
 # ブロックの外側ではバイトモードが強制される
 use bytes;
 my $text = '漢字、カタカナ、ひらがなの混じったtext';
 print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい
}

my $text = '漢字、カタカナ、ひらがなの混じったtext';
print substr($text, 3, 4); # カタカナと表示されたい

__END__

というプログラムを実行すると

C:\>list3.pl
カタカナカタカナ

と表示されてほしいのですが、

C:\>list3.pl
Cannot decode string with wide characters at C:/strawberry/perl/lib/Encode.pm li
ne 174.

と表示されます。

use utf8 を後ろにズラして

#! perl
# list3 -- UTF-8モードとバイトモードの切り替え
#      インデントを表現するために全角空白を使っています

use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 追加


{
 # ブロックの外側ではバイトモードが強制される
 use bytes;
 my $text = '漢字、カタカナ、ひらがなの混じったtext';
 print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい
}

# ブロックの外側ではUTF-8文字単位で解釈される
use utf8; # 移動
my $text = '漢字、カタカナ、ひらがなの混じったtext';
print substr($text, 3, 4); # カタカナと表示されたい

__END__

とするとうまく動いて

C:\>list3.pl
カタカナカタカナ

と表示されます。

#! perl
# list3 -- UTF-8モードとバイトモードの切り替え
#      インデントを表現するために全角空白を使っています

use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 追加

# ブロックの外側ではUTF-8文字単位で解釈される
use utf8;
my $text = '漢字、カタカナ、ひらがなの混じったtext'; # 移動
print substr($text, 3, 4); # カタカナと表示されたい # 移動

{
 # ブロックの外側ではバイトモードが強制される
 use bytes;
 my $text = '漢字、カタカナ、ひらがなの混じったtext';
 print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい
}

__END__

のようにするとやはり最初と同じエラーになりますが、

#! perl
# list3 -- UTF-8モードとバイトモードの切り替え
#      インデントを表現するために全角空白を使っています

use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 追加

# ブロックの外側ではUTF-8文字単位で解釈される
use utf8;
my $text = '漢字、カタカナ、ひらがなの混じったtext'; # 移動
print substr($text, 3, 4); # カタカナと表示されたい # 移動

no utf8; # 追加

{
 # ブロックの外側ではバイトモードが強制される
 use bytes;
 my $text = '漢字、カタカナ、ひらがなの混じったtext';
 print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい
}

__END__

だと大丈夫です。

結果として、ブロックの外で use utf8;、中では use bytes; という記事の著者の意図通りに動作しないようで、ブロックの中まで use utf8; が効いているようです・・・。

これは Perl の実装が変わったのでしょうか。
使用しているのは Windows XP Home SP3+Strawberry Perl v5.10.0 です。

連投申し訳ありません。
「まるごとPerl」(2006年9月、インプレス刊)という本の「まるごとEncode」という記事に従ってEncodeの勉強をしています。
原記事は UNIX(というか端末コードをUTF-8に出来る環境)ですが、それをWindowsに移植しようとして苦労しています。

#! perl
# list3 -- UTF-8モードとバイトモードの切り替え
#      インデントを表現するために全角空白を使っています

use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 追加

# ブロックの外側ではUT...続きを読む

Aベストアンサー

「まるごとPerl」という書籍を所有していないので、そこでどのようなコードが
書かれているのかが分かりませんが、以下のように一旦、変数に格納するとうま
く動作するようです。

試した環境は、

OS:Windows XP SP2
Perl:ActivePerl 5.8.9

です。

use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 追加

# ブロックの外側ではUTF-8文字単位で解釈される
use utf8;

{
# ブロックの外側ではバイトモードが強制される
use bytes;
my $text = '漢字、カタカナ、ひらがなの混じったtext';

#-- まず一時変数に代入 --------------------------
my $clipped_text = substr($text, 9, 12);
#------------------------------------------------

print Encode::decode('UTF-8', $clipped_text); # カタカナと表示されたい
}

my $text = '漢字、カタカナ、ひらがなの混じったtext';
print substr($text, 3, 4); # カタカナと表示されたい

__END__


下記エラー内容から推測して、

>Cannot decode string with wide characters at
>C:/strawberry/perl/lib/Encode.pm line 174.

内部表現の文字をdecodeしようとして失敗しているのではと思い、一旦、encode
してみました。

use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 追加

# ブロックの外側ではUTF-8文字単位で解釈される
use utf8;

{
# ブロックの外側ではバイトモードが強制される
use bytes;
my $text = '漢字、カタカナ、ひらがなの混じったtext';
print Encode::decode('UTF-8', Encode::encode('utf8', substr($text, 9, 12))); # カタカナと表示されたい
}

my $text = '漢字、カタカナ、ひらがなの混じったtext';
print substr($text, 3, 4); # カタカナと表示されたい

__END__

そうすると、エラーが出なくなったので、バイトストリームとしてではなく内部
表現のまま処理されているようです。

引数の中でsubstrを使った場合、use bytesが効いていないように見えます。
バグなのか仕様なのか、はたまた私の勘違いなのかはわかりません。

私より詳しい人が解明してくれるでしょう。

「まるごとPerl」という書籍を所有していないので、そこでどのようなコードが
書かれているのかが分かりませんが、以下のように一旦、変数に格納するとうま
く動作するようです。

試した環境は、

OS:Windows XP SP2
Perl:ActivePerl 5.8.9

です。

use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 追加

# ブロックの外側ではUTF-8文字単位で解釈される
use utf8;

{
# ブロックの外側ではバイトモードが強制される
use bytes;
my $text = '漢字、カタカナ、ひ...続きを読む

Q文字コードについて \x{53d6}表記法?

Perl5.8を使っています。
下のプログラムを実行すると、「取得」と表示されますが、この逆で"取得"文字列から、 \x{53d6}\x{5f97}を求めたいです。

また、\x{53d6}は バイトオーダー無しのUTF8の数値という意味でしょうか?


use utf8;
use encoding "shiftjis";

print "\x{53d6}\x{5f97}";
# 取得と表示されますが、この逆で"取得"文字列から、 \x{53d6}\x{5f97}を求めたい。

# \x{53d6}は バイトオーダー無しのUTF8の数値という意味でしょうか?

Aベストアンサー

こんな感じ
---------------------------------------------------------------
use encoding "shiftjis";
use Encode;
print "\x{53d6}\x{5f97}\n";

$text="取得";
print "$text\n";
$data=Encode::encode("UTF-16LE",$text);
for $x (unpack("S*",$data)){
printf("\\x{%04x}",$x);
}
----------------------------------------------------------------
># \x{53d6}は バイトオーダー無しのUTF8の数値という意味でしょうか?
UTF8ではなくてUnicode(コード)

Q{ ; }とは、どういう意味?

現在読んでいるスクリプトに以下のような部分があります。
---------------------
if($FORM{'name'} ne ''){
・・・・・・・・・・・・・・・・
・・・・(略)・・・・・・・・・
}else{ ; }
----------------------
最後の部分{ ; }とは、どういう意味でしょうか?

Aベストアンサー

No1さんも答えてますが、これだけでは何もしません。
なので、書くだけ無駄なので

if($FORM{'name'} ne ''){
・・・・・・・・・・・・・・・・
・・・・(略)・・・・・・・・・
}

でいいわけです。

if文は

if(条件式){
条件式が"真"だったときの処理
}else{
条件式が"偽"だったときの処理
}

です。

;はプログラムとしての改行に使われます。

QData::Dumper;でダンプ後表示した文字列\x{30fc}...

お世話になります。
下記のスクリプトを使ってrssファイル内をuse Data::Dumper;でダンプして表示してみたのですが、rssファイルがutf8で記述されているせいか
表示時に日本語の所が\x{30fc}のような文字列になってしまいます。
これをshiftjisで表示させたいのですが、試行錯誤してもうまくいきません。
どなたかご教授いただけませんでしょうか。

#!/usr/bin/perl

BEGIN{
$| = 1;
print "Content-type: text/html\n\n";
open(STDERR, ">&STDOUT");
}

use XML::RSS;
use Data::Dumper;
my $rss = new XML::RSS;
#表示形式の違いで1と2がある。
$Data::Dumper::Indent = 1;
use open IN => ":utf8"; # 入力をUTF8とする
use open OUT => ":shiftjis";
#use open ":std";
#use Encode;
#use encoding 'shiftjis', STDIN=>'utf8', STDOUT=>'sjis';
#binmode STDOUT, ":encoding(utf-8)";
#binmode STDOUT, ":encoding(shiftjis)";
#binmode STDOUT, ":encoding(euc-jp)";
#use open ":encoding(shiftjis)";

# rssをセット。
open my $fh, '< ./test.rss';
my $text = join undef, <$fh>;
close $fh;

# rssをパース
$rss->parse($text);

# ひとまず中見を知る為にダンプしてみる
print "Content-type:text/html;charset=Shift_JIS\n\n";
print "<html><head>\n";
print "<title></title></head>\n";
print "<body>\n";
print Data::Dumper->Dump([$rss]);

お世話になります。
下記のスクリプトを使ってrssファイル内をuse Data::Dumper;でダンプして表示してみたのですが、rssファイルがutf8で記述されているせいか
表示時に日本語の所が\x{30fc}のような文字列になってしまいます。
これをshiftjisで表示させたいのですが、試行錯誤してもうまくいきません。
どなたかご教授いただけませんでしょうか。

#!/usr/bin/perl

BEGIN{
$| = 1;
print "Content-type: text/html\n\n";
open(STDERR, ">&STDOUT");
}

use XML::RSS;
use Data::Dumper;
my $rs...続きを読む

Aベストアンサー

#1さんと同じですが
use encoding 'utf-8', STDOUT => 'Shift_JIS';
を始めにつける

$out_text = Data::Dumper->Dump([$rss]);
$out_text =~ s/\\x{([0-9a-f]{4})}/chr(hex($1))/eg;
print $out_text;
だけでいいと思います。

Qif () { &error("エラー"); }

セレクトoptionフォーム、都道府県の選択で
最上部が「選択してください」から始まります。

都道府県を選べばそのまま住所に転記されるのですが
最上部の「選択してください」のままなら
「選択してください」と転記されてしまいます・・・

if (選択してください) { &error("都道府県を選択して下さい!"); }

こんな感じのエラーを作りたいのですが何か方法はありますか?

Aベストアンサー

はて ? 書かれているとおりでよいのではないですか。

if (入力変数 eq '選択してください') { &error("都道府県を選択して下さい!"); }

なにが問題なのでしょうか。


おすすめ情報