• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:substrの文字列の境界の動作について)

substrの文字列の境界の動作について

このQ&Aのポイント
  • perl5.8を使っています。substrの動作について、以下の動作はperlの仕様どおりでしょうか?以前、どこかのソースで#--1や #--2の場合はundefとなる?のを見た記憶があるのですが、文字列の境界の動作について理解していないのでよろしくお願いいたします。
  • $|=1; use strict; use Data::Dumper; my $str = "0123456789A"; print Dumper( substr($str, 10, 1) ); # $VAR1 = 'A'; print Dumper( substr($str, 11) ); # $VAR1 = ''; # --1 print Dumper( substr($str, 12) ); # substr outside of string at test.pl line ...  # --2 exit;

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

1でも警告がでるはずでは? ということですね。 perldoc -f substr すると以下のような部分が見つかります。 If OFFSET and LENGTH specify a substring that is partly outside the string, only the part within the string is returned. If the substring is beyond either end of the string, substr() returns the undefined value and produces a warning. (略) my $name = 'fred'; substr($name, 4) = 'dy'; # $name is now 'freddy' my $null = substr $name, 6, 2; # returns '' (no warning) my $oops = substr $name, 7; # returns undef, with warning substr($name, 7) = 'gap'; # fatal error beyond either end of the string をどう取るかということになるかと思いますが、 後にある例からすると文字列の尻尾(もしくは頭)までは文字列の範囲とみなされるようですね。

mine_23
質問者

お礼

いつもお世話になります。 #--1の文字前後1つは、なくてもあると解釈(変なのですが)できましたが、 #--2はundefが返らず、エラーとなったことが理解できません。 my $oops = substr $name, 7; # returns undef, with warning と substr($name, 7) = 'gap'; # fatal error の違い(undefとエラー)が???です。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

> #--2はundefが返らず、エラーとなったことが理解できません。 > > my $oops = substr $name, 7; # returns undef, with warning > と > substr($name, 7) = 'gap'; # fatal error > の違い(undefとエラー)が???です。 2がエラーになったのは、substrの戻り値をDumperの引数に使っているからです。 ためしにスクリプトを以下のように変えてみてください。 $|=1; use strict; use warnings; my $str = "0123456789A"; print substr($str, 10, 1); print substr($str, 11); print substr($str, 12); print "done\n"; exit; こんな出力になります: D:\work\script\perl>perl substrtest.pl Asubstr outside of string at substrtest.pl line 9. Use of uninitialized value in print at substrtest.pl line 9. done 余計な警告がひとつ出ていますが、今度はsubstrでfatal error になっていません。 > substr($name, 7) = 'gap'; # fatal error > の違い(undefとエラー)が???です。 こっちですが、前回の回答で省略した部分にこうあります。 When used as an lvalue, specifying a substring that is entirely outside the string is a fatal error. 尻尾(もしくは頭)の空文字列を取るのはいいけれども、そこに対して 代入しようとするとfatal errorですよ。ということです。

関連するQ&A